Condividi tramite


Rappresentazione di oggetti in XML

Il componente del codificatore XML in WMI genera rappresentazioni XML di oggetti.

In C++, è possibile avviare il codificatore XML con una chiamata al metodo IWbemObjectTextSrc.GetText , specificando l'oggetto da rappresentare in XML e il formato di testo da utilizzare nella rappresentazione. Per altre informazioni e un esempio di codice, vedere Per codificare un oggetto in XML tramite C/C++.

In VBScript o Visual Basic, per codificare i dati per un'istanza XML, chiamare SWbemObjectEx.GetText. Per altre informazioni e un esempio di codice, vedere Per codificare un oggetto in XML tramite VBScript.

In questo argomento vengono illustrate le sezioni seguenti:

Codificare un oggetto usando C o C++

La procedura seguente descrive come codificare un oggetto in XML usando C o C++.

Per codificare un oggetto in XML tramite C o C++

  1. Configurare il programma per accedere ai dati WMI.

    Poiché WMI si basa sulla tecnologia COM, è necessario eseguire le chiamate necessarie alle funzioni CoInitializeEx e CoInitializeSecurity per accedere a WMI. Per altre informazioni, vedere Inizializzazione di COM per un'applicazione WMI.

  2. Facoltativamente, creare un oggetto IWbemContext e inizializzarlo.

    Non è necessario creare l'oggetto IWbemContext a meno che non sia necessario modificare l'operazione predefinita. L'oggetto di contesto viene utilizzato dal codificatore XML per controllare la quantità di informazioni incluse nella rappresentazione XML dell'oggetto.

    Nella tabella seguente sono elencati i valori facoltativi che è possibile specificare per l'oggetto contesto.

    Valore/tipo Significato
    VT_BOOL "LocalOnly" Se TRUE, nel codice XML risultante sono presenti solo proprietà e metodi definiti localmente nella classe . Il valore predefinito è FALSE.
    VT_BOOL "IncludeQualifiers" Se TRUE, classe, istanza, proprietà e qualificatori di metodo vengono inclusi nel codice XML risultante. Il valore predefinito è FALSE.
    VT_BOOL "ExcludeSystemProperties" Se TRUE, le proprietà di sistema WMI vengono filtrate all'esterno dell'output. Il valore predefinito è FALSE.
    VT_I4 "PathLevel"
    0 = Viene generato un <elemento CLASS> o <INSTANCE> .
    1 = VALORE <. Viene generato l'elemento NAMEDOBJECT> .
    2 = VALORE <. Viene generato l'elemento OBJECTWITHLOCALPATH> .
    3 = VALORE <. OBJECTWITHPATH> viene generato.
    Il valore predefinito è 0 (zero).

    Nell'esempio di codice seguente viene illustrato come inizializzare l'oggetto contesto per includere qualificatori ed escludere le proprietà di 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. Ottenere un riferimento alla classe o all'istanza da codificare in XML.

    Dopo aver inizializzato COM e aver eseguito la connessione a WMI, chiamare GetObject per recuperare un riferimento alla classe o all'istanza specificata. Se è stato usato un BSTR per specificare la classe o l'istanza, chiamare SysFreeString per liberare la memoria allocata da SysAllocString.

    Nell'esempio di codice seguente viene recuperato un riferimento a un'istanza di 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. Creare un oggetto IWbemObjectTextSrc .

    Dopo aver ottenuto un riferimento a un oggetto, è necessario creare l'oggetto IWbemObjectTextSrc con una chiamata a CoCreateInstance. L'oggetto IWbemObjectTextSrc viene utilizzato per generare il testo XML effettivo.

    Nell'esempio di codice seguente viene illustrato come creare un oggetto IWbemObjectTextSrc chiamando 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. Richiamare il metodo IWbemObjectTextSrc.GetText per ottenere una rappresentazione XML di un oggetto.

    Dopo aver impostato il contesto per la rappresentazione dell'oggetto, ottenere un riferimento all'oggetto e creare un oggetto IWbemObjectTextSrc , è possibile generare una rappresentazione XML dell'oggetto specificato chiamando il metodo IWbemObjectTextSrc.GetText .

    Il codice di esempio C++ seguente genera una rappresentazione XML dell'oggetto a cui fa riferimento pClass. La rappresentazione XML viene restituita in strText. Il terzo parametro di GetText specifica il formato di testo da utilizzare per il codice XML e deve essere WMI_OBJ_TEXT_CIM_DTD_2_0 (0x1) o WMI_OBJ_TEXT_WMI_DTD_2_0 (0x2). Per altre informazioni su questi valori, vedere IWbemObjectTextSrc::GetText Parameter Values.For more information about these values, see IWbemObjectTextText Parameter Values.

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

Il codice di esempio C++ seguente include tutti i passaggi della procedura precedente e codifica la classe Win32_LogicalDisk in XML, inclusi qualificatori di classe, proprietà ed esclusione delle proprietà di 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;
}

Codificare un oggetto tramite VBScript

La procedura seguente descrive come codificare un oggetto in XML usando VBScript.

Per codificare un oggetto in XML tramite VBScript

  1. Facoltativamente, creare un oggetto SWbemNamedValueSet e inizializzarlo in modo da impostare i valori di contesto necessari per la rappresentazione XML.

    Nell'esempio di codice seguente viene illustrato come i valori indicano al codificatore XML di generare un <valore. Elemento OBJECTWITHLOCALPATH> , inclusi tutti i qualificatori ed esclusione delle proprietà di sistema quando costruisce la rappresentazione XML dell'oggetto.

    ' 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. Recuperare un'istanza dell'oggetto o della classe da rappresentare in XML.

    Nell'esempio di codice seguente viene recuperata un'istanza dell'oggetto .

    ' Retrieve the object/class to be represented in XML
    set myObj = GetObject("winmgmts:\\.\root\cimv2:win32_LogicalDisk")
    
  3. Richiamare il metodo GetText_ dell'istanza creata nel passaggio precedente, usando 1 come parametro per specificare il formato di testo corrispondente a CIM DTD versione 2.0 o 2 per specificare il formato di testo corrispondente a WMI DTD versione 2.0. Se l'oggetto SWbemNamedValueSet è stato creato nel passaggio 1, includerlo nell'elenco dei parametri come terzo parametro.

    Nell'esempio di codice seguente viene illustrato come richiamare il metodo GetText_ dell'istanza di .

    ' 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. Facoltativamente, verificare che il codice XML generato nel passaggio 3 sia xml ben formato, creando e inizializzando un oggetto DOM (Document Object Model) XML e quindi caricando il testo XML.

    Nell'esempio di codice seguente viene illustrato come creare e inizializzare un oggetto DOM XML e caricarvi il testo XML.

    ' 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. Restituisce la rappresentazione XML dell'oggetto .

    Nell'esempio di codice seguente viene illustrato come usare wscript per restituire il codice XML.

    wscript.echo strText
    

    Se si sceglie di utilizzare DOM XML per verificare che il formato XML generato sia corretto, sostituire la riga precedente con la seguente.

    wscript.echo xml.xml
    

L'esempio di codice VBScript seguente include tutti i passaggi della procedura precedente e codifica la classe Win32_LogicalDisk in XML, inclusi qualificatori di classe, proprietà ed esclusione delle proprietà di 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 di WMI