Поделиться через


Представление объектов в XML

Компонент кодировщика XML в WMI создает XML-представления объектов.

В C++ кодировщик XML можно запустить с помощью вызова метода IWbemObjectTextSrc.GetText , указав объект, который будет представлен в XML, и текстовый формат, используемый в представлении. Дополнительные сведения и пример кода см. в статье Кодирование объекта в XML с помощью C/C++.

В VBScript или Visual Basic для кодирования данных для экземпляра XML вызовите SWbemObjectEx.GetText. Дополнительные сведения и пример кода см. в статье Кодирование объекта в XML с помощью VBScript.

В этом разделе рассматриваются следующие разделы:

Кодирование объекта с помощью C или C++

В следующей процедуре описывается кодирование объекта в XML с помощью C или C++.

Кодирование объекта в XML с помощью C или C++

  1. Настройте программу для доступа к данным WMI.

    Поскольку WMI основан на технологии COM, необходимо выполнить необходимые вызовы функций CoInitializeEx и CoInitializeSecurity для доступа к WMI. Дополнительные сведения см. в разделе Инициализация COM для приложения WMI.

  2. При необходимости создайте объект IWbemContext и инициализируйте его.

    Вам не нужно создавать объект IWbemContext , если не нужно изменить операцию по умолчанию. Объект контекста используется кодировщиком XML для управления объемом информации, включаемой в XML-представление объекта.

    В следующей таблице перечислены необязательные значения, которые можно указать для объекта контекста.

    Значение/тип Значение
    VT_BOOL "LocalOnly" При значении TRUE в результирующем XML-коде присутствуют только свойства и методы, определенные локально в классе . Значение по умолчанию — FALSE.
    VT_BOOL "IncludeQualifiers" При значении TRUE класс, экземпляр, свойства и квалификаторы метода включаются в результирующий XML-код. Значение по умолчанию — FALSE.
    "ExcludeSystemProperties" VT_BOOL При значении TRUE системные свойства WMI отфильтровываются из выходных данных. Значение по умолчанию — FALSE.
    VT_I4 "PathLevel"
    0 = <создается элемент CLASS> или <INSTANCE> .
    1 = ЗНАЧЕНИЕ <. Создается элемент NAMEDOBJECT> .
    2 = A <VALUE. Создается элемент OBJECTWITHLOCALPATH> .
    3 = ЗНАЧЕНИЕ <A. Создается объект 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 .

    После получения ссылки на объект необходимо создать объект IWbemObjectTextSrc с вызовом CoCreateInstance. Объект IWbemObjectTextSrc используется для создания фактического XML-текста.

    В следующем примере кода показано, как создать объект IWbemObjectTextSrc путем вызова CoCreateInstance.

    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 , вы можете создать XML-представление указанного объекта, вызвав метод IWbemObjectTextSrc.GetText .

    Следующий пример кода C++ создает XML-представление объекта, на который ссылается pClass. XML-представление возвращается в strText. Третий параметр GetText указывает текстовый формат, используемый для XML, и должен быть либо WMI_OBJ_TEXT_CIM_DTD_2_0 (0x1) либо WMI_OBJ_TEXT_WMI_DTD_2_0 (0x2). Дополнительные сведения об этих значениях см. в разделе IWbemObjectTextSrc::GetText Parameter Values.

    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++ включает все шаги, описанные в предыдущей процедуре, и кодирует класс Win32_LogicalDisk в XML, включая квалификаторы класса, свойства и метода, а также исключает системные свойства.

// 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

В следующей процедуре описывается кодирование объекта в XML с помощью VBScript.

Кодирование объекта в XML с помощью VBScript

  1. При необходимости создайте объект SWbemNamedValueSet и инициализируйте его, чтобы задать значения контекста, необходимые для xml-представления.

    В следующем примере кода показано, как значения указывают кодировщику XML на создание <ЗНАЧЕНИЯ. ЭЛЕМЕНТ 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 в качестве параметра, чтобы указать текстовый формат, соответствующий DTD CIM версии 2.0, или 2, чтобы указать текстовый формат, соответствующий WMI DTD версии 2.0. Если вы создали объект SWbemNamedValueSet на шаге 1, включите его в список параметров в качестве третьего параметра.

    В следующем примере кода показано, как вызвать метод 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-код, созданный на шаге 3, является XML-файлом правильного формата, создав и инициализировав объект DOM, а затем загрузите в него XML-текст.

    В следующем примере кода показано, как создать и инициализировать объект DOM XML и загрузить в него 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 включает все шаги, описанные в предыдущей процедуре, и кодирует класс Win32_LogicalDisk в XML, включая квалификаторы класса, свойства и метода, а также исключает системные свойства.

' 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