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 Pagesの作成」を参照してください。

  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++ を使用したインスタンスの作成と宣言」を参照してください。