Compartir a través de


Representar objetos en XML

El componente codificador XML de WMI genera representaciones XML de objetos.

En C++, puede iniciar el codificador XML con una llamada al método IWbemObjectTextSrc.GetText, especificando el objeto que se va a representar en XML y el formato de texto que se va a usar en la representación. Para más información y un ejemplo de código, consulte Para codificar un objeto en XML mediante C/C++.

En VBScript o Visual Basic, para codificar datos para una instancia XML, llame a SWbemObjectEx.GetText. Para más información y un ejemplo de código, consulte Para codificar un objeto en XML mediante VBScript.

En este tema se describen las secciones siguientes:

Codificación de un objeto mediante C o C++

En el procedimiento siguiente se describe cómo codificar un objeto en XML mediante C o C++.

Para codificar un objeto en XML mediante C o C++

  1. Configure el programa para acceder a los datos de WMI.

    Como WMI se basa en la tecnología COM, debe realizar las llamadas necesarias a las funciones CoInitializeEx y CoInitializeSecurity para acceder a WMI. Para más información, consulte Inicialización de COM para una aplicación WMI.

  2. Opcionalmente, cree un objeto IWbemContext e inicialícelo.

    No es preciso crear el objeto IWbemContext, a menos que se necesite cambiar la operación predeterminada. El codificador XML usa el objeto de contexto para controlar la cantidad de información incluida en la representación XML del objeto.

    En la siguiente tabla se muestran los valores opcionales que se pueden especificar para el objeto de contexto.

    Valor/tipo Significado
    "LocalOnly" VT_BOOL Cuando el valor es TRUE, solo las propiedades y los métodos definidos localmente en la clase están presentes en el XML resultante. El valor predeterminado es FALSE.
    "IncludeQualifiers" VT_BOOL Cuando el valor es TRUE, la clase, la instancia, las propiedades y los calificadores de método se incluyen en el XML resultante. El valor predeterminado es FALSE.
    "ExcludeSystemProperties" VT_BOOL Cuando el valor es TRUE, las propiedades del sistema WMI se filtran y se eliminan de la salida. El valor predeterminado es FALSE.
    "PathLevel" VT_I4
    0 = Se genera un <elemento CLASS> o <INSTANCE> .
    1 = UN <VALOR. Se genera el elemento NAMEDOBJECT> .
    2 = UN <VALOR. Se genera el elemento OBJECTWITHLOCALPATH> .
    3 = UN <VALOR. Se genera OBJECTWITHPATH> .
    El valor predeterminado es cero (0).

    En el código de ejemplo siguiente se muestra cómo se inicializa el objeto de contexto para incluir calificadores y excluir propiedades del 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. Obtenga una referencia a la clase o instancia para codificar en XML.

    Una vez que haya inicializado COM y esté conectado a WMI, llame a GetObject para recuperar una referencia a la clase o instancia especificadas. Si usó un BSTR para especificar la clase o instancia, llame a SysFreeString para liberar la memoria asignada por SysAllocString.

    En el código de ejemplo siguiente se recupera una referencia a una instancia 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. Cree un objeto IWbemObjectTextSrc.

    Después de tener una referencia a un objeto, debe crear el objeto IWbemObjectTextSrc con una llamada a CoCreateInstance. El objeto IWbemObjectTextSrc se usa para generar el texto XML real.

    En el código de ejemplo siguiente se muestra cómo crear un objeto IWbemObjectTextSrc llamando a 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 el método IWbemObjectTextSrc.GetText para obtener una representación XML de un objeto.

    Tras establecer el contexto para la representación del objeto, obtener una referencia al objeto y crear un objeto IWbemObjectTextSrc, estará listo para generar una representación XML del objeto especificado llamando al método IWbemObjectTextSrc.GetText.

    El siguiente código de ejemplo en C++ genera una representación XML del objeto al que hace referencia pClass. La representación XML se devuelve en strText. El tercer parámetro de GetText especifica el formato de texto que se va a usar para el XML y debe ser WMI_OBJ_TEXT_CIM_DTD_2_0 (0x1) o WMI_OBJ_TEXT_WMI_DTD_2_0 (0x2). Para más información sobre estos valores, consulte Valores del 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;
    }
    

El siguiente código de ejemplo en C++ incluye todos los pasos del procedimiento anterior y codifica la clase Win32_LogicalDisk en XML, incluidos la clase, la propiedad y los calificadores de método, y excluidas las propiedades del 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;
}

Codificación de objetos mediante VBScript

En el procedimiento siguiente se describe cómo codificar un objeto en XML mediante VBScript.

Para codificar un objeto en XML mediante VBScript

  1. Opcionalmente, cree un objeto SWbemNamedValueSet e inicialícelo para establecer los valores de contexto necesarios para la representación XML.

    En el siguiente código de ejemplo se muestra la forma en que los valores indican al codificador XML que genere un elemento <VALUE.OBJECTWITHLOCALPATH>, incluidos todos los calificadores y excluidas las propiedades del sistema cuando construye la representación XML del 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 una instancia del objeto o clase que se representa en XML.

    En el siguiente código de ejemplo se recupera una instancia del objeto.

    ' Retrieve the object/class to be represented in XML
    set myObj = GetObject("winmgmts:\\.\root\cimv2:win32_LogicalDisk")
    
  3. Invoque el método GetText_ de la instancia creada en el paso anterior, y use 1 como parámetro para especificar el formato de texto que corresponde a la versión 2.0 de DTD de CIM o 2 para especificar el formato de texto que corresponde a la versión 2.0 de DTD de WMI. Si creó el objeto SWbemNamedValueSet en el paso 1, inclúyalo en la lista de parámetros como tercer parámetro.

    En el siguiente código de ejemplo se muestra cómo invocar el método GetText_ de la instancia.

    ' 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 que el XML generado en el paso 3 tenga el formato XML correcto, para lo que debe crear e inicializar un objeto XML Document Object Model (DOM) y, después, cargue el texto XML en él.

    En el siguiente código de ejemplo se muestra cómo crear e inicializar un objeto DOM de XML y cargar el texto XML en él.

    ' 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. Salida de la representación XML del objeto.

    En el siguiente código ejemplo se muestra cómo usar wscript para generar el XML.

    wscript.echo strText
    

    Si decide usar DOM de XML para comprobar que el XML generado tiene un formato correcto, reemplace la línea anterior por la siguiente.

    wscript.echo xml.xml
    

El siguiente código de ejemplo en VBScript incluye todos los pasos del procedimiento anterior y codifica la clase Win32_LogicalDisk en XML, incluidos la clase, la propiedad y los calificadores de método, y excluidas las propiedades del 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

Uso de WMI