2011-08-09 161 views
3

我想達到的目標應該相當簡單,但它卻讓我完全瘋狂。VBS Windows 64位/ 32位註冊表讀取問題

背景: 我們在客戶端運行系統監視工具,這些工具可以遠程運行.vbs腳本。這通常工作得很好。

我現在想要實現的是能夠從32位版本的Windows和64位版本的註冊表中讀取一行。

監視計算機的客戶端side.exe作爲32位進程在兩個平臺上運行(這是一個竅門)。

例如,我想從HKEY_LOCAL_MACHINE \ SOFTWARE \中讀取一個密鑰。我的腳本在32位上工作得很好。例如:objRegistry.RegRead(「HKEY_LOCAL_MACHINE \ Software \ anything」)

我遇到的問題是當我在64位文件夾上運行同一行時,它自動查找wow64node文件夾。示例:objRegistry.RegRead(「HKEY_LOCAL_MACHINE \ Software \ wow64node \」)。

我需要讓它檢查完全相同的地方。

它讀取的關鍵是運行32位和64位版本的程序的一部分,這就是爲什麼它沒有安裝在wow64node文件夾中的原因。

在這一點上,我無法運行.VBS腳本作爲一個64位進程,這將完全解決我的問題,因爲它將不會看在wow64node文件夾。

如果有人有任何想法,請讓我知道。

+0

可能的重複[如何從VBScript中讀取64位註冊表值作爲msi安裝後任務運行?](http://stackoverflow.com/questions/1229760/how-do-i-read- 64位註冊表值從vbscript運行作爲一個MSI post-insta) – Helen

回答

2

而不是WshShell.RegRead,使用WMI StdRegProv類—它允許您指定是否要從32位或64位註冊表讀取。看看這個MSDN文章瞭解更多信息和示例:

Requesting WMI Data on a 64-bit Platform

+0

我試過這個,它不想讓我運行StdRegProv。 strDateDefs = objRegistry.ReadRegStr(HKEY_LOCAL_MACHINE,「Software \ ESET \ ESET Security \ CurrentVersion \ Info」,「ScannerVersion」,64)。我得到的錯誤代碼是「Microsoft VBScript運行時錯誤:對象不支持此屬性或方法:'ReadRegStr'」 – Ben

+0

@Ben:'ReadRegStr'不是'StdRegProv'方法,它是[this答案](http://stackoverflow.com/questions/1229760/how-do-i-read-64-bit-registry-values-from-vbscript-running-as-a-an-msi-post-insta/1230013 #1230013)包裝所有執行這項工作所需的代碼。您應該像這樣調用它:'strDateDefs = ReadRegStr(HKEY_LOCAL_MACHINE,「Software \ ESET \ ESET Security \ CurrentVersion \ Info」,「ScannerVersion」,64)'。 – Helen

3

我解決它使用這段代碼。

Const HKEY_LOCAL_MACHINE = &H80000002 
sPath = ReadRegStr (HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\ASP.NET\2.0.50727.0", "Path", 64) 
WScript.Echo sPath 

' Reads a REG_SZ value from the local computer's registry using WMI. 
' Parameters: 
' RootKey - The registry hive (see http://msdn.microsoft.com/en-us/library/aa390788(VS.85).aspx for a list of possible values). 
' Key - The key that contains the desired value. 
' Value - The value that you want to get. 
' RegType - The registry bitness: 32 or 64. 
' 
Function ReadRegStr (RootKey, Key, Value, RegType) 
    Dim oCtx, oLocator, oReg, oInParams, oOutParams 

    Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet") 
    oCtx.Add "__ProviderArchitecture", RegType 

    Set oLocator = CreateObject("Wbemscripting.SWbemLocator") 
    Set oReg = oLocator.ConnectServer("", "root\default", "", "", , , , oCtx).Get("StdRegProv") 

    Set oInParams = oReg.Methods_("GetStringValue").InParameters 
    oInParams.hDefKey = RootKey 
    oInParams.sSubKeyName = Key 
    oInParams.sValueName = Value 

    Set oOutParams = oReg.ExecMethod_("GetStringValue", oInParams, , oCtx) 

    ReadRegStr = oOutParams.sValue 
End Function 

謝謝海倫的幫助!