在 64 位平臺上要求 WMI 資料
根據預設,當有兩個版本的提供者存在時,應用程式或腳本會從對應的提供者接收資料。 32 位提供者會將資料傳回 32 位應用程式,包括所有腳本,而 64 位提供者會將資料傳回至 64 位編譯的應用程式。 不過,如果應用程式或腳本存在,應用程式或腳本可以透過方法呼叫上的旗標通知 WMI,以向非預設提供者要求資料。
內容旗標
__ProviderArchitecture和__RequiredArchitecture字串旗標具有一組由 WMI 處理的值,但未定義于 SDK 標頭或型別程式庫檔案中。 這些值會放在內容參數中,以向 WMI 發出訊號,指出它應該向非預設提供者要求資料。
下列列出旗標及其可能的值。
-
__ProviderArchitecture
-
指定 32 位或 64 位版本的整數值。
-
__RequiredArchitecture
-
除了 __ProviderArchitecture 之外,用來強制載入指定提供者版本的布林值。 如果版本無法使用,則 WMI 會傳回錯誤0x80041013、 wbemErrProviderLoadFailure for Visual Basic 和 C++ 的 WBEM_E_PROVIDER_LOAD_FAILURE 。 未指定這個旗標時的預設值為 FALSE。
在具有提供者並存版本的 64 位系統上,32 位應用程式或腳本會自動從 32 位提供者接收資料,除非提供這些旗標,並指出應該傳回 64 位提供者資料。
使用內容旗標
C++ 應用程式可以使用 IWbemCoNtext 介面搭配 IWbemServices::ExecMethod ,將非預設提供者的使用與 WMI 進行通訊。
在腳本和 Visual Basic 中,您必須建立SWbemNamedValueSet物件,其中包含SWbemServices.ExecMethod之 objWbemNamedValueSet參數的旗標。 如需設定此呼叫之參數物件的詳細資訊,請參閱 建構 InParameters 物件和剖析 OutParameters 物件。
您可以在舊版作業系統中使用內容旗標安全地執行腳本和應用程式,因為 WMI 會忽略它們未實作的系統中。 雖然有 32 位和 64 位版本的系統登錄提供者存在,但請注意,只有一個版本的 WMI 存放庫存在。
存取預設登錄 Hive
下列一系列範例使用登錄 提供者,其具有預先安裝在 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 中的 Logging 值設定為 1,則腳本的輸出看起來應該如下所示:
instance of __PARAMETERS
{
ReturnValue = 0;
sValue = "1";
};
WMI Logging is set to 1
範例:特別要求 64 位電腦上的 32 位登錄 Hive
下列已修改的預設腳本範例會使用 __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 位登錄 Hive
將 __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
相關主題