调用同步查询
同步查询是一种在查询期间保持对应用程序进程的控制的查询。 同步查询需要一个接口调用,因此比异步调用更简单。 但同步查询可能可以锁定应用程序,以进行大型查询或通过网络进行查询。
以下过程描述了如何使用 PowerShell 发出同步数据查询。
在 PowerShell 中发出同步数据查询
使用 WMI Get-WmiObject cmdlet 和 -query 参数描述对 WMI 的查询。 该 cmdlet 返回一个对象或对象集合,具体取决于有多少对象适合查询。
Get-WmiObject -query "SELECT * FROM Win32_logicalDisk WHERE DeviceID = 'C:'"
以下过程描述了如何使用 C# 发出同步数据查询。
在 C# (Microsoft.Management.Infrastructure) 中发出同步数据查询
使用 CimSession.QueryInstances 向 WMI 描述查询。 此方法返回 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 中发出同步数据查询
使用 SWbemServices.ExecQuery 向 WMI 描述查询。 此方法返回 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++ 中发出同步查询
通过调用 IWbemServices::ExecQuery 向 WMI 描述查询。
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(); }