Вызов синхронного запроса
Синхронный запрос — это запрос, который поддерживает контроль над процессом приложения в течение длительности запроса. Синхронный запрос требует одного вызова интерфейса и поэтому является более простым, чем асинхронный вызов. Однако синхронный запрос может заблокировать приложение для больших запросов или запросов по сети.
В следующей процедуре описывается, как выдавать синхронный запрос данных с помощью PowerShell.
Выдача синхронного запроса данных в PowerShell
Опишите ваш запрос к WMI, используя командлет Get-WmiObject и параметр -query. Командлет возвращает один объект или коллекцию объектов в зависимости от того, сколько объектов соответствует запросу.
Get-WmiObject -query "SELECT * FROM Win32_logicalDisk WHERE DeviceID = 'C:'"
В следующей процедуре описывается, как выполнить синхронный запрос данных с помощью C#.
Выдача синхронного запроса данных в C# (Microsoft.Management.Infrastructure)
Описать запрос к 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);
Используйте стандартные методы работы с коллекциями C# для доступа к каждому возвращаемому объекту.
foreach (CimInstance drive in queryInstances) { Console.WriteLine(drive.CimInstanceProperties["DeviceID"]); }
В следующей процедуре описывается, как выполнить синхронный запрос данных с помощью C#.
Выдача синхронного запроса данных в C# (System.Management)
Создайте запрос с объектом ManagementObjectSearcher и извлеките сведения с вызовом ManagementObjectSearcher.Get.
Этот метод возвращает объект ManagementObjectCollection.
using System.Management; ... ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk"); ManagementObjectCollection objCol = mgmtObjSearcher.Get();
Используйте стандартные методы коллекции языка C# для доступа к каждому возвращаемому объекту.
foreach (ManagementObject drive in objCol) { Console.WriteLine(drive["DeviceID"]); }
В следующей процедуре описывается, как выполнить синхронный запрос данных с помощью VBScript.
Выдача синхронного запроса данных в VBScript
Описать запрос к WMI с помощью SWbemServices.ExecQuery. Этот метод возвращает SWbemObjectSet.
GetObject("winmgmts:").ExecQuery _ ("Select * from Win32_Service where State='Stopped'")
Используйте стандартные методы коллекции языка сценариев для доступа к каждому возвращаемому объекту.
for each Service in _ GetObject("winmgmts:").ExecQuery _ ("Select * from Win32_Service where State='Stopped'") WScript.Echo " "& Service.DisplayName & " [", Service.Name, "]" next
В следующей процедуре описывается, как выполнить синхронный запрос данных с помощью C++.
Чтобы выполнить синхронный запрос на C++
Опишите запрос к WMI через вызов IWbemServices::ExecQuery.
Метод ExecQuery принимает строку поиска WQL в качестве параметра, описывающего запрос. WMI выполняет запрос и возвращает указатель интерфейса IEnumWbemClassObject. Через интерфейс IEnumWbemClassObject можно получить доступ к классам или экземплярам, составляющим результирующий набор.
После получения запроса можно перечислить запрос с вызовом 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(); }