如何在32位cmd中读取64位注册表?

时间:2015-08-04 05:52:38

标签: vbscript 64-bit 32bit-64bit sccm

如何通过vbscript从64位计算机中读取注册表值或检查注册表是否存在64位cmd,因为sccm使用32位cmd

2 个答案:

答案 0 :(得分:1)

这有几种可能性。首先,如果你有SCCM 2012,你可以使用应用程序而不是包/程序。应用程序应在适当的机器上以64位执行。

如果你需要一个软件包,并且你只想在64Bit机器上执行它(或者因为你只有那些或者因为你创建了一个具有特殊环境设置的几个软件包,将它限制为仅64Bit)你可以使用{{3 }}。 Sysnative是C:\ windows中的硬链接,可用于强制访问本机system32文件夹,而不是模拟的WoW64文件夹。 因此,您将使用C:\Windows\sysnative\wscript.exe <path to your script>作为程序可执行文件的路径,该脚本将使用64Bit脚本主机执行,因此您可以使用注册表访问。不幸的是,MS错过了在32Bit机器上包含sysnative的机会,所以在这些系统上它不起作用。

第三种可能性也基于sysnative,但也适用于32Bit系统。如果在脚本开头包含以下代码:

If fso.FileExists("C:\Windows\SysWOW64\wscript.exe") Then ' very basic check for 64bit Windows, you can replace it with a more complicated wmi check if you find it not reliable enough
    If InStr(1, WScript.FullName, "SysWOW64", vbTextCompare) <> 0 Then ' = case insensitive check
        newFullName = Replace(WScript.FullName, "SysWOW64", "Sysnative", 1, -1, vbTextCompare) ' System32 is replaced by Sysnative to deactivate WoW64, cscript or wscript stay the same
        newArguments = "" ' in case of command line arguments they are passed on
        For Each arg In WScript.Arguments
            newArguments = newArguments & arg & " "
        Next
        wso.Run newFullName & " """ & WScript.ScriptFullName & """ " & newArguments, , False
        WScript.Quit '32 Bit Scripting Host is closed
    End If
End If

它将检查它是否是64Bit计算机,如果是,则使用本机脚本主机重新启动,保留所有参数。如果它没有检测到64Bit,它将在32Bit中正常运行。

答案 1 :(得分:0)

strValue64 = ReadRegStr(HKEY_LOCAL_MACHINE,strKeyPath64,“UninstallString”,64) strValue32 = ReadRegStr(HKEY_LOCAL_MACHINE,strKeyPath32,“UninstallString”,64) 函数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

结束功能