叫用同步查詢

同步查詢是一種查詢,可維護應用程式在查詢期間之程式的控制權。 同步查詢需要單一介面呼叫,因此比非同步呼叫更為簡單。 不過,同步查詢可能會鎖定您的應用程式,以便透過網路進行大型查詢或查詢。

下列程式說明如何使用 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();
    }