WMI クラスの取得

取得できるオブジェクトの最初の種類は WMI クラスです。 WMI クラスを取得する場合、実際にはクラス定義を取得します。これは、クラスを完全に記述するプロパティ、修飾子、およびメソッドのリストです。 しかし、クラス定義は基本的にクラス自体です。

PowerShell では、meta_class クラスを使用し、標準クエリを使ってクラス定義を取得します。

PowerShell でクラス定義を取得するには

  • Get-WmiObject は、取得するクラスの名前を含む WHERE 句を指定した、meta_class に対するクエリと共に使用します。

    Get-WmiObject -query "SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'"
    

    Get-WmiObject は、PowerShell によって WMI からクラスとインスタンスの情報を取得するために使用される標準的なコマンドレットです。 meta_class クラスでは、クエリがスキーマ クエリとして定義されます。 meta_class クラスがないと、このクエリから Win32_LogicalDisk のすべてのインスタンスが返されます。 WMI のクエリについて詳しくは、「スキーマ クエリの SELECT ステートメント」を参照してください。

C# で WMI 定義を取得するための現在のプロセスでは、CIMInstance クラスを使用します。

C# でクラス定義を取得するには (Microsoft.Management.Infrastructure)

  1. Microsoft.Management.Infrastructure 名前空間を使用して、指定した名前空間とクラス名を持つ CIMInstance クラスを作成します。

    作成されたクラスにはすべてのクラス情報が含まれますが、インスタンス データは含まれません。

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_LogicalDisk";
    
    CimInstance diskDrive = new CimInstance(className, Namespace);
    
  2. または、PowerShell と同様に、クエリの一部として meta_class タグを使用してクエリを実行することもできます。

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string diskDriveQuery = "SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'";
    
    CimSession mySession = CimSession.Create("localhost");
    IEnumerable<CimInstance> queryInstance = mySession.QueryInstances(Namespace, "WQL", diskDriveQuery);
    

PowerShell と同様に、C# では meta_class クエリを使用してクラス定義を取得します。 または、ManagementClass オブジェクトを作成して、クラス定義に直接アクセスすることもできます。

注意

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

 

C# でクラス定義を取得するには (System.Management)

  1. ManagementObjectSerarcher は、取得するクラスの名前を含む WHERE 句を指定した、meta_class に対するクエリと共に使用できます。

    using System.Management;
    ...
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'");
    ManagementObjectCollection myDiskCollection = searcher.Get();
    

    ManagementObjectSerarcher は、WMI からクラスとインスタンス情報を取得するために .NET によって使用される標準クラスです。 ManagementObjectSerarcher.Get では、スキーマ定義クラスを含む ManagementObjectCollection が返されます。 meta_class クラスでは、クエリがスキーマ クエリとして定義されます。 meta_class クラスがないと、このクエリから Win32_LogicalDisk のすべてのインスタンスが返されます。 WMI のクエリについて詳しくは、「スキーマ クエリの SELECT ステートメント」を参照してください。

  2. または、名前をパスとして持つ新しい ManagementClass オブジェクトを作成して、クラスを取得します。

    using System.Management;
    ...
    ManagementClass objInst = new ManagementClass("Win32_LogicalDisk");
    

VBScript では、特定のインスタンスを取得するのと同様の方法でクラス定義を取得できます。

VBScript でクラス定義を取得するには

  1. SWbemServices.Get を呼び出しますが、クラスのオブジェクト パス内の特定のインスタンスは識別しません。

  2. 次のコード例では、コンピューター上の論理ドライブを記述するクラスのクラス定義を取得します。

    Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
    

    Windows スクリプト ホスト (WSH) では、次の機能もサポートされています。

    <OBJECT id="myLocator" progid="WbemScripting.SWbemLocator"></OBJECT>
    

    Active Server Pages (ASP) では、サーバー側スクリプトで GetObject または CreateObject を使用します。 詳細については、「WMI 用の Active Server ページの作成」を参照してください。

  3. クラスまたはインスタンスを指定することもできます。この場合、返されるオブジェクトは WMI オブジェクト (たとえば、サービス オブジェクトではなく 、Win32_LogicalDisk のインスタンス) です。 VBScript GetObject 関数を使用して、汎用オブジェクト SWbemObject のインスタンスを作成できないことに注意してください。

  4. Microsoft Internet Explorer (IE) で実行されている HTML ページでは、ActiveX コントロールなどの WMI スクリプト オブジェクトがスクリプトを実行しても安全だとマークされていないため、GetObjectCreateObject が失敗する可能性があります。 1 つの例外は SWbemDateTime オブジェクトです。 これらの呼び出しを成功させる唯一の方法は、IE のセキュリティ設定を下げることです。これは推奨されません。

C++ でクラスを取得する場合は、GetObjectIWbemServices バージョンを呼び出します。

C++ でクラス定義を取得するには

  1. クラスの定義を取得するには、IWbemServices::GetObject または IWbemServices::GetObjectAsync メソッドを呼び出します。
  2. 1 つのクラスに複数のクラス定義が含まれる場合があります。これは、通常、複数のクラス プロバイダーが 1 つの名前空間に読み込まれている場合に発生します。 クラスに複数のクラス定義がある場合、WMI により、検出された最初の定義と WBEM_S_DUPLICATE_OBJECTS 状態コードが返されます。

GetObject ではクラス定義が返されるので、インスタンスの作成の最初の手順として一般的に使用されます。 GetObject の使用方法について詳しくは、「C++ を使用したインスタンスの作成と宣言」を参照してください。