Запрос данных WMI на 64-разрядной платформе

По умолчанию приложение или скрипт получает данные от соответствующего поставщика при наличии двух версий поставщиков. 32-разрядный поставщик возвращает данные в 32-разрядное приложение, включая все скрипты, а 64-разрядный поставщик возвращает данные в 64-разрядные скомпилированные приложения. Однако приложение или скрипт может запрашивать данные у поставщика без изменений, если они существуют, уведомляя WMI через флаги для вызовов методов.

Флаги контекста

Флаги строки __ProviderArchitecture и __RequiredArchitecture имеют набор значений, обрабатываемых WMI, но не определенных в файлах библиотеки заголовков или типов пакета SDK. Значения помещаются в параметр контекста, чтобы сообщить инструментарию WMI о том, что он должен запрашивать данные у поставщика, не являющегося стандартным.

Ниже перечислены флаги и их возможные значения.

__ProviderArchitecture

Целочисленное значение (32 или 64), указывающее 32-разрядную или 64-разрядную версию.

__RequiredArchitecture

Логическое значение, используемое в дополнение к __ProviderArchitecture для принудительной загрузки указанной версии поставщика. Если версия недоступна, WMI возвращает ошибку 0x80041013 wbemErrProviderLoadFailure для Visual Basic и WBEM_E_PROVIDER_LOAD_FAILURE для C++. Значение по умолчанию для этого флага, если он не указан, равно FALSE.

В 64-разрядной системе с параллельными версиями поставщика 32-разрядное приложение или скрипт автоматически получает данные от 32-разрядного поставщика, если эти флаги не указаны и не указывают на то, что данные 64-разрядного поставщика должны быть возвращены.

Использование флагов контекста

Приложения C++ могут использовать интерфейс IWbemContext с IWbemServices::ExecMethod для передачи данных об использовании поставщика, не являющегося стандартным, с WMI.

В скриптах и Visual Basic необходимо создать объект SWbemNamedValueSet , содержащий флаги для параметра objWbemNamedValueSetобъекта SWbemServices.ExecMethod. Дополнительные сведения о настройке объектов параметров для этого вызова см. в разделах Построение объектов InParameters и Анализ объектов OutParameters.

Вы можете безопасно запускать скрипты и приложения, используя флаги контекста в старых операционных системах, так как WMI игнорирует их в системах, в которых они не реализованы. Хотя существуют 32-разрядные и 64-разрядные версии поставщика системного реестра, обратите внимание, что существует только одна версия репозитория WMI.

Доступ к кусту реестра по умолчанию

В следующей серии примеров используется поставщик реестра, который имеет параллельные 32-разрядные и 64-разрядные версии, предварительно установленные в 64-разрядных операционных системах. В этих примерах 32-разрядные клиенты получают данные, возвращаемые поставщиком из 32-разрядного узла HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft. 64-разрядные клиенты получают данные, возвращаемые поставщиком с 64-разрядного узла HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Logging.

Скрипты показывают, как вызывать методы класса Registry StdRegProv через SWbemServices.ExecMethod для получения данных из 32-разрядного куста реестра.

Следующий скрипт возвращает данные от поставщика, которые соответствуют ширине бита вызывающего объекта , в данном случае 64 бита, так как это скрипт, выполняемый на 64-разрядном узле сценариев Windows (WSH). Скрипт получает значение из 64-разрядного узла реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Logging , а не из 32-разрядного узла HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WBEM\CIMOM.

strComputer = "."
Const HKLM = &h80000002
Set objReg = Getobject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer _
    & "\root\default:stdregprov")
'Set up inParameters object
Set Inparams = objReg.Methods_("GetStringValue").Inparameters
Inparams.Hdefkey = HKLM
Inparams.Ssubkeyname = "Software\Microsoft\Wbem\CIMOM"
Inparams.Svaluename = "Logging"
set Outparams = objReg.ExecMethod_("GetStringValue", Inparams)

'Show output parameters object and the registry value HKLM\SOFTWARE\
WScript.Echo Outparams.GetObjectText_
WScript.Echo "WMI Logging is set to  " & Outparams.SValue

Если для параметра Ведение журнала в кусте по умолчанию задано значение 1, выходные данные скрипта должны выглядеть примерно так:

instance of __PARAMETERS
{
    ReturnValue = 0;
    sValue = "1";
};
WMI Logging is set to 1

Пример. Запрос 32-разрядного куста реестра на 64-разрядном компьютере

В следующем измененном примере скрипта по умолчанию используется флаг строки __ProviderArchitecture для запроса доступа к 32-разрядным данным реестра на 64-разрядном компьютере. Вызывающий объект подключается к 32-разрядному кусту независимо от того, является ли он 32- или 64-разрядным приложением.

strComputer = "."
Const HKLM = &h80000002
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", 32
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer(strComputer,"root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv") 

Set Inparams = objStdRegProv.Methods_("GetStringValue").Inparameters
Inparams.Hdefkey = HKLM
Inparams.Ssubkeyname = "Software\Microsoft\Wbem\CIMOM"
Inparams.Svaluename = "Logging"
set Outparams = objStdRegProv.ExecMethod_("GetStringValue", Inparams,,objCtx)

'show output parameters object and the registry value HKLM\SOFTWARE\
WScript.Echo Outparams.GetObjectText_
WScript.Echo "WMI Logging is set to  " & Outparams.SValue

Пример. Принудительный доступ WMI к 32-разрядному кусту реестра на 64-разрядном компьютере

Следующее изменение приведенного выше скрипта путем добавления флагов __ProviderArchitecture и __RequiredArchitecture в параметр контекста заставляет WMI загрузить 32-разрядный поставщик и получить 32-разрядные данные. Если поставщик не существует, возникает ошибка загрузки поставщика. Объект контекста должен быть предоставлен в соединении с WMI путем вызова SWbemLocator.ConnectServer.

strComputer = "."
Const HKLM = &h80000002
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", 32
objCtx.Add "__RequiredArchitecture", TRUE
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer(strComputer,"root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv") 

' Use ExecMethod to call the GetStringValue method
Set Inparams = objStdRegProv.Methods_("GetStringValue").Inparameters
Inparams.Hdefkey = HKLM
Inparams.Ssubkeyname = "Software\Microsoft\Wbem\CIMOM"
Inparams.Svaluename = "Logging"
set Outparams = objStdRegProv.ExecMethod_("GetStringValue", Inparams,,objCtx)

'Show output parameters object and the registry value HKLM\SOFTWARE\
WScript.Echo Outparams.GetObjectText_
WScript.Echo "WMI Logging is set to  " & Outparams.SValue

Получение и предоставление данных на 64-разрядном компьютере