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


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

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

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

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

  • Опишите ваш запрос к 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();
    }