Representar objetos no XML

O componente do codificador XML no WMI gera representações XML de objetos.

No C++, você pode iniciar o codificador XML com uma chamada para o método IWbemObjectTextSrc.GetText, especificando o objeto a ser representado em XML e o formato de texto a ser usado na representação. Para obter mais informações e um exemplo de código, consulte Para codificar um objeto em XML usando C/C++.

No VBScript ou no Visual Basic, para codificar dados para uma instância XML, chame SWbemObjectEx.GetText. Para obter mais informações e um exemplo de código, consulte Para codificar um objeto em XML usando VBScript.

As seções a seguir serão abordadas neste tópico:

Codificar um objeto usando C ou C++

O procedimento a seguir descreve como codificar um objeto em XML usando C ou C++.

Para codificar um objeto em XML usando C ou C++

  1. Configure seu programa para acessar dados do WMI.

    Como o WMI é baseado na tecnologia COM, você deve realizar as chamadas necessárias para as funções CoInitializeEx e CoInitializeSecurity para acessar o WMI. Para obter mais informações, consulte Inicializar parâmetros COM para um aplicativo do WMI.

  2. Opcionalmente, crie um objeto IWbemContext e inicialize-o.

    Você não precisa criar o objeto IWbemContext, a menos que precise alterar a operação padrão. O objeto de contexto é usado pelo codificador XML para controlar a quantidade de informações incluídas na representação XML do objeto.

    A seguinte tabela lista os valores opcionais que podem ser especificados para o objeto contexto.

    Valor/tipo Significado
    "LocalOnly" VT_BOOL Quando TRUE, somente propriedades e métodos definidos localmente na classe estão presentes no XML resultante. O valor padrão é FALSE.
    "IncludeQualifiers" VT_BOOL Quando TRUE, classe, instância, propriedades e qualificadores de método são incluídos no XML resultante. O valor padrão é FALSE.
    "ExcludeSystemProperties" VT_BOOL Quando TRUE, as propriedades do sistema WMI são filtradas para fora da saída. O valor padrão é FALSE.
    "PathLevel" VT_I4
    0 = Um <elemento CLASS> ou <INSTANCE> é gerado.
    1 = UM <VALOR. O elemento NAMEDOBJECT> é gerado.
    2 = UM <VALOR. O elemento OBJECTWITHLOCALPATH> é gerado.
    3 = UM <VALOR. OBJECTWITHPATH> é gerado.
    O padrão é 0 (zero).

    O exemplo de código a seguir mostra como o objeto de contexto é inicializado para incluir qualificadores e excluir propriedades do sistema.

    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. Obtenha uma referência à classe ou instância a ser codificada em XML.

    Depois de inicializar o COM e se conectar ao WMI, chame GetObject para recuperar uma referência à classe ou instância especificada. Se você tiver usado um BSTR para especificar a classe ou instância, chame SysFreeString para liberar a memória alocada por SysAllocString.

    O exemplo de código a seguir recupera uma referência a uma instância de 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. Crie um objeto IWbemObjectTextSrc.

    Depois de fazer referência a um objeto, você deve criar o objeto IWbemObjectTextSrc com uma chamada para CoCreateInstance. O objeto IWbemObjectTextSrc é usado para gerar o texto XML real.

    O exemplo de código a seguir mostra como criar um objeto IWbemObjectTextSrc chamando 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. Invoque o método IWbemObjectTextSrc.GetText para obter uma representação XML de um objeto .

    Depois de definir o contexto para a representação do objeto, obter uma referência ao objeto e criar um objeto IWbemObjectTextSrc, você estará pronto para gerar uma representação XML do objeto especificado chamando o método IWbemObjectTextSrc.GetText.

    O código de exemplo C++ a seguir gera uma representação XML do objeto referenciado por pClass. A representação XML é retornada em strText. O terceiro parâmetro de GetText especifica o formato de texto a ser usado para o XML e deve ser WMI_OBJ_TEXT_CIM_DTD_2_0 (0x1) ou WMI_OBJ_TEXT_WMI_DTD_2_0 (0x2). Para obter mais informações sobre esses valores, consulte os valores do parâmetro 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;
    }
    

O código de exemplo C++ a seguir inclui todas as etapas do procedimento anterior e codifica a classe Win32_LogicalDisk em XML, incluindo qualificadores de classe, propriedade e método e excluindo propriedades do sistema.

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

Codificar um objeto usando VBScript

O procedimento a seguir descreve como codificar um objeto em XML usando VBScript.

Para codificar um objeto em XML usando VBScript

  1. Opcionalmente, crie um objeto SWbemNamedValueSet e inicialize-o para definir os valores de contexto necessários para a representação XML.

    O exemplo de código a seguir mostra como os valores instruem o codificador XML a gerar um elemento <VALUE.OBJECTWITHLOCALPATH>, incluindo todos os qualificadores e excluindo propriedades do sistema quando ele constrói a representação XML do objeto.

    ' 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. Recupere uma instância do objeto ou classe a ser representada em XML.

    O exemplo de código a seguir recupera uma instância do objeto.

    ' Retrieve the object/class to be represented in XML
    set myObj = GetObject("winmgmts:\\.\root\cimv2:win32_LogicalDisk")
    
  3. Invoque o método GetText_ da instância criada na etapa anterior, usando 1 como parâmetro para especificar o formato de texto que corresponde ao CIM DTD versão 2.0 ou 2 para especificar o formato de texto que corresponde ao WMI DTD versão 2.0. Se você tiver criado o objeto SWbemNamedValueSet na Etapa 1, inclua-o na lista de parâmetros como terceiro parâmetro.

    O exemplo de código a seguir mostra como invocar o método GetText_ da instância.

    ' 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. Opcionalmente, valide se o XML gerado na Etapa 3 é um XML bem formado, criando e inicializando um objeto XML Document Object Model (DOM) e carregando o texto XML nele.

    O exemplo de código a seguir mostra como criar e inicializar um objeto DOM XML e carregar o texto XML nele.

    ' 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. Produza a representação XML do objeto.

    O exemplo de código a seguir mostra como usar wscript para produzir o XML.

    wscript.echo strText
    

    Se você optar por usar o DOM XML para verificar se o XML gerado está bem formado, substitua a linha anterior pelo seguinte.

    wscript.echo xml.xml
    

O exemplo de código VBScript a seguir inclui todas as etapas do procedimento anterior e codifica a classe Win32_LogicalDisk em XML, incluindo qualificadores de classe, propriedade e método e excluindo propriedades do sistema.

' 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

Como usar o WMI