如何检查wscript / cscript是否在x64主机操作系统上运行?

时间:2009-02-17 10:48:45

标签: vbscript registry 64-bit wsh

我正在运行可能在x64 Windows下运行的VBScript。我需要从注册表的32位部分读取注册表项。为此,我使用路径HKLM\Software\Wow6432Node\xyz而不是HKLM\Software\xyz。如何检查脚本是否在x64下执行?

6 个答案:

答案 0 :(得分:4)

即使在64位版本的Windows上,您的脚本也可以在32位模式下执行。

您可以使用以下代码确定实际位模式,您可以在脚本上运行:

option explicit

function Determine64BitMode
    dim Shell, Is64BitOs
    set Shell = CreateObject("WScript.Shell")
    on error resume next
    Shell.RegRead "HKLM\Software\Microsoft\Windows\CurrentVersion\ProgramFilesDir (x86)"
    Is64BitOs = Err.Number = 0
    on error goto 0
    if Is64BitOs then
        Determine64BitMode = InStr(Shell.RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\ProgramFilesDir"), "(x86)") = 0
    else
        Determine64BitMode = false
    end if
end function

dim ExecutingIn64BitMode
ExecutingIn64BitMode = Determine64BitMode
if ExecutingIn64BitMode then
    MsgBox "64 bit"
else
    MsgBox "32 bit"
end if

答案 1 :(得分:3)

我不确定您是否需要检查脚本是否在x64下执行。

尝试从HKLM\Software\Wow6432Node\xyz读取,如果失败,请尝试从HKLM\Software\xyz读取,如果失败,则您的注册表项不存在,请采取适当的操作。

当然,如果您的设计更复杂(例如,如果它不存在,则将值写入该注册表项),那么该建议将不起作用。

这是用于检查操作系统的VBScript。您可能还需要解释Properties available from the Win32_OperatingSystem Class

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")        

Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")

For Each objOperatingSystem in colOperatingSystems
    msg = objOperatingSystem.Caption & " " & _
            objOperatingSystem.Version & " " & _
                objOperatingSystem.OSArchitecture
    msgbox msg
Next

请注意,对于Windows XP和2003,OSArchitecture不可用,在这种情况下,您可能需要检查CaptionVersion以确定您的操作系统是否为64-位。

您还可以使用this之类的内容,具体取决于您需要的复杂程度。

答案 2 :(得分:1)

您没有提到用于从注册表中读取的API。例如,如果使用WMI StdRegProv类,则可以使用__ProviderArchitecture标志来请求访问32位注册表配置单元,无论脚本是在32位还是64位下运行Windows脚本宿主。 MSDN中的Requesting WMI Data on a 64-bit Platform文章对此技术进行了描述。

以下是从32位注册表中读取的示例:

strComputer = "."
Const HKLM = &h80000002

''# Specify the required registry bitness
Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
oCtx.Add "__ProviderArchitecture", 32
oCtx.Add "__RequiredArchitecture", True

''# Load the 32-bit registry provider
Set oLocator = CreateObject("WbemScripting.SWbemLocator")
Set oWMI = oLocator.ConnectServer(strComputer, "root\default",,,,,, oCtx)
Set oReg = oWMI.Get("StdRegProv") 

''# Specify input parameters for the GetStringValue method call
Set oInParams = oReg.Methods_("GetStringValue").InParameters
oInParams.hDefKey     = HKLM
oInParams.sSubKeyName = "Software\xyz"
oInParams.sValueName  = "foobar"

''# Read a string value from the registry
Set oOutParams = oReg.ExecMethod_("GetStringValue", oInParams,, oCtx)
WScript.Echo oOutParams.sValue

另请注意,在这种情况下,32位密钥名称应以通常的方式指定为HKLM\Software\xyz而不是HKLM\Software\Wow6432Node\xyz

答案 3 :(得分:1)

以下是基于Microsoft知识库文章How To Check If Computer Is Running A 32 Bit or 64 Bit Operating System的解决方案:

Function Is64BitOS()
    Is64BitOS = Not(Is32BitOS())
End Function

Function Is32BitOS()
    Const sRegKey = "HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0"
    Const sIdentifierValue = "Identifier"
    Const sPlatformIDValue = "Platform ID"

    Dim oSh : Set oSh = CreateObject("WScript.Shell")
    Dim sIdentifier, nPlatformID

    sIdentifier = oSh.RegRead(sRegKey & "\" & sIdentifierValue)
    nPlatformID = oSh.RegRead(sRegKey & "\" & sPlatformIDValue)

    Set oSh = Nothing

    If InStr(sIdentifier, "x86") > 0 And nPlatformID = 32 Then
        Is32BitOS = True
    Else
        Is32BitOS = False
    End if
End Function

替代解决方案

可以找到使用 WMI 的替代且更简洁的解决方案here

答案 4 :(得分:1)

一个非常简单的解决方案是检查(虚拟)文件夹C:\Windows\sysnative是否存在。此文件夹仅存在于32位进程中,请参见File System Redirector

Set fso = CreateObject("Scripting.FileSystemObject")
Set wshShell = CreateObject( "WScript.Shell" )

If fso.FolderExists(wshShell.ExpandEnvironmentStrings("%windir%") & "\sysnative" ) Then
    WScript.Echo "You are running in 32-Bit Mode"
Else
    WScript.Echo "You are running in 64-Bit Mode"
End if

注意,仅适用于Windows Server 2003和Windows XP或更高版本。

答案 5 :(得分:0)

这显示了系统和流程架构:

Option Explicit
Dim WshShell, WshEnv
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshEnv = WshShell.Environment("System")
MsgBox "System: " & WshEnv("PROCESSOR_ARCHITECTURE")
Set WshEnv = WshShell.Environment("Process")
MsgBox "Process: " & WshEnv("PROCESSOR_ARCHITECTURE")

只需检查<> "x86"所需的那个。