VBS在Windows 64位/32位系统下读取注册表的问题

4

我想要实现的目标应该很简单,但它让我彻底疯狂了。

背景:我们在客户端上运行系统监控工具,该工具有能力远程运行.vbs脚本。通常情况下,这非常有效。

我目前要实现的目标是能够在32位和64位版本的Windows上读取注册表中的一行。

监视机器的客户端.exe作为32位进程在两个平台上运行(这是关键)。

我想要从HKEY_LOCAL_MACHINE\SOFTWARE\读取一个键。例如:objRegistry.RegRead("HKEY_LOCAL_MACHINE\Software\anything"),我的脚本在32位上完美运行。

问题在于当我在64位文件夹上运行相同的代码时,它会自动查找wow64node文件夹。例如:objRegistry.RegRead("HKEY_LOCAL_MACHINE\Software\wow64node\")。

我需要它检查完全相同的位置。

它正在读取的键是程序的一部分,该程序同时运行32位和64位版本,因此它未安装在wow64node文件夹中。

此时,我无法将.VBS脚本作为64位进程运行,否则它就不会查找wow64node文件夹,从而完全解决我的问题。

如果有任何想法,请告诉我。


2个回答

4
我使用这段代码解决了问题。
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

感谢 Helen 的帮助!


2

不要使用 WshShell.RegRead,而是使用 WMI StdRegProv 类——它允许您指定是从32位还是64位注册表中读取。请查看此MSDN文章以获取更多信息和示例:

在64位平台上请求WMI数据


我已经尝试过了,但无法运行StdRegProv。 strDateDefs = objRegistry.ReadRegStr (HKEY_LOCAL_MACHINE, "Software\ESET\ESET Security\CurrentVersion\Info", "ScannerVersion", 64)。我得到的错误代码是“Microsoft VBScript运行时错误:对象不支持此属性或方法:'ReadRegStr'”。 - Ben
@Ben: ReadRegStr 不是 StdRegProv 方法,它是来自 这个答案 的自定义函数,它包装了执行此任务所需的所有代码。你应该像这样调用它:strDateDefs = ReadRegStr (HKEY_LOCAL_MACHINE, "Software\ESET\ESET Security\CurrentVersion\Info", "ScannerVersion", 64) - Helen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接