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++
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.
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.
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);
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; }
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; }
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
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 '
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")
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)
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
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