Share via


Darstellen von Objekten in XML

Die XML-Encoderkomponente in WMI generiert XML-Darstellungen von Objekten.

In C++ können Sie den XML-Encoder mit einem Aufruf der Methode IWbemObjectTextSrc.GetText starten, indem Sie das in XML darzustellende Objekt und das Textformat angeben, das in der Darstellung verwendet werden soll. Weitere Informationen und ein Codebeispiel finden Sie unter So codieren Sie ein Objekt in XML mit C/C++.

Rufen Sie in VBScript oder Visual Basic SWbemObjectEx.GetText auf, um Daten für eine XML-Instanz zu codieren. Weitere Informationen und ein Codebeispiel finden Sie unter So codieren Sie ein Objekt in XML mit VBScript.

In diesem Thema werden die folgenden Abschnitte behandelt:

Codieren eines Objekts mit C oder C++

Im folgenden Verfahren wird beschrieben, wie ein Objekt in XML mit C oder C++ codiert wird.

So codieren Sie ein Objekt in XML mit C oder C++

  1. Richten Sie Ihr Programm für den Zugriff auf WMI-Daten ein.

    Da WMI auf COM-Technologie basiert, müssen Sie die erforderlichen Aufrufe der Funktionen CoInitializeEx und CoInitializeSecurity ausführen, um auf WMI zuzugreifen. Weitere Informationen finden Sie unter Initialisieren von COM für eine WMI-Anwendung.

  2. Erstellen Sie optional ein Objekt IWbemContext, und initialisieren Sie es.

    Sie müssen das Objekt IWbemContext nicht erstellen, es sei denn, Sie müssen den Standardvorgang ändern. Das Kontextobjekt wird vom XML-Encoder verwendet, um die Menge an Informationen zu steuern, die in der XML-Darstellung des Objekts enthalten sind.

    In der folgenden Tabelle sind die Werte aufgeführt, die für dieses Argument angegeben werden können.

    Werttyp Bedeutung
    "LocalOnly" VT_BOOL Bei TRUE sind nur lokal in der Klasse definierte Eigenschaften und Methoden im resultierenden XML vorhanden. Der Standardwert ist FALSE.
    "IncludeQualifiers" VT_BOOL Bei TRUE sind Klasse, Instanz, Eigenschaften und Methodenqualifizierer im resultierenden XML enthalten. Der Standardwert ist FALSE.
    "ExcludeSystemProperties" VT_BOOL Bei TRUE werden WMI-Systemeigenschaften aus der Ausgabe herausgefiltert. Der Standardwert ist FALSE.
    "PathLevel" VT_I4
    0 = Ein <CLASS-> oder <INSTANCE-Element> wird generiert.
    1 = EIN <WERT. DAS NAMEDOBJECT-Element> wird generiert.
    2 = EIN <WERT. DAS OBJECTWITHLOCALPATH-Element> wird generiert.
    3 = EIN <WERT. OBJECTWITHPATH> wird generiert.
    Der Standardwert ist 0 (null).

    Das folgende Codebeispiel zeigt, wie das Kontextobjekt initialisiert wird, um Qualifizierer einzuschließen und Systemeigenschaften auszuschließen.

    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. Rufen Sie einen Verweis auf die Klasse oder Instanz ab, die in XML codiert werden soll.

    Nachdem Sie COM initialisiert haben und mit WMI verbunden sind, rufen Sie GetObject auf, um einen Verweis auf die angegebene Klasse oder Instanz abzurufen. Wenn Sie einen BSTR zum Angeben der Klasse oder Instanz verwendet haben, rufen Sie SysFreeString auf, um den von SysAllocString zugewiesenen Arbeitsspeicher freizugeben.

    Im folgenden Codebeispiel wird ein Verweis auf eine Instanz Win32_LogicalDisk abgerufen.

    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. Erstellen Sie ein Objekt IWbemObjectTextSrc.

    Nachdem Sie über einen Verweis auf ein Objekt verfügen, müssen Sie das Objekt IWbemObjectTextSrc mit einem Aufruf von CoCreateInstance erstellen. Das Objekt IWbemObjectTextSrc wird verwendet, um den tatsächlichen XML-Text zu generieren.

    Das folgende Codebeispiel zeigt, wie Sie ein Objekt IWbemObjectTextSrc erstellen, indem Sie CoCreateInstance aufrufen.

    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. Rufen Sie die Methode IWbemObjectTextSrc.GetText auf, um eine XML-Darstellung eines Objekts abzurufen.

    Nach dem Festlegen des Kontexts für die Darstellung des Objekts, dem Abrufen eines Verweises auf das Objekt und dem Erstellen eines Objekts IWbemObjectTextSrc, können Sie eine XML-Darstellung des angegebenen Objekts generieren, indem Sie die Methode IWbemObjectTextSrc.GetText aufrufen.

    Der folgende C++-Beispielcode generiert eine XML-Darstellung des Objekts, auf das von pClass verwiesen wird. Die XML-Darstellung wird in strText zurückgegeben. Der dritte Parameter von GetText gibt das Textformat an, das für den XML-Code verwendet werden soll, und muss entweder WMI_OBJ_TEXT_CIM_DTD_2_0 (0x1) oder WMI_OBJ_TEXT_WMI_DTD_2_0 (0x2) sein. Weitere Informationen zu diesen Werten finden Sie unter IWbemObjectTextSrc::GetText Parameterwerte.

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

Der folgende C++-Beispielcode enthält alle Schritte in der vorherigen Prozedur und codiert die Klasse Win32_LogicalDisk in XML, einschließlich Klassen-, Eigenschafts- und Methodenqualifizierern und ausschließenden Systemeigenschaften.

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

Codieren eines Objekts mit VBScript

Im folgenden Verfahren wird beschrieben, wie ein Objekt in VBScript codiert wird.

So codieren Sie ein Objekt in XML mit VBScript

  1. Erstellen Sie optional ein Objekt SWbemNamedValueSet und initialisieren Sie es, um die für die XML-Darstellung erforderlichen Kontextwerte festzulegen.

    Das folgende Codebeispiel zeigt, wie die Werte den XML-Encoder anweisen, ein Element <VALUE.OBJECTWITHLOCALPATH> zu generieren, einschließlich aller Qualifizierer und ausschließenden Systemeigenschaften, wenn es die XML-Darstellung des Objekts erstellt.

    ' 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. Rufen Sie eine Instanz des Objekts oder der Klasse ab, die in XML dargestellt werden soll.

    Im folgenden Codebeispiel wird eine Instanz des Objekts abgerufen.

    ' Retrieve the object/class to be represented in XML
    set myObj = GetObject("winmgmts:\\.\root\cimv2:win32_LogicalDisk")
    
  3. Rufen Sie die Methode GetText_ der im vorherigen Schritt erstellten Instanz auf, indem Sie 1 als Parameter verwenden, um das Textformat anzugeben, das CIM DTD Version 2.0 entspricht, oder 2, um das Textformat anzugeben, das WMI DTD Version 2.0 entspricht. Wenn Sie das Objekt SWbemNamedValueSet in Schritt 1 erstellt haben, fügen Sie es als dritten Parameter in die Parameterliste ein.

    Im folgenden Codebeispiel wird veranschaulicht, wie die Methode GetText_ der Instanz aufgerufen wird.

    ' 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. Überprüfen Sie optional, ob es sich bei dem in Schritt 3 generierten XML-Code um wohlgeformtes XML handelt, indem Sie ein XML-DOM-Objekt (Dokumentobjektmodell) erstellen und initialisieren, und laden Sie dann den XML-Text hinein.

    Das folgende Codebeispiel zeigt, wie Sie ein XML-DOM-Objekt erstellen und initialisieren und den XML-Text darin laden.

    ' 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. Ausgabe der XML-Darstellung des Objekts.

    Im folgenden Codebeispiel wird gezeigt, wie Sie wscript verwenden, um den XML-Code auszugeben.

    wscript.echo strText
    

    Wenn Sie sich für die Verwendung von XML-DOM entschieden haben, um zu überprüfen, ob der generierte XML-Code wohlgeformt ist, ersetzen Sie die vorherige Zeile durch Folgendes.

    wscript.echo xml.xml
    

Der folgende VBScript-Beispielcode enthält alle Schritte in der vorherigen Prozedur und codiert die Klasse Win32_LogicalDisk in XML, einschließlich Klassen-, Eigenschafts- und Methodenqualifizierern und ausschließenden Systemeigenschaften.

' 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

Verwenden von WMI