Partilhar via


Invocando uma consulta síncrona

Uma consulta síncrona é uma consulta que mantém o controle sobre o processo do seu aplicativo durante a duração da consulta. Uma consulta síncrona requer uma única chamada de interface e, portanto, é mais simples do que uma chamada assíncrona. No entanto, uma consulta síncrona tem o potencial de bloquear seu aplicativo para consultas grandes ou consultas em uma rede.

O procedimento a seguir descreve como emitir uma consulta de dados síncrona usando o PowerShell.

Para emitir uma consulta de dados síncrona no PowerShell

  • Descreva sua consulta ao WMI usando o cmdlet WMI Get-WmiObject e o parâmetro -query. O cmdlet retorna um único objeto ou uma coleção de objetos, dependendo de quantos objetos se ajustam à consulta.

    Get-WmiObject -query "SELECT * FROM Win32_logicalDisk WHERE DeviceID = 'C:'"
    

O procedimento a seguir descreve como emitir uma consulta de dados síncrona usando C#.

Para emitir uma consulta de dados síncrona em C# (Microsoft.Management.Infrastructure)

  1. Descreva sua consulta ao WMI usando CimSession.QueryInstances. Esse método retorna uma coleção de objetos CimInstance.

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string diskDriveQuery = "SELECT * FROM Win32_LogicalDisk";
    CimSession mySession = CimSession.Create("localhost");
    IEnumerable<CimInstance> queryInstances = mySession.QueryInstances(Namespace, "WQL", diskDriveQuery);
    
  2. Use técnicas padrão de coleta de linguagem C# para acessar cada objeto retornado.

    foreach (CimInstance drive in queryInstances)
    {
       Console.WriteLine(drive.CimInstanceProperties["DeviceID"]);
    }
    

O procedimento a seguir descreve como emitir uma consulta de dados síncrona usando C#.

Para emitir uma consulta de dados síncrona em C# (System.Management)

  1. Faça a consulta com o objeto ManagementObjectSearcher e recupere as informações chamando ManagementObjectSearcher.Get.

    Esse método retorna um ManagementObjectCollection objeto.

    using System.Management;
    ...
    ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
    ManagementObjectCollection objCol = mgmtObjSearcher.Get();
    
  2. Use técnicas padrão de coleta de linguagem C# para acessar cada objeto retornado.

    foreach (ManagementObject drive in objCol)
    {
       Console.WriteLine(drive["DeviceID"]);
    }
    

O procedimento a seguir descreve como emitir uma consulta de dados síncrona usando VBScript.

Para emitir uma consulta de dados síncrona no VBScript

  1. Descreva sua consulta ao WMI usando SWbemServices.ExecQuery. Esse método retorna um SWbemObjectSet.

    GetObject("winmgmts:").ExecQuery _
            ("Select * from Win32_Service where State='Stopped'")
    
  2. Use a linguagem de script padrão a coleção técnicas para acessar cada objeto retornado.

    for each Service in _ 
        GetObject("winmgmts:").ExecQuery _
            ("Select * from Win32_Service where State='Stopped'")
        WScript.Echo "  "& Service.DisplayName & " [", Service.Name, "]"
    next
    

O procedimento a seguir descreve como emitir uma consulta de dados síncrona usando C++.

Para emitir uma consulta síncrona em C++

  1. Descreva sua consulta ao WMI por meio de uma chamada para IWbemServices::ExecQuery.

    O método ExecQuery usa uma cadeia de caracteres de pesquisa WQL como um parâmetro que descreve sua consulta. O WMI executa a consulta e retorna um ponteiro de interface IEnumWbemClassObject. Através da interface IEnumWbemClassObject, pode aceder às classes ou instâncias que compõem o conjunto de resultados.

  2. Depois de receber a consulta, você pode enumerá-la com uma chamada para IEnumWbemClassObject::Next. Para obter mais informações, consulte enumerandoWMI .

    O exemplo de código a seguir requer as seguintes referências e instruções #include para compilar corretamente.

    #include <wbemidl.h>
    #include <iostream>
    using namespace std;
    

    O exemplo de código a seguir descreve como consultar os objetos que representam os usuários e grupos no WMI.

    void ExecQuerySync(IWbemServices *pSvc)
    {
        // Query for all users and groups.
    
        BSTR Language = SysAllocString(L"WQL");
        BSTR Query = SysAllocString(L"SELECT * FROM __Namespace");
    
        // Initialize the IEnumWbemClassObject pointer.
        IEnumWbemClassObject *pEnum = 0;
    
        // Issue the query.
        HRESULT hRes = pSvc->ExecQuery(
            Language,
            Query,
            WBEM_FLAG_FORWARD_ONLY,         // Flags
            0,                              // Context
            &pEnum
            );
    
        SysFreeString(Query);
        SysFreeString(Language);
    
        if (hRes != 0)
        {
            printf("Error\n");
            return;
        }
    
        ULONG uTotal = 0;
    
        // Retrieve the objects in the result set.
        for (;;)
        {
            IWbemClassObject *pObj = 0;
            ULONG uReturned = 0;
    
            hRes = pEnum->Next(
                0,                  // Time out
                1,                  // One object
                &pObj,
                &uReturned
                );
    
            uTotal += uReturned;
    
            if (uReturned == 0)
                break;
    
            // Use the object.
    
            // ...
    
            // Release it.
            // ===========
    
            pObj->Release();    // Release objects not owned.            
        }
    
        // All done.
        pEnum->Release();
    }