Запрос данных WMI на 64-разрядной платформе
По умолчанию приложение или скрипт получает данные от соответствующего поставщика, если существуют две версии поставщиков. 32-разрядный поставщик возвращает данные в 32-разрядное приложение, включая все скрипты, а 64-разрядный поставщик возвращает данные в 64-разрядные скомпилированные приложения. Однако приложение или скрипт может запрашивать данные от нестандартного поставщика, если он существует, уведомляя WMI через флаги в вызовах методов.
Флаги контекста
__ProviderArchitecture и __RequiredArchitecture строковые флаги имеют набор значений, обрабатываемых WMI, но не определённых в файлах заголовков SDK или в библиотеках типов. Значения помещаются в параметр контекста, чтобы сообщить WMI о том, что он должен запрашивать данные от нестандартного поставщика.
Ниже перечислены флаги и их возможные значения.
-
__АрхитектураПоставщика
-
Целочисленное значение (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, содержащий флаги для параметра objWbemNamedValueSetSWbemServices.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 Script Host (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
Связанные разделы