VBS Windows 64bit / 32bit注册表读取问题

时间:2011-08-09 04:40:45

标签: windows vbscript 64-bit 32-bit

我想要实现的目标应该是相当简单但它让我完全疯了。

背景: 我们在客户端运行系统监控工具,可以远程运行.vbs脚本。这通常很有效。

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

监视机器的Client side.exe在BOTH平台上以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文件夹中查找。

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

2 个答案:

答案 0 :(得分: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

谢谢Helen的帮助!

答案 1 :(得分:2)

使用WMI StdRegProv类代替WshShell.RegRead - 它允许您指定是否要从32位或64位注册表中读取。查看此MSDN文章以获取更多信息和示例:

Requesting WMI Data on a 64-bit Platform