如何从作为msi安装后任务运行的VBScript读取64位注册表值?

Joe*_*ech 7 registry vbscript 64-bit windows-installer

我需要从使用Visual Studio 2008部署项目创建的安装程序中的VBScript中读取Temporary ASP.NET Files文件夹的位置,作为安装后任务的一部分.

我以为我会这样做:

Set oShell = CreateObject("Wscript.Shell")
strPath = oShell.RegRead("HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0\Path")
Run Code Online (Sandbox Code Playgroud)

然后将strPath与"\ Temporary ASP.NET Files"连接起来并完成它.

但是,在x64系统上,我从WOW6432Node(HKLM\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\2.0.50727.0)获取值,它为我提供了32位框架路径(C:\ Windows\Microsoft. NET\Framework\v2.0.50727),但在x64系统上,我实际上需要64位路径,即C:\ Windows\Microsoft.NET\Framework64\v2.0.50727.

我知道这是因为.vbs文件是使用32位脚本主机运行的,因为父进程(安装程序)本身就是32位.

如何使用64位脚本主机运行脚本 - 或者 - 即使脚本使用32位脚本主机运行,如何读取64位值?

Hel*_*len 9

不确定启动64位脚本宿主版本,但您应该能够使用WMI StdRegProv类从32位脚本宿主访问64位注册表,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

注意:我现在正处于32位操作系统下,因此无法验证此示例是否有效.小心错误:-)

有关此主题的更多信息,另请参阅64位平台 MSDN 请求WMI数据.

  • @ DaniellePaquette-Harvey:您需要调用[`EnumKey`](http://msdn.microsoft.com/en-us/library/aa390387.aspx)而不是`GetStringValue`(具有适当的参数),并检查`oOutParams .ReturnValue`为0。此外,请参见以下问题的答案:[检查注册表项是否存在](http://stackoverflow.com/q/9604276/113116)。 (2认同)