Representar objetos no XML
O componente do codificador XML no WMI gera representações XML de objetos.
No C++, você pode iniciar o codificador XML com uma chamada para o método IWbemObjectTextSrc.GetText, especificando o objeto a ser representado em XML e o formato de texto a ser usado na representação. Para obter mais informações e um exemplo de código, consulte Para codificar um objeto em XML usando C/C++.
No VBScript ou no Visual Basic, para codificar dados para uma instância XML, chame SWbemObjectEx.GetText. Para obter mais informações e um exemplo de código, consulte Para codificar um objeto em XML usando VBScript.
As seções a seguir serão abordadas neste tópico:
Codificar um objeto usando C ou C++
O procedimento a seguir descreve como codificar um objeto em XML usando C ou C++.
Para codificar um objeto em XML usando C ou C++
Configure seu programa para acessar dados do WMI.
Como o WMI é baseado na tecnologia COM, você deve realizar as chamadas necessárias para as funções CoInitializeEx e CoInitializeSecurity para acessar o WMI. Para obter mais informações, consulte Inicializar parâmetros COM para um aplicativo do WMI.
Opcionalmente, crie um objeto IWbemContext e inicialize-o.
Você não precisa criar o objeto IWbemContext, a menos que precise alterar a operação padrão. O objeto de contexto é usado pelo codificador XML para controlar a quantidade de informações incluídas na representação XML do objeto.
A seguinte tabela lista os valores opcionais que podem ser especificados para o objeto contexto.
Valor/tipo Significado "LocalOnly" VT_BOOL Quando TRUE, somente propriedades e métodos definidos localmente na classe estão presentes no XML resultante. O valor padrão é FALSE. "IncludeQualifiers" VT_BOOL Quando TRUE, classe, instância, propriedades e qualificadores de método são incluídos no XML resultante. O valor padrão é FALSE. "ExcludeSystemProperties" VT_BOOL Quando TRUE, as propriedades do sistema WMI são filtradas para fora da saída. O valor padrão é FALSE. "PathLevel" VT_I4 - 0 = Um <elemento CLASS> ou <INSTANCE> é gerado.
1 = UM <VALOR. O elemento NAMEDOBJECT> é gerado.
2 = UM <VALOR. O elemento OBJECTWITHLOCALPATH> é gerado.
3 = UM <VALOR. OBJECTWITHPATH> é gerado.
O exemplo de código a seguir mostra como o objeto de contexto é inicializado para incluir qualificadores e excluir propriedades do 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);
Obtenha uma referência à classe ou instância a ser codificada em XML.
Depois de inicializar o COM e se conectar ao WMI, chame GetObject para recuperar uma referência à classe ou instância especificada. Se você tiver usado um BSTR para especificar a classe ou instância, chame SysFreeString para liberar a memória alocada por SysAllocString.
O exemplo de código a seguir recupera uma referência a uma instância 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; }
Crie um objeto IWbemObjectTextSrc.
Depois de fazer referência a um objeto, você deve criar o objeto IWbemObjectTextSrc com uma chamada para CoCreateInstance. O objeto IWbemObjectTextSrc é usado para gerar o texto XML real.
O exemplo de código a seguir mostra como criar um objeto IWbemObjectTextSrc chamando 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; }
Invoque o método IWbemObjectTextSrc.GetText para obter uma representação XML de um objeto .
Depois de definir o contexto para a representação do objeto, obter uma referência ao objeto e criar um objeto IWbemObjectTextSrc, você estará pronto para gerar uma representação XML do objeto especificado chamando o método IWbemObjectTextSrc.GetText.
O código de exemplo C++ a seguir gera uma representação XML do objeto referenciado por pClass. A representação XML é retornada em strText. O terceiro parâmetro de GetText especifica o formato de texto a ser usado para o XML e deve ser WMI_OBJ_TEXT_CIM_DTD_2_0 (0x1) ou WMI_OBJ_TEXT_WMI_DTD_2_0 (0x2). Para obter mais informações sobre esses valores, consulte os valores do parâmetro 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; }
O código de exemplo C++ a seguir inclui todas as etapas do procedimento anterior e codifica a classe Win32_LogicalDisk em XML, incluindo qualificadores de classe, propriedade e método e excluindo propriedades do 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;
}
Codificar um objeto usando VBScript
O procedimento a seguir descreve como codificar um objeto em XML usando VBScript.
Para codificar um objeto em XML usando VBScript
Opcionalmente, crie um objeto SWbemNamedValueSet e inicialize-o para definir os valores de contexto necessários para a representação XML.
O exemplo de código a seguir mostra como os valores instruem o codificador XML a gerar um elemento <VALUE.OBJECTWITHLOCALPATH>, incluindo todos os qualificadores e excluindo propriedades do sistema quando ele constrói a representação XML do objeto.
' 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 '
Recupere uma instância do objeto ou classe a ser representada em XML.
O exemplo de código a seguir recupera uma instância do objeto.
' Retrieve the object/class to be represented in XML set myObj = GetObject("winmgmts:\\.\root\cimv2:win32_LogicalDisk")
Invoque o método GetText_ da instância criada na etapa anterior, usando 1 como parâmetro para especificar o formato de texto que corresponde ao CIM DTD versão 2.0 ou 2 para especificar o formato de texto que corresponde ao WMI DTD versão 2.0. Se você tiver criado o objeto SWbemNamedValueSet na Etapa 1, inclua-o na lista de parâmetros como terceiro parâmetro.
O exemplo de código a seguir mostra como invocar o método GetText_ da instância.
' 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)
Opcionalmente, valide se o XML gerado na Etapa 3 é um XML bem formado, criando e inicializando um objeto XML Document Object Model (DOM) e carregando o texto XML nele.
O exemplo de código a seguir mostra como criar e inicializar um objeto DOM XML e carregar o texto XML nele.
' 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
Produza a representação XML do objeto.
O exemplo de código a seguir mostra como usar wscript para produzir o XML.
wscript.echo strText
Se você optar por usar o DOM XML para verificar se o XML gerado está bem formado, substitua a linha anterior pelo seguinte.
wscript.echo xml.xml
O exemplo de código VBScript a seguir inclui todas as etapas do procedimento anterior e codifica a classe Win32_LogicalDisk em XML, incluindo qualificadores de classe, propriedade e método e excluindo propriedades do 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