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 IWbemObjectTextSrc.GetText-Methode starten, wobei 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 zum Codieren von Daten für eine XML-Instanz SWbemObjectEx.GetTextauf. Weitere Informationen und ein Codebeispiel finden Sie unter So codieren Sie ein Objekt in XML mithilfe von VBScript.

Die folgenden Abschnitte werden in diesem Thema erläutert:

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 IWbemContext-Objekt, und initialisieren Sie es.

    Sie müssen das IWbemContext-Objekt nur erstellen, wenn Sie den Standardvorgang ändern müssen. 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 optionalen Werte aufgeführt, die für das Kontextobjekt angegeben werden können.

    Wert/Typ Bedeutung
    "" LocalOnly-VT_BOOL True gibt an, dass nur lokal in der Klasse definierte Eigenschaften und Methoden im resultierenden XML vorhanden sind. Der Standardwert ist FALSE.
    "IncludeQualifiers " VT_BOOL Bei TRUEwerden Klassen-, Instanz-, Eigenschaften- und Methodenqualifizierer in das resultierende XML eingeschlossen. Der Standardwert ist FALSE.
    "ExcludeSystemProperties " VT_BOOL Bei TRUEwerden WMI-Systemeigenschaften aus der Ausgabe herausgefiltert. Der Standardwert ist FALSE.
    "" PathLevel-VT_I4
    0 = Eine < KLASSE oder ein Element wird >

    1 = Ein <VALUE.NAMEDOBJECT> Element wird generiert.
    2 = Ein <VALUE.OBJECTWITHLOCALPATH> Element wird generiert.
    3 = A <VALUE.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.
    
    ```C++
    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);
    ```
    
    1. Abrufen eines Verweises auf die Klasse oder Instanz, 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 SysAllocStringbelegten Arbeitsspeicher freizugeben.

      Im folgenden Codebeispiel wird ein Verweis auf eine Win32 _ LogicalDisk-Instanz 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;
      }
      
    2. Erstellen Sie ein IWbemObjectTextSrc-Objekt.

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

      Das folgende Codebeispiel zeigt, wie sie ein IWbemObjectTextSrc-Objekt erstellen, indem Sie CoCreateInstanceaufrufen.

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

      Nachdem Sie den Kontext für die Darstellung des Objekts festgelegt, einen Verweis auf das Objekt erhalten und ein IWbemObjectTextSrc-Objekt erstellt haben, können Sie eine XML-Darstellung des angegebenen Objekts generieren, indem Sie die IWbemObjectTextSrc.GetText-Methode 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 Für XML zu verwendende Textformat an 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 Win32 _ LogicalDisk-Klasse in XML, einschließlich Klassen-, Eigenschafts- und Methodenqualifizierern und ohne 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 XML mithilfe von VBScript codiert wird.

    So codieren Sie ein Objekt in XML mit VBScript

    1. Erstellen Sie optional ein SWbemNamedValueSet-Objekt, und initialisieren Sie es so, dass die für die XML-Darstellung erforderlichen Kontextwerte festgelegt werden.

      Das folgende Codebeispiel zeigt, wie die Werte den XML-Encoder anweisen, einen -Element, einschließlich aller Qualifizierer und Ausschließen von Systemeigenschaften beim Erstellen der XML-Darstellung des Objekts.

      ' 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, das bzw. 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 GetText-Methode der im vorherigen Schritt erstellten Instanz auf. Verwenden Sie dabei 1 als Parameter, 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 SWbemNamedValueSet-Objekt in Schritt 1 erstellt haben, fügen Sie es als dritten Parameter in die Parameterliste ein.

      Das folgende Codebeispiel zeigt, wie die GetText-Methode _ 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 wohlgeformten XML-Code handelt, indem Sie ein XML-Dokumentobjektmodell -Objekt (DOM) erstellen und initialisieren und dann den XML-Text in dieses laden.

      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. Gibt die XML-Darstellung des Objekts aus.

      Im folgenden Codebeispiel wird veranschaulicht, wie wscript zum Ausgeben des XML-Codes verwendet wird.

      wscript.echo strText
      

      Wenn Sie sich für die Verwendung des 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
      

    Das folgende VBScript-Codebeispiel enthält alle Schritte in der vorherigen Prozedur und codiert die Win32 _ LogicalDisk-Klasse in XML, einschließlich Klassen-, Eigenschafts- und Methodenqualifizierern und ohne 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