Как проверить, работает ли wscript/cscript на хост-системе x64?

Я запускаю VBScript, который может работать под x64 Windows. Мне нужно прочитать ключ реестра из 32-битной части реестра. Для этого я использую путь HKLM\Software\Wow6432Node\xyz вместо HKLM\Software\xyz. Как я могу проверить, выполняется ли скрипт под x64?


person vividos    schedule 17.02.2009    source источник


Ответы (6)


Я не уверен, что вам нужно проверять, выполняется ли скрипт под x64.

Попробуйте прочитать из HKLM\Software\Wow6432Node\xyz, если это не удастся, попробуйте прочитать из HKLM\Software\xyz, если это не удастся, ваш раздел реестра не существует, выполните любое подходящее действие.

Конечно, если ваш проект более сложный (например, вы записываете значение в этот ключ реестра, если он не существует), то это предложение не сработает.

Вот VBScript для изучения операционной системы. Возможно, вам также потребуется объяснение свойств , доступных в Класс Win32_OperatingSystem

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 недоступен, и в этом случае вам, вероятно, придется проверить либо Caption, либо Version, чтобы определить, является ли ваша ОС 64-разрядной.

Вы также можете использовать что-то вроде это в зависимости от требуемый уровень сложности.

person Grant Wagner    schedule 17.02.2009
comment
Я просто читаю с определенного ключа, поэтому достаточно теста на чтение с ноды в Wow6432Node. Спасибо! - person vividos; 18.02.2009

Даже в 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
person Michael Vlasov    schedule 14.10.2011

Вот решение, основанное на статье базы знаний Microsoft Как проверить, работает ли компьютер под управлением 32-разрядной или 64-разрядной операционной системы. Система:

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, можно найти здесь.

person DavidRR    schedule 20.12.2012

Вы не упомянули, какой API вы используете для чтения из реестра. Например, если вы используете класс WMI StdRegProv, вы можете использовать флаг __ProviderArchitecture для запроса доступа к 32-разрядному кусту реестра независимо от того, выполняется ли сценарий под 32-разрядной или 64-разрядной ОС Windows Script Host. Этот метод описан в разделе Запрос данных WMI на 64-разрядной платформе статья в MSDN.

Вот пример чтения из 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.

person Helen    schedule 09.07.2010

Это показывает как архитектуру системы, так и архитектуру процесса:

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".

person Michel de Ruiter    schedule 04.06.2015

Очень простое решение — проверить, существует ли (виртуальная) папка C:\Windows\sysnative. Эта папка существует только в 32-разрядных процессах, см. Файл Перенаправитель системы

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 или выше.

person Wernfried Domscheit    schedule 27.08.2018