다음을 통해 공유


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 기술을 기반으로 하므로 CoInitializeEx에 대한 필수 호출을 수행하여 WMI에 액세스하려면 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 = <값입니다. 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. 1을 매개 변수로 사용하여 CIM DTD 버전 2.0에 해당하는 텍스트 형식을 지정하거나 2를 사용하여 이전 단계에서 만든 인스턴스의 GetText_ 메서드를 호출하여 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. 필요에 따라 DOM(XML 문서 개체 모델) 개체를 만들고 초기화한 다음 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를 사용하여