WMI インスタンスの一部の取得

部分インスタンスの取得は、WMI がインスタンスのプロパティのサブセットのみを取得する場合です。 たとえば、WMI は Name プロパティと Key プロパティのみを取得できます。 部分インスタンス取得の最も一般的な用途は、複数のプロパティをもつ大規模な列挙です。

PowerShell を使用した WMI インスタンスの一部の取得

Get-WmiObject を使用して、インスタンスの個々のプロパティを取得できます。プロパティ自体を取得し、さまざまな方法で表示できます。 インスタンスの取得と同様に、PowerShell は既定で特定のクラスのすべてのインスタンスを返します。1 つのインスタンスのみを取得する場合は、特定の値を指定する必要があります。

次のコード例では、Win32_LogicalDisk クラスのインスタンスのボリューム シリアル番号を表示します。

(Get-WmiObject -class Win32_logicalDisk).DeviceID

#or

Get-WmiObject -class Win32_LogicalDisk | format-list DeviceID

#or

$myDisk = Get-WmiObject -class Win32_LogicalDisk
$myDisk.DeviceID

C# を使用した WMI インスタンスの一部の取得 (System.Management)

特定のインスタンスの詳細を使用して新しい ManagementObject を作成することで、インスタンスの個々のプロパティを取得できます。 続いて、GetPropertyValue メソッドを使用して、インスタンスの 1 つ以上のプロパティを暗黙的に取得できます。

注意

System.Management は、WMI へのアクセスに使用される元の .NET 名前空間でした。ただし、この名前空間の API は一般に低速であり、より最新の Microsoft.Management.Infrastructure で対応する API に比べてスケーリングも行われません。

次のコード例では、Win32_LogicalDisk クラスのインスタンスのボリューム シリアル番号を表示します。

using System.Management;
...
ManagementObject myDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='C:'");
string myProperty = myDisk.GetPropertyValue("VolumeSerialNumber").ToString();
Console.WriteLine(myProperty);

VBScript を使用した WMI インスタンスの一部の取得

GetObject を使用して、インスタンスの個々のプロパティを取得できます。

次のコード例では、Win32_LogicalDisk クラスのインスタンスのボリューム シリアル番号を表示します。

MsgBox (GetObject("WinMgmts:Win32_LogicalDisk='C:'").VolumeSerialNumber)

C++ を使用した WMI インスタンスの一部の取得

次の手順を使用して、C++ を使用して部分インスタンスの取得を要求します。

C++ を使用して部分インスタンスの取得を要求するには

  1. CoCreateInstance を呼び出して IWbemContext オブジェクトを作成します。

    コンテキスト オブジェクトは、WMI プロバイダーに詳細情報を渡すために WMI が使用するオブジェクトです。 この場合、IWbemContext オブジェクトを使用して、部分インスタンス取得を処理するようにプロバイダーに指示します。

  2. 取得するプロパティを記述する __GET_EXTENSIONS、__GET_EXT_CLIENT_REQUEST、その他の名前付きの値を IWbemContext オブジェクトに追加します。

    次の表に、取得呼び出しで使用されるさまざまな名前付きの値を示します。

    名前付きの値 説明
    __GET_EXTENSIONS
    VARIANT_TRUE に設定された VT_BOOL。 部分インスタンス取得操作が使用されていることを通知するために使用されます。 これにより、コンテキスト オブジェクト全体を列挙することなく、すばやく 1 つのチェックを実行できます。 他の値のいずれかが使用される場合は、この値が存在する必要があります。
    __GET_EXT_PROPERTIES
    取得するプロパティを一覧表示する文字列の SAFEARRAY。 __GET_EXT_KEYS_ONLY と同時に指定することはできません。
    アスタリスク "*" は、__GET_EXT_PROPERTIES のプロパティ名としては無効です。
    __GET_EXT_KEYS_ONLY
    VARIANT_TRUE に設定された VT_BOOL。 返されるオブジェクトにキーのみを指定する必要があることを示します。 __GET_EXT_PROPERTIES と同時に指定することはできません。 代わりに、__GET_EXT_PROPERTIES よりも優先されます。
    __GET_EXT_CLIENT_REQUEST
    VARIANT_TRUE に設定された VT_BOOL。 コンテキスト オブジェクトに値を書き込んだのが呼び出し元であり、別の依存する操作から伝播されなかったことを示します。
  3. pCtx パラメーターを使用して IWbemServices::GetObjectIWbemServices::GetObjectAsyncIWbemServices::CreateInstanceEnum、または IWbemServices::CreateInstanceEnumAsync への呼び出しに IWbemContext コンテキスト オブジェクトを渡します。

    IWbemContext オブジェクトを渡すと、部分インスタンスの取得を許可するようにプロバイダーに指示します。 完全インスタンス取得では、pCtxnull 値に設定します。 プロバイダーが部分インスタンス取得をサポートしていない場合は、エラー メッセージが返されます。

プロバイダーが部分インスタンス操作に準拠できない場合、プロバイダーはコンテキスト オブジェクトを入力しなかったかのように続行するか、または WBEM_E_UNSUPPORTED_PARAMETER を返します。

次の例では、Win32_LogicalDisk の完全なインスタンス取得を実行し、Win32_LogicalDisk.Caption プロパティの部分インスタンス取得を実行する方法について説明します。

#include <stdio.h>
#define _WIN32_DCOM
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
#include <iostream>
using namespace std;
#include <comdef.h>


void main(void)
{
    HRESULT hr;
    _bstr_t bstrNamespace;
    IWbemLocator *pWbemLocator = NULL;
    IWbemServices *pServices = NULL;
    IWbemClassObject *pDrive = NULL;
    

    hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

    hr = CoInitializeSecurity(NULL, -1, NULL, NULL,
                         RPC_C_AUTHN_LEVEL_CONNECT,
                         RPC_C_IMP_LEVEL_IMPERSONATE,
                         NULL, EOAC_NONE, 0);
 
    if (FAILED(hr))
    {
       CoUninitialize();
       cout << "Failed to initialize security. Error code = 0x" 
            << hex << hr << endl;
       return;
    }

    hr = CoCreateInstance(CLSID_WbemLocator, NULL, 
                          CLSCTX_INPROC_SERVER, IID_IWbemLocator, 
                          (void**) &pWbemLocator);
    if( FAILED(hr) ) 
    {
        CoUninitialize();
        printf("failed CoCreateInstance\n");
        return;
    }
    
    bstrNamespace = L"root\\cimv2";
    hr = pWbemLocator->ConnectServer(bstrNamespace, 
              NULL, NULL, NULL, 0, NULL, NULL, &pServices);
    if( FAILED(hr) ) 
    {
        pWbemLocator->Release();
        CoUninitialize();
        printf("failed ConnectServer\n");
        return;
    }
    pWbemLocator->Release();
    printf("Successfully connected to namespace.\n");

    
    BSTR bstrPath = 
         SysAllocString(L"Win32_LogicalDisk.DeviceID=\"C:\"");
   // *******************************************************//
   // Perform a full-instance retrieval. 
   // *******************************************************//
    hr = pServices->GetObject(bstrPath,
                              0,0, &pDrive, 0);
    if( FAILED(hr) )
    { 
        pServices->Release();
        CoUninitialize();
        printf("failed GetObject\n");
        return;
    }    
    // Display the object
    BSTR  bstrDriveObj;
    hr = pDrive->GetObjectText(0, &bstrDriveObj);
    printf("%S\n\n", bstrDriveObj);

    pDrive->Release();
    pDrive = NULL;

   // *****************************************************//
   // Perform a partial-instance retrieval. 
   // *****************************************************//
    
    IWbemContext  *pctxDrive; // Create context object
    hr = CoCreateInstance(CLSID_WbemContext, NULL, 
                          CLSCTX_INPROC_SERVER, IID_IWbemContext, 
                          (void**) &pctxDrive);
    if (FAILED(hr))
    {
        pServices->Release();
        pDrive->Release();    
        CoUninitialize();
        printf("create instance failed for context object.\n");
        return;
    }
    
    VARIANT  vExtensions;
    VARIANT  vClient;
    VARIANT  vPropertyList;
    VARIANT  vProperty;
    SAFEARRAY  *psaProperties;
    SAFEARRAYBOUND saBounds;
    LONG  lArrayIndex = 0;
    
    // Add named values to the context object. 
    VariantInit(&vExtensions);
    V_VT(&vExtensions) = VT_BOOL;
    V_BOOL(&vExtensions) = VARIANT_TRUE;
    hr = pctxDrive->SetValue(_bstr_t(L"__GET_EXTENSIONS"), 
        0, &vExtensions);
    VariantClear(&vExtensions);

    VariantInit(&vClient);
    V_VT(&vClient) = VT_BOOL;
    V_BOOL(&vClient) = VARIANT_TRUE;
    hr = pctxDrive->SetValue(_bstr_t(L"__GET_EXT_CLIENT_REQUEST"), 
       0, &vClient);
    VariantClear(&vClient);
    // Create an array of properties to return.
    saBounds.cElements = 1;
    saBounds.lLbound = 0;
    psaProperties = SafeArrayCreate(VT_BSTR, 1, &saBounds);

    // Add the Caption property to the array.
    VariantInit(&vProperty);
    V_VT(&vProperty) = VT_BSTR;
    V_BSTR(&vProperty) = _bstr_t(L"Caption");
    SafeArrayPutElement(psaProperties, &lArrayIndex, 
       V_BSTR(&vProperty));
    VariantClear(&vProperty);
    
    VariantInit(&vPropertyList);
    V_VT(&vPropertyList) = VT_ARRAY | VT_BSTR;
    V_ARRAY(&vPropertyList) = psaProperties;
    // Put the array in the named value __GET_EXT_PROPERTIES.
    hr = pctxDrive->SetValue(_bstr_t(L"__GET_EXT_PROPERTIES"), 
        0, &vPropertyList);
    VariantClear(&vPropertyList);
    SafeArrayDestroy(psaProperties);

    // Pass the context object as the pCtx parameter of GetObject.
    hr = pServices->GetObject(bstrPath, 0, pctxDrive, &pDrive, 0);
    if( FAILED(hr) )
    { 
        pServices->Release();
        CoUninitialize();
        printf("failed property GetObject\n");
        return;
    }    
    // Display the object
    hr = pDrive->GetObjectText(0, &bstrDriveObj);
    printf("%S\n\n", bstrDriveObj);

    SysFreeString(bstrPath);

    VARIANT vFileSystem;
    // Attempt to get a property that was not requested.
    // The following should return a NULL property if
    // the partial-instance retrieval succeeded.

    hr = pDrive->Get(_bstr_t(L"FileSystem"), 0,
                       &vFileSystem, NULL, NULL);

    if( FAILED(hr) )
    { 
        pServices->Release();
        pDrive->Release();    
        CoUninitialize();
        printf("failed get for file system\n");
        return;
    }    
 
    if (V_VT(&vFileSystem) == VT_NULL)
        printf("file system variable is null - expected\n");
    else
        printf("FileSystem = %S\n", V_BSTR(&vFileSystem));
    
    VariantClear(&vFileSystem);

    pDrive->Release();    
    pctxDrive->Release();
    pServices->Release();
    pServices = NULL;    // MUST be set to NULL
    CoUninitialize();
    return;  // -- program successfully completed
};

実行すると、前のコード例では次の情報が書き込まれます。 最初のオブジェクトの説明は、完全なインスタンス取得からの説明です。 2 番目のオブジェクトの説明は、部分インスタンスの取得からの説明です。 最後のセクションでは、元の GetObject 呼び出しで要求されなかったプロパティを要求した場合に null 値を受け取ることを示しています。

Successfully connected to namespace

instance of Win32_LogicalDisk
{
        Caption = "C:";
        Compressed = FALSE;
        CreationClassName = "Win32_LogicalDisk";
        Description = "Local Fixed Disk";
        DeviceID = "C:";
        DriveType = 3;
        FileSystem = "NTFS";
        FreeSpace = "3085668352";
        MaximumComponentLength = 255;
        MediaType = 12;
        Name = "C:";
        Size = "4581445632";
        SupportsFileBasedCompression = TRUE;
        SystemCreationClassName = "Win32_ComputerSystem";
        SystemName = "TITUS";
        VolumeName = "titus-c";
        VolumeSerialNumber = "7CB4B90E";
};

instance of Win32_LogicalDisk
{
        Caption = "C:";
        CreationClassName = "Win32_LogicalDisk";
        Description = "Local Fixed Disk";
        DeviceID = "C:";
        DriveType = 3;
        MediaType = 12;
        Name = "C:";
        SystemCreationClassName = "Win32_ComputerSystem";
        SystemName = "MySystem";
};

次の出力が上記のコード例によって生成されます。

file system variable is null - expected
Press any key to continue