Share via


同期クエリの呼び出し

同期クエリとは、クエリの実行中、アプリケーションのプロセスに対する制御が維持されるクエリです。 同期クエリはインターフェイス呼び出しが 1 回で済むため、非同期呼び出しよりも単純です。 ただし、大規模なクエリまたはネットワーク経由のクエリの場合、同期クエリではアプリケーションがロックされた状態に陥る可能性があります。

PowerShell を使用して同期データ クエリを発行する方法を次の手順で説明します。

PowerShell で同期データ クエリを発行するには

  • WMI Get-WmiObject コマンドレットと -query パラメーターを使用して WMI に対するクエリを記述します。 このコマンドレットは、クエリに適合するオブジェクトの数に応じて、1 つのオブジェクトまたはオブジェクトのコレクションを返します。

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