Поделиться через


Вызов синхронного запроса

Синхронный запрос — это запрос, который сохраняет контроль над процессом приложения на протяжении всего запроса. Для синхронного запроса требуется один вызов интерфейса, поэтому он более прост, чем асинхронный вызов. Однако синхронный запрос может заблокировать приложение для больших запросов или запросов по сети.

В следующей процедуре описывается, как выполнить синхронный запрос данных с помощью PowerShell.

Выполнение синхронного запроса данных в PowerShell

  • Опишите запрос к WMI с помощью командлета WMI Get-WmiObject и параметра -query . Командлет возвращает один объект или коллекцию объектов в зависимости от того, сколько объектов соответствует запросу.

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

В следующей процедуре описывается, как выполнить синхронный запрос данных с помощью C#.

Выполнение синхронного запроса данных в C# (Microsoft.Management.Infrastructure)

  1. Опишите запрос к WMI с помощью CimSession.QueryInstances. Этот метод возвращает коллекцию объектов 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. Используйте стандартные методы сбора данных языка C#, чтобы получить доступ к каждому возвращаемого объекта.

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

В следующей процедуре описывается, как выполнить синхронный запрос данных с помощью C#.

Выполнение синхронного запроса данных в C# (System.Management)

  1. Создайте запрос с объектом ManagementObjectSearcher и получите сведения с помощью вызова ManagementObjectSearcher.Get.

    Этот метод возвращает объект ManagementObjectCollection .

    using System.Management;
    ...
    ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
    ManagementObjectCollection objCol = mgmtObjSearcher.Get();
    
  2. Используйте стандартные методы сбора данных языка C#, чтобы получить доступ к каждому возвращаемого объекта.

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

В следующей процедуре описывается, как выполнить синхронный запрос данных с помощью VBScript.

Выполнение синхронного запроса данных в VBScript

  1. Опишите запрос к WMI с помощью SWbemServices.ExecQuery. Этот метод возвращает SWbemObjectSet.

    GetObject("winmgmts:").ExecQuery _
            ("Select * from Win32_Service where State='Stopped'")
    
  2. Используйте стандартные методы сбора данных языка сценариев для доступа к каждому возвращаемого объекта.

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

В следующей процедуре описывается, как выполнить синхронный запрос данных с помощью C++.

Выполнение синхронного запроса в C++

  1. Опишите запрос к WMI с помощью вызова IWbemServices::ExecQuery.

    Метод ExecQuery принимает строку поиска WQL в качестве параметра, описывающего запрос. WMI выполняет запрос и возвращает указатель интерфейса IEnumWbemClassObject . С помощью интерфейса IEnumWbemClassObject можно получить доступ к классам или экземплярам, составляющим результирующий набор.

  2. После получения запроса можно перечислить запрос с помощью вызова IEnumWbemClassObject::Next. Дополнительные сведения см. в разделе Перечисление WMI.

    В следующем примере кода требуются следующие ссылки и #include инструкции для правильной компиляции.

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

    В следующем примере кода описывается, как запрашивать объекты, представляющие пользователей и группы в инструментарии 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();
    }