Partager via


Représentation d’objets en XML

Le composant encodeur XML de WMI génère des représentations XML des objets.

En C++, vous pouvez démarrer l’encodeur XML en appelant la méthode IWbemObjectTextSrc.GetText, en spécifiant l’objet à représenter en XML ainsi que le format de texte à utiliser dans la représentation. Pour plus d’informations et pour obtenir un exemple de code, consultez Pour encoder un objet au format XML en C/C++.

En VBScript ou Visual Basic, pour encoder les données d’une instance XML, appelez SWbemObjectEx.GetText. Pour plus d’informations et pour obtenir un exemple de code, consultez Pour encoder un objet au format XML en VBScript.

Les sections suivantes sont traitées dans cette rubrique :

Encoder un objet en C ou C++

La procédure suivante explique comment encoder un objet au format XML en C ou C++.

Pour encoder un objet au format XML en C ou C++

  1. Configurez votre programme pour accéder aux données WMI.

    Dans la mesure où WMI est basé sur la technologie COM, vous devez effectuer les appels nécessaires aux fonctions CoInitializeEx et CoInitializeSecurity pour accéder à WMI. Pour plus d’informations, consultez Initialisation de COM pour une application WMI.

  2. Créez éventuellement un objet IWbemContext, puis initialisez-le.

    Vous n’avez pas besoin de créer l’objet IWbemContext, sauf si vous devez changer l’opération par défaut. L’objet de contexte est utilisé par l’encodeur XML pour contrôler la quantité d’informations incluses dans la représentation XML de l’objet.

    Le tableau suivant liste les valeurs facultatives qui peuvent être spécifiées pour l’objet de contexte.

    Valeur/type Signification
    "LocalOnly" VT_BOOL Quand la valeur est TRUE, seules les propriétés et les méthodes définies localement dans la classe sont présentes dans le code XML résultant. La valeur par défaut est FALSE.
    "IncludeQualifiers" VT_BOOL Quand la valeur est TRUE, les qualificateurs de classe, d’instance, de propriété et de méthode sont inclus dans le code XML résultant. La valeur par défaut est FALSE.
    "ExcludeSystemProperties" VT_BOOL Quand la valeur est TRUE, les propriétés système WMI sont filtrées dans la sortie. La valeur par défaut est FALSE.
    "PathLevel" VT_I4
    0 = Un <élément CLASS> ou <INSTANCE> est généré.
    1 = VALEUR <. L’élément NAMEDOBJECT> est généré.
    2 = VALEUR <. L’élément OBJECTWITHLOCALPATH> est généré.
    3 = VALEUR <. OBJECTWITHPATH> est généré.
    La valeur par défaut est 0 (zéro).

    L’exemple de code suivant montre comment l’objet de contexte est initialisé pour inclure les qualificateurs et exclure les propriétés système.

    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. Obtenez une référence à la classe ou à l’instance à encoder au format XML.

    Une fois que vous avez initialisé COM et que vous êtes connecté à WMI, appelez GetObject pour récupérer une référence à la classe ou à l’instance spécifiée. Si vous avez utilisé un BSTR pour spécifier la classe ou l’instance, appelez SysFreeString pour libérer la mémoire allouée par SysAllocString.

    L’exemple de code suivant récupère une référence à une instance 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. Créez un objet IWbemObjectTextSrc.

    Une fois que vous disposez d’une référence à un objet, vous devez créer l’objet IWbemObjectTextSrc en appelant CoCreateInstance. L’objet IWbemObjectTextSrc est utilisé pour générer le texte XML réel.

    L’exemple de code suivant montre comment créer un objet IWbemObjectTextSrc en appelant 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. Appelez la méthode IWbemObjectTextSrc.GetText pour obtenir une représentation XML d’un objet.

    Une fois que vous avez défini le contexte de la représentation de l’objet, obtenu une référence à l’objet et créé un objet IWbemObjectTextSrc, vous êtes prêt à générer une représentation XML de l’objet spécifié en appelant la méthode IWbemObjectTextSrc.GetText.

    L’exemple de code C++ suivant génère une représentation XML de l’objet référencé par pClass. La représentation XML est retournée dans strText. Le troisième paramètre de GetText spécifie le format de texte à utiliser pour le code XML. Il doit être WMI_OBJ_TEXT_CIM_DTD_2_0 (0x1) ou WMI_OBJ_TEXT_WMI_DTD_2_0 (0x2). Pour plus d’informations sur ces valeurs, consultez les valeurs de paramètre de 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;
    }
    

L’exemple de code C++ suivant comprend toutes les étapes de la procédure précédente. Il encode la classe Win32_LogicalDisk au format XML en incluant les qualificateurs de classe, de propriété et de méthode, et en excluant les propriétés système.

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

Encoder un objet en VBScript

La procédure suivante explique comment encoder un objet au format XML en VBScript.

Pour encoder un objet au format XML en VBScript

  1. Créez éventuellement un objet SWbemNamedValueSet, puis initialisez-le pour définir les valeurs de contexte nécessaires à la représentation XML.

    L’exemple de code suivant montre comment les valeurs indiquent à l’encodeur XML de générer un élément <VALUE.OBJECTWITHLOCALPATH>, en incluant tous les qualificateurs et en excluant les propriétés système quand il construit la représentation XML de l’objet.

    ' 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. Récupérez une instance de l’objet ou de la classe à représenter en XML.

    L’exemple de code suivant récupère une instance de l’objet.

    ' Retrieve the object/class to be represented in XML
    set myObj = GetObject("winmgmts:\\.\root\cimv2:win32_LogicalDisk")
    
  3. Appelez la méthode GetText_ de l’instance créée à l’étape précédente, en utilisant 1 en tant que paramètre pour spécifier le format de texte qui correspond à la DTD CIM version 2.0, ou 2 pour spécifier le format de texte qui correspond à la DTD WMI version 2.0. Si vous avez créé l’objet SWbemNamedValueSet à l’étape 1, incluez-le dans la liste des paramètres en tant que troisième paramètre.

    L’exemple de code suivant montre comment appeler la méthode GetText_ de l’instance.

    ' 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. Si vous le souhaitez, vérifiez que le code XML généré à l’étape 3 correspond à du code XML bien formé en créant et en initialisant un objet DOM (Document Object Model) XML, puis en chargeant le texte XML dans celui-ci.

    L’exemple de code suivant montre comment créer et initialiser un objet DOM XML, et comment charger le texte XML dans celui-ci.

    ' 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. Générez une sortie de la représentation XML de l’objet.

    L’exemple de code suivant montre comment utiliser wscript pour générer la sortie du code XML.

    wscript.echo strText
    

    Si vous avez choisi d’utiliser le modèle DOM XML pour vérifier que le code XML généré est bien formé, remplacez la ligne précédente par ce qui suit.

    wscript.echo xml.xml
    

L’ exemple de code VBScript suivant comprend toutes les étapes de la procédure précédente. Il encode la classe Win32_LogicalDisk au format XML en incluant les qualificateurs de classe, de propriété et de méthode, et en excluant les propriétés système.

' 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

Utilisation de WMI