Invocar uma consulta síncrona

Uma consulta síncrona é uma consulta que mantém o controle sobre o processo do aplicativo durante a consulta. Uma consulta síncrona requer apenas uma 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 em 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 Get-WmiObject do WMI 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 o C#.

Para emitir uma consulta de dados síncrona no 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 coleção da 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 o C#.

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

  1. Crie a consulta com um objeto ManagementObjectSearcher e recupere as informações com uma chamada para ManagementObjectSearcher.Get.

    Esse método retorna um objeto ManagementObjectCollection.

    using System.Management;
    ...
    ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
    ManagementObjectCollection objCol = mgmtObjSearcher.Get();
    
  2. Use técnicas padrão de coleção da 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 técnicas padrão de coleção da linguagem de script 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 o C++.

Para emitir uma consulta síncrona no 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. Por meio da interface IEnumWbemClassObject, você pode acessar as 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, confira Enumerar o WMI.

    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();
    }