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.
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 padrão é 0 (zero).
O exemplo de código a seguir mostra como o objeto de contexto é inicializado para incluir qualificadores e excluir propriedades do sistema.
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.
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.
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.
C++
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.
C++
// 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// ---------------------------------------------voidFillUpContext(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)))
return1;
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 GetObjectif(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();
}
}
elseprintf("GetObject failed with %x\n", hr);
}
elseprintf("CoCreateInstance on WbemObjectTextSrc failed with %x\n", hr);
}
elseprintf("ConnectServer on root\\cimv2 failed with %x\n", hr);
}
elseprintf("CoCreateInstance on Context failed with %x\n", hr);
}
elseprintf("CoCreateInstance on Locator failed with %x\n", hr);
// Clean up memoryif (strNs != NULL)
SysFreeString(strNs);
if (strObj != NULL)
SysFreeString(strObj);
if (strText != NULL)
SysFreeString(strText);
if (pSrc != NULL)
pSrc->Release();
if (pL != NULL)
pL->Release();
return0;
}
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.
VB
' Create an optional SWbemNamedValueSet objectset 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.
VB
' Retrieve the object/class to be represented in XMLset 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.
VB
' 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.
VB
' Create an XMLDOM objectset 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.
VB
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.
VB
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.
VB
' Create optional SWbemNamedValueSet objectset 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 XMLset 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 objectset 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
Este módulo explica a estrutura dos namespaces que contêm classes e também como consultar instâncias de uma classe. Ele aborda como consultar computadores remotos usando conexões ad hoc e sessões CIM.