WMI インスタンスの取得

インスタンスの取得は、WMI で実行する可能性が高い最も一般的な取得手順の 1 つです。 既存のインスタンスを取得することも、名前が付いていない新規インスタンスを作成することもできます。 既存のインスタンスへの WMI パスは必須パラメータです。 詳細については、「WMI オブジェクトの場所の説明」を参照してください。

Note

インスタンスを指定するときに、プロバイダーが特定のプロパティの値を指定できない場合があります。 プロパティの記述に特に明記されていない限り、空の値から意味を推測することはできません。 これを、NULL 値を持つ文字列と混同しないようにしてください。 この場合、値が設定されます。 空ですが、値 NULL を持っています。

 

PowerShell の Get-WmiObject コマンドレットを呼び出して、インスタンスのローカル コピーを取得します。

PowerShell を使用して WMI クラスのインスタンスを取得する方法

  • -class および -filter パラメータを使用して、特定のインスタンスを取得できます。

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

CimInstance を使用して検索オブジェクトを作成し、それに関連するキー値を入力し、そのオブジェクトを CimSession.GetInstance 呼び出しで検索することで、C# を使用して WMI インスタンスを取得できます。

C# を使用して WMI クラスのインスタンスを取得する方法 (Microsoft.Management.Infrastructure)

  1. Microsoft.Management.Infrastructure 名前空間を使用して、関連するクラス名と名前空間を持つ新しい CimInstance オブジェクトを作成します。

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_LogicalDisk";
    
    CimInstance myDrive = new CimInstance(className, Namespace);
    
  2. 検索するインスタンスのキー プロパティの名前と値を含む CimProperty を作成し、そのプロパティをクラス オブジェクトに追加します。

    myDrive.CimInstanceProperties.Add(CimProperty.Create("DeviceID", "C:", CimFlags.Key));
    
  3. CimSession.GetInstance 呼び出しを使用して WMI からオブジェクトを取得します。

    CimSession mySession = CimSession.Create("localhost");
    CimInstance searchInstance = mySession.GetInstance(Namespace, myDrive);
    

System.Management 名前空間のクラスを使用して、特定の WMI クラス インスタンスを取得することも、WMI クラス インスタンスのコレクションを取得することもできます。

Note

System.Management は、元来 WMI へのアクセスに使用されていた .NET 名前空間でした。しかし、この名前空間の API は一般に、より最しい Microsoft.Management.Infrastructure の対応する API と比較して低速で、拡張性も劣ります。

 

C# を使用して WMI クラスのインスタンスを取得する方法 (System.Management)

  1. ManagementPath パラメータで渡された名前と特定のインスタンス値を使用して、新しい ManagementObject を作成することで、特定のインスタンスのローカル コピーを取得します。 その後、ManagementObject.Get を明示的に呼び出すことで、インスタンス データを取得できます。

    using System.Management;
    ...
    ManagementObject objInst = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
    objInst.Get();
    
  2. または、ManagementObjectSearcher で検索し、返された ManagementObjectCollection を列挙することで、WMI クラスのすべてのインスタンスを取得することもできます。

    using System.Management;
    ...
    ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
    ManagementObjectCollection colDisks = mgmtObjSearcher.Get();
    
    foreach (ManagementObject objDisk in colDisks)
    {
       Console.WriteLine("Device ID : {0}", objDisk["DeviceID"]);
    }
    
    Console.ReadLine();
    

    インスタンスにアクセスすることで、Get メソッドを暗黙的に呼び出すことができます。 詳細については、「WMI インスタンスの一部の取得」を参照してください。

VBScript GetObject メソッドを呼び出して、インスタンスのローカル コピーを取得します。

VBScript を使用して WMI クラスのインスタンスを取得する方法

  • 次の例に示すように、インスタンスのオブジェクト パスを指定して GetObject を呼び出します。

    Set objinst = GetObject("WinMgmts:Win32_LogicalDisk='C:'")
    

    特定のインスタンスを取得するには、オブジェクト パスの一部として名前を指定する必要があります。

C++ では、IWbemServices::GetObject を呼び出します。

C++ を使用して WMI クラスのインスタンスを取得する方法

  • IWbemServices::GetObject または IWbemServices::GetObjectAsync を呼び出して、インスタンスのローカル コピーを取得します。 オブジェクトへの WMI パスを含める必要があります。

    名前が示すように、GetObjectAsync はインスタンスを非同期的に取得するのに対して、GetObject はインスタンスを同期的に取得します。 非同期取得を使用する場合は、IWbemObjectSink インターフェイスを実装する必要があります。