Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Компонент кодировщика XML в WMI создает XML-представления объектов.
В C++можно запустить xml-кодировщик с вызовом метода IWbemObjectTextSrc.GetText, указав объект, представленный в XML, и текстовый формат, используемый в представлении. Дополнительные сведения и пример кода см. в разделе "Кодирование объекта в XML с помощью C/C++".
В VBScript или Visual Basic для кодирования данных для XML-экземпляра вызовите SWbemObjectEx.GetText. Дополнительные сведения и пример кода см. в разделе "Кодирование объекта в XML с помощью VBScript".
В этом разделе рассматриваются следующие разделы:
Кодирование объекта с помощью C или C++
В следующей процедуре описывается кодирование объекта в XML с помощью C или C++.
Кодирование объекта в XML с помощью C или C++
Настройте программу для доступа к данным WMI.
Так как WMI основан на технологии COM, необходимо выполнить необходимые вызовы к функциям CoInitializeEx и CoInitializeSecurity для доступа к WMI. Дополнительные сведения см. в разделе Инициализация COM для приложения WMI.
При необходимости создайте объект IWbemContext и инициализировать его.
Не нужно создавать объект IWbemContext, если только не нужно изменить операцию по умолчанию. Объект контекста используется кодировщиком XML для управления объемом информации, включенной в xml-представление объекта.
В следующей таблице перечислены необязательные значения, которые можно указать для объекта контекста.
Значение или тип Значение "LocalOnly" VT_BOOL Если TRUE, в результирующем XML присутствуют только свойства и методы, определенные локально в классе. Значение по умолчанию — FALSE. "IncludeQualifiers" VT_BOOL Если TRUE, класс, экземпляр, свойства и квалификаторы методов включаются в результирующий XML-код. Значение по умолчанию — FALSE. VT_BOOL "ИсключитьСистемныеСвойства" Если TRUE, системные свойства WMI отфильтровываются из выходных данных. Значение по умолчанию — FALSE. VT_I4 PathLevel - 0 = создается элемент <CLASS> или <INSTANCE>.
1 = Генерируется элемент VALUE.NAMEDOBJECT <>.
2 = значение <. Создается элемент OBJECTWITHLOCALPATH>.
3 = значение <. Создан объект с путем>.
В следующем примере кода показано, как объект контекста инициализирован для включения квалификаторов и исключения системных свойств.
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);Получите ссылку на класс или экземпляр для кодирования в XML.
После инициализации COM и подключения к WMI вызовите GetObject, чтобы получить ссылку на указанный класс или экземпляр. Если вы использовали BSTR для указания класса или экземпляра, вызовите SysFreeString, чтобы освободить память, выделенную SysAllocString.
В следующем примере кода извлекается ссылка на экземпляр 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; }Создайте объект IWbemObjectTextSrc.
После получения ссылки на объект необходимо создать объект IWbemObjectTextSrc с вызовом CoCreateInstance. Объект IWbemObjectTextSrc используется для создания фактического XML-текста.
В следующем примере кода показано, как создать объект IWbemObjectTextSrc путем вызова 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; }Вызовите метод IWbemObjectTextSrc.GetText, чтобы получить XML-представление объекта.
После задания контекста представления объекта, получения ссылки на объект и создания объекта IWbemObjectTextSrc можно создать XML-представление указанного объекта, вызвав метод IWbemObjectTextSrc.GetText.
В следующем примере кода C++ создается XML-представление объекта, на который ссылается pClass. XML-представление возвращается в strText. Третий параметр GetText указывает текстовый формат, используемый для XML, и должен быть WMI_OBJ_TEXT_CIM_DTD_2_0 (0x1) или WMI_OBJ_TEXT_WMI_DTD_2_0 (0x2). Дополнительные сведения об этих значениях см. в разделе значения параметров 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; }
Следующий пример кода C++ включает все шаги, описанные в предыдущей процедуре, и кодирует класс Win32_LogicalDisk в XML, включая класс, свойство и квалификаторы методов и исключая системные свойства.
// 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;
}
Кодирование объекта с помощью VBScript
В следующей процедуре описывается кодирование объекта в XML с помощью VBScript.
Кодирование объекта в XML с помощью VBScript
При необходимости создайте объект SWbemNamedValueSet и инициализировать его, чтобы задать значения контекста, необходимые для представления XML.
В следующем примере кода показано, как значения данных указывают кодировщику XML создать элемент <VALUE.OBJECTWITHLOCALPATH>, включая все квалификаторы и исключая системные свойства при создании XML-описания объекта.
' 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 'Получение экземпляра объекта или класса для представления в XML.
В следующем примере кода извлекается экземпляр объекта.
' Retrieve the object/class to be represented in XML set myObj = GetObject("winmgmts:\\.\root\cimv2:win32_LogicalDisk")Вызовите метод GetText_ экземпляра, созданного на предыдущем шаге, используя 1 в качестве параметра, чтобы указать текстовый формат, соответствующий CIM DTD версии 2.0 или 2, чтобы указать текстовый формат, соответствующий WMI DTD версии 2.0. Если вы создали объект SWbemNamedValueSet на шаге 1, включите его в список параметров в качестве третьего параметра.
В следующем примере кода показано, как вызвать метод GetText_ экземпляра.
' 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)При необходимости убедитесь, что XML-код, созданный на шаге 3, является хорошо сформированным XML, путем создания и инициализации объекта объектной модели XML-документа (DOM) и загрузки XML-текста в него.
В следующем примере кода показано, как создать и инициализировать объект XML DOM и загрузить 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Выводит XML-представление объекта.
В следующем примере кода показано, как использовать wscript для вывода XML.
wscript.echo strTextЕсли вы решили использовать XML-DOM для проверки правильности создания XML, замените предыдущую строку на следующую.
wscript.echo xml.xml
Следующий пример кода VBScript включает все шаги, описанные в предыдущей процедуре, и кодирует класс Win32_LogicalDisk в XML, включая класс, свойство и квалификаторы методов и исключая системные свойства.
' 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
Связанные разделы
-
Использование WMI