다음을 통해 공유


XML의 개체 표현

WMI의 XML 인코더 구성 요소는 개체의 XML 표현을 생성합니다.

C++에서는 IWbemObjectTextSrc.GetText 메서드를 호출하여 XML로 나타낼 개체와 표현에 사용할 텍스트 형식을 지정하여 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에 액세스하려면 CoInitializeExCoInitializeSecurity 함수에 대한 필수 호출을 수행해야 합니다. 자세한 내용은 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 = 값입니다 <. NAMEDOBJECT> 요소가 생성됩니다.
    2 = 값입니다 <. OBJECTWITHLOCALPATH> 요소가 생성됩니다.
    3 = 값입니다 <. 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의 세 번째 매개 변수는 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 개체를 만든 경우 매개 변수 목록에 이 개체를 세 번째 매개 변수로 포함합니다.

    다음 코드 예제는 인스턴스의 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 DOM을 사용하여 생성된 XML이 올바른 형식인지 확인하도록 선택한 경우 이전 줄을 다음으로 바꿉니다.

    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 사용