在 64 位平台上请求 WMI 数据

默认情况下,当存在两个版本的提供程序时,应用程序或脚本将从相应的提供程序接收数据。 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 对象,其中包含 SWbemServices.ExecMethod 的 objWbemNamedValueSet 参数的标志。 有关为此调用设置参数对象的详细信息,请参阅构造 InParameters 对象和分析 OutParameters 对象

可以在旧版操作系统中使用上下文标志安全地运行脚本和应用程序,因为 WMI 在未实现这些标志的系统中会忽略它们。 虽然存在 32 位和 64 位版本的系统注册表提供程序,但请注意,只有一个版本的 WMI 存储库存在。

访问默认注册表配置单元

以下示例系列使用注册表提供程序,该提供程序在 64 位操作系统上预安装了并行的 32 位和 64 位版本。 在这些示例中,32 位客户端从 32 位节点 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft 获取提供程序返回的数据。 64 位客户端从 64 位节点 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Logging 获取提供程序返回的数据。

这些脚本演示如何通过 SWbemServices.ExecMethod 调用注册表 StdRegProv 类的方法,以从 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

如果默认配置单元中的 Logging 值设置为 1,则该脚本的输出应如下所示:

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

示例:专门请求 64 位计算机上的 32 位注册表配置单元

以下修改后的默认脚本示例使用 __ProviderArchitecture 字符串标志来请求访问 64 位计算机上的 32 位注册表数据。 调用方已连接到 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 访问 64 位计算机上的 32 位注册表配置单元

通过向上下文参数添加 __ProviderArchitecture 和 __RequiredArchitecture 标志对上述脚本进行以下修改,以强制 WMI 加载 32 位提供程序并获取 32 位数据。 如果该提供程序不存在,则会发生提供程序加载错误。 必须通过调用 SWbemLocator.ConnectServer 在 WMI 连接中提供上下文对象。

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 位计算机上获取和提供数据