XML でのオブジェクトの表現

WMI の XML エンコーダー コンポーネントは、オブジェクトの XML 表現を生成します。

C++ では、XML で表されるオブジェクトと、表現で使用するテキスト形式を指定して、IWbemObjectTextSrc.GetText メソッドを呼び出して XML エンコーダーを開始できます。 詳細とコード例については、「C または C++ を使用して XML でオブジェクトをエンコードするには」を参照してください。

VBScript または Visual Basic で、XML インスタンスのデータをエンコードするには、SWbemObjectEx.GetText を呼び出します。 詳細とコード例については、「VBScript を使用して XML でオブジェクトをエンコードするには」を参照してください。

このトピックでは、以下のセクションについて説明します。

C または C++ を使用してオブジェクトをエンコードする

次の手順では、C または C++ を使用して XML でオブジェクトをエンコードする方法について説明します。

C または C++ を使用して XML でオブジェクトをエンコードするには

  1. WMI データにアクセスするようにプログラムを設定します。

    WMI は COM テクノロジに基づいているため、WMI にアクセスするには、CoInitializeEx および CoInitializeSecurity 関数の必要な呼び出しを実行する必要があります。 詳細については、「WMI アプリケーションの COM の初期化」を参照してください。

  2. 必要に応じて、IWbemContext オブジェクトを作成して初期化します。

    既定の操作を変更する必要がない限り、IWbemContext オブジェクトを作成する必要はありません。 コンテキスト オブジェクトは、オブジェクトの XML 表現に含まれる情報の量を制御するために XML エンコーダーによって使用されます。

    次の表は、コンテキスト オブジェクトに対して指定できる省略可能な値の一覧を示しています。

    値/型 意味
    "LocalOnly" VT_BOOL TRUE の場合、結果の XML には、クラスでローカルに定義されているプロパティとメソッドのみが存在します。 既定値は FALSE です。
    "IncludeQualifiers" VT_BOOL TRUE の場合、結果の XML には、クラス、インスタンス、プロパティ、メソッドの修飾子が含まれます。 既定値は FALSE です。
    "ExcludeSystemProperties" VT_BOOL TRUE の場合、WMI システム プロパティは出力から除外されます。 既定値は FALSE です。
    "PathLevel" VT_I4
    0 = <CLASS> 要素または <INSTANCE> 要素が生成されます。
    1 = <VALUE。NAMEDOBJECT> 要素が生成されます。
    2 = <VALUE。OBJECTWITHLOCALPATH> 要素が生成されます。
    3 = <VALUE。OBJECTWITHPATH> が生成されます。
    既定値は 0 (ゼロ) です。

    次のコード例は、修飾子を含めてシステム プロパティを除外するためにコンテキスト オブジェクトを初期化する方法を示しています。

    VARIANT vValue;
    IWbemContext *pContext = NULL;
    HRESULT hr = CoCreateInstance (CLSID_WbemContext, 
                           NULL, 
                           CLSCTX_INPROC_SERVER,
                           IID_IWbemContext, 
                           (void**) &pContext);
    if (FAILED(hr))
    {
      printf("Create context failed with %x\n", hr);
      return hr;
    }
    
    // Generate a <VALUE.OBJECTWITHLOCALPATH> element
    VariantInit(&vValue);
    vValue.vt = VT_I4;
    vValue.lVal = 2;
    pContext->SetValue(L"PathLevel", 0, &vValue);
    VariantClear(&vValue);
    
    // Include qualifiers
    VariantInit(&vValue);
    vValue.vt = VT_BOOL;
    vValue.boolVal = VARIANT_TRUE;
    pContext->SetValue(L"IncludeQualifiers", 0, &vValue);
    VariantClear(&vValue);
    
    // Exclude system properties
    VariantInit(&vValue);
    vValue.vt = VT_BOOL;
    vValue.boolVal = VARIANT_TRUE;
    pContext->SetValue(L"ExcludeSystemProperties", 0, &vValue);
    VariantClear(&vValue);
    
  3. XML でエンコードするクラスまたはインスタンスへの参照を取得します。

    COM を初期化し、WMI に接続したら、GetObject を呼び出して、指定したクラスまたはインスタンスへの参照を取得します。 BSTR を使用してクラスまたはインスタンスを指定した場合は、SysFreeString を呼び出して、SysAllocString によって割り当てられたメモリを解放します。

    次のコード例では、Win32_LogicalDisk インスタンスへの参照を取得します。

    HRESULT hr = NULL;
    IWbemClassObject *pClass = NULL;
    BSTR strObj = SysAllocString(L"Win32_LogicalDisk");
    
    hr = pConnection->GetObject(strObj, 
                                0, 
                                NULL, 
                                &pClass, 
                                NULL);
    
    SysFreeString(strObj);
    if (FAILED(hr))
    {
      printf("GetObject failed with %x\n",hr)
      return hr;
    }
    
  4. IWbemObjectTextSrc オブジェクトを作成します。

    オブジェクトへの参照を取得したら、CoCreateInstance を呼び出して IWbemObjectTextSrc オブジェクトを作成する必要があります。 IWbemObjectTextSrc オブジェクトは、実際の XML テキストを生成するために使用されます。

    次のコード例は、CoCreateInstance を呼び出して IWbemObjectTextSrc オブジェクトを作成する方法を示しています。

    HRESULT hr = NULL;
    IWbemObjectTextSrc *pSrc = NULL;
    
    hr = CoCreateInstance (CLSID_WbemObjectTextSrc, 
                           NULL,
                           CLSCTX_INPROC_SERVER,
                           IID_IWbemObjectTextSrc, 
                           (void**) &pSrc);
    
    if (FAILED(hr))
    {
        printf("CoCreateInstance of IWbemObjectTextSrc failed %x\n",hr);
        return hr;
    }
    
  5. IWbemObjectTextSrc.GetText メソッドを呼び出して、オブジェクトの XML 表現を取得します。

    オブジェクトの表現のコンテキストを設定し、オブジェクトへの参照を取得して、IWbemObjectTextSrc オブジェクトを作成すると、IWbemObjectTextSrc.GetText メソッドを呼び出して、指定したオブジェクトの XML 表現を生成する準備ができています。

    次の C++ コード例では、pClass によって参照されるオブジェクトの XML 表現が生成されます。 XML 表現は strText で返されます。 GetText の 3 番目のパラメーターは、XML に使用するテキスト形式を指定するもので、WMI_OBJ_TEXT_CIM_DTD_2_0 (0x1) または WMI_OBJ_TEXT_WMI_DTD_2_0 (0x2) である必要があります。 これらの値の詳細については、IWbemObjectTextSrc::GetText のパラメーター値を参照してください。

    HRESULT hr = NULL;
    BSTR strText = NULL;
    hr = pSrc->GetText(0, 
                       pClass, 
                       WMI_OBJ_TEXT_CIM_DTD_2_0,
                       pContext, 
                       &strText);
    
    // Perform a task with strText
    SysFreeString(strText);
    
    if (FAILED(hr))
    {
      printf("GetText failed with %x\n", hr);
      return hr;
    }
    

次の C++ コード例には、前の手順のすべてのステップが含まれており、クラス、プロパティ、メソッドの修飾子を含め、システム プロパティを除外して、XML で Win32_LogicalDisk クラスをエンコードします。

// The following #define statement is needed so that 
// the proper values are loaded by the #include files.
#define _WIN32_WINNT 0x0500

#include <stdio.h>
#include <wbemcli.h>
#pragma comment(lib, "wbemuuid.lib")

// Initialize the context object
// ---------------------------------------------
void FillUpContext(IWbemContext *pContext)
{
  VARIANT vValue;

  // IncludeQualifiers
  VariantInit(&vValue);
  vValue.vt = VT_BOOL;
  vValue.boolVal = VARIANT_FALSE;
  pContext->SetValue(L"IncludeQualifiers", 0, &vValue);
  VariantClear(&vValue);

  VariantInit(&vValue);
  vValue.vt = VT_I4;
  vValue.lVal = 0;
  pContext->SetValue(L"PathLevel", 0, &vValue);
  VariantClear(&vValue);

  // ExcludeSystemProperties
  VariantInit(&vValue);
  vValue.vt = VT_BOOL;
  vValue.boolVal = VARIANT_TRUE;
  pContext->SetValue(L"ExcludeSystemProperties", 0, &vValue);
  VariantClear(&vValue);
}

// Main method ... drives the program
// ---------------------------------------------
int _cdecl main(int argc, char * argv[])
{
  BSTR strNs = NULL;
  BSTR strObj = NULL;
  BSTR strText = NULL;

  if(FAILED(CoInitialize(NULL)))
    return 1;
  HRESULT hr = E_FAIL;
  IWbemObjectTextSrc *pSrc = NULL;

  IWbemLocator *pL = NULL;
  if(SUCCEEDED(hr = CoCreateInstance (CLSID_WbemLocator, 
                                      NULL, 
                                      CLSCTX_INPROC_SERVER,
                                      IID_IWbemLocator, 
                                      (void**) &pL)))
  {
    // Create a context object
    IWbemContext *pContext = NULL;
    if(SUCCEEDED(hr = CoCreateInstance (CLSID_WbemContext, 
                                        NULL, 
                                        CLSCTX_INPROC_SERVER,
                                        IID_IWbemContext, 
                                        (void**) &pContext)))
    {
      FillUpContext(pContext);
      IWbemServices *pConnection = NULL;
      strNs = SysAllocString(L"root\\cimv2");
      strText = NULL;
      if(SUCCEEDED(hr = pL->ConnectServer(strNs, 
                                          NULL, 
                                          NULL, 
                                          NULL, 
                                          0, 
                                          NULL, 
                                          NULL, 
                                          &pConnection)))
      {
        IWbemClassObject *pClass = NULL;
        strObj = SysAllocString(L"Win32_LogicalDisk");

        if(SUCCEEDED(hr = CoCreateInstance (CLSID_WbemObjectTextSrc, 
                                            NULL,
                                            CLSCTX_INPROC_SERVER,
                                            IID_IWbemObjectTextSrc, 
                                            (void**) &pSrc)))
        {
          // Test for GetObject
          if(SUCCEEDED(hr = pConnection->GetObject(strObj, 
                                                   0, 
                                                   NULL, 
                                                   &pClass, 
                                                   NULL)))
          {
            if(SUCCEEDED(hr = pSrc->GetText(0, 
                                            pClass, 
                                            WMI_OBJ_TEXT_CIM_DTD_2_0,
                                            pContext, 
                                            &strText)))
            {
              printf("GETOBJECT SUCCEEDED\n");
              printf("==========================================\n");
              wprintf(strText);
              pContext->Release();
              pClass->Release();
            }
            else
            {
              printf("GetText failed with %x\n", hr);
              // Free up the object
              pContext->Release();
              pClass->Release();
            }
          }
          else
            printf("GetObject failed with %x\n", hr);
        }
        else
          printf("CoCreateInstance on WbemObjectTextSrc failed with %x\n", hr);
      }
      else
        printf("ConnectServer on root\\cimv2 failed with %x\n", hr);
    }
    else
      printf("CoCreateInstance on Context failed with %x\n", hr);
  }
  else
    printf("CoCreateInstance on Locator failed with %x\n", hr);

// Clean up memory
  if (strNs != NULL)
    SysFreeString(strNs);
  if (strObj != NULL)
    SysFreeString(strObj);
  if (strText != NULL)
    SysFreeString(strText);
  if (pSrc != NULL)
    pSrc->Release();
  if (pL != NULL)
    pL->Release();
  return 0;
}

VBScript を使用してオブジェクトをエンコードする

次の手順では、VBScript を使用して XML でオブジェクトをエンコードする方法について説明します。

VBScript を使用して XML でオブジェクトをエンコードするには

  1. 必要に応じて、SWbemNamedValueSet オブジェクトを作成し、XML 表現に必要なコンテキスト値を設定するように初期化します。

    次のコード例は、オブジェクトの XML 表現を構築するときにすべての修飾子を含め、システム プロパティを除外して <VALUE.OBJECTWITHLOCALPATH> 要素を生成するように、値で XML エンコーダーに指示する方法を示しています。

    ' Create an optional SWbemNamedValueSet object
    set context = CreateObject("wbemscripting.SWbemNamedValueSet")
    
    ' Initialize the value set object to set the context
    ' Generate a <VALUE.OBJECTWITHLOCALPATH> element
    context.add "PathLevel", 2 
    context.add "IncludeQualifiers", true 
    context.add "ExcludeSystemProperties", true '
    
  2. XML で表すオブジェクトまたはクラスのインスタンスを取得します。

    次のコード例では、オブジェクトのインスタンスを取得します。

    ' Retrieve the object/class to be represented in XML
    set myObj = GetObject("winmgmts:\\.\root\cimv2:win32_LogicalDisk")
    
  3. 前のステップで作成したインスタンスの GetText_ メソッドを呼び出します。パラメーターとして 1 を使用して CIM DTD バージョン 2.0 に対応するテキスト形式を指定するか、2 を使用して WMI DTD バージョン 2.0 に対応するテキスト形式を指定します。 ステップ 1 で SWbemNamedValueSet オブジェクトを作成した場合は、それを 3 番目のパラメーターとしてパラメーター リストに含めます。

    次のコード例は、インスタンスの GetText_ メソッドを呼び出す方法を示しています。

    ' Get the XML representation of the object
    strText = myObj.GetText_(2,,context)
    
    ' If you have not used a SWbemNamedValueSet object
    ' enter the following line.
    strText = myObj.GetText_(2)
    
  4. 必要に応じて、XML ドキュメント オブジェクト モデル (DOM) オブジェクトを作成して初期化し、XML テキストをそこに読み込むことで、ステップ 3 で生成された XML が整形式の XML であることを検証します。

    次のコード例は、XML DOM オブジェクトを作成して初期化し、そこに XML テキストを読み込む方法を示しています。

    ' Create an XMLDOM object
    set xml = CreateObject("Microsoft.xmldom")
    
    ' Initialize the XMLDOM object so results are returned synchronously
    xml.async = false
    
    ' Load the XML into the XMLDOM object
    xml.loadxml strText
    
  5. オブジェクトの XML 表現を出力します。

    次のコード例は、wscript を使用して XML を出力する方法を示しています。

    wscript.echo strText
    

    生成された XML が整形式であることを確認するために XML DOM を使用する場合は、前の行を次で置き換えます。

    wscript.echo xml.xml
    

次の VBScript コード例には、前の手順のすべてのステップが含まれており、クラス、プロパティ、メソッドの修飾子を含め、システム プロパティを除外して、XML で Win32_LogicalDisk クラスをエンコードします。

' Create optional SWbemNamedValueSet object
set context = CreateObject("Wbemscripting.SWbemNamedValueSet")

' Initialize the context object
context.add "PathLevel", 2
context.add "IncludeQualifiers", true
context.add "ExcludeSystemProperties", true

' Retrieve the object/class to be represented in XML
set myObj = GetObject("winmgmts:\\.\root\cimv2:Win32_LogicalDisk")

' Get the XML representation of the object
strText = myObj.GetText_(2,,context)
' If you have not used a SWbemNamedValueSet object 
'   use the following line
'   strText = myObj.GetText(2)

' Print the XML representation
wscript.echo strText

' If you choose to use the XML DOM to verify 
'   that the XML generated is well-formed, replace the last
'   line in the above code example with the following lines:

' Create an XMLDOM object
set xml = CreateObject("Microsoft.xmldom")

' Initialize the XMLDOM object so results are 
'   returned synchronously
xml.async = false

' Load the XML into the XMLDOM object
xml.loadxml strText

' Print the XML representation
wscript.echo xml.xml

WMI の使用