共用方式為


在 64 位平台上取得 WMI 資料

根據預設,當有兩個版本的提供者存在時,應用程式或腳本會從對應的提供者接收數據。 32 位提供者會將數據傳回 32 位應用程式,包括所有腳本,而 64 位提供者會將數據傳回至 64 位編譯的應用程式。 不過,應用程式或腳本可以透過方法呼叫上的旗標通知 WMI,以向非預設提供者要求數據。

情境旗幟

__ProviderArchitecture__RequiredArchitecture 字串旗標具有 WMI 所處理的一組值,但未定義於 SDK 標頭或類型連結庫檔案中。 這些值會放在內容參數中,以向WMI發出訊號,指出它應該向非預設提供者要求數據。

下列列出旗標及其可能的值。

__ProviderArchitecture

指定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 呼叫 Registry 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

如果預設 hive 中的 紀錄 值設定為 1,則腳本的輸出看起來應該如下所示:

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

範例:特別在64位計算機上要求32位登錄區

下列修改過的預設文本範例會使用 __ProviderArchitecture 字串旗標來要求存取 64 位電腦上的 32 位登錄數據。 無論其為32位或64位應用程式,呼叫端都已連線到32位Hive。

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位電腦上取得和提供資料