调用同步查询

同步查询是一种在查询期间保持对应用程序进程的控制的查询。 同步查询需要一个接口调用,因此比异步调用更简单。 但同步查询可能可以锁定应用程序,以进行大型查询或通过网络进行查询。

以下过程描述了如何使用 PowerShell 发出同步数据查询。

在 PowerShell 中发出同步数据查询

  • 使用 WMI Get-WmiObject cmdlet 和 -query 参数描述对 WMI 的查询。 该 cmdlet 返回一个对象或对象集合,具体取决于有多少对象适合查询。

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

以下过程描述了如何使用 C# 发出同步数据查询。

在 C# (Microsoft.Management.Infrastructure) 中发出同步数据查询

  1. 使用 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);
    
  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. 使用 SWbemServices.ExecQuery 向 WMI 描述查询。 此方法返回 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. 通过调用 IWbemServices::ExecQuery 向 WMI 描述查询。

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