Как проверить, работает ли wscript / cscript на операционной системе хоста x64? - PullRequest
5 голосов
/ 17 февраля 2009

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

Ответы [ 6 ]

4 голосов
/ 14 октября 2011

Даже в 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
3 голосов
/ 17 февраля 2009

Я не уверен, что вам нужно проверить, выполняется ли скрипт под 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-битной.

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

1 голос
/ 27 августа 2018

Очень простое решение - проверить, существует ли (виртуальная) папка 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 или выше.

1 голос
/ 20 декабря 2012

Вот решение, основанное на статье базы знаний 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 , можно найти здесь .

1 голос
/ 09 июля 2010

Вы не упомянули, какой 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.

0 голосов
/ 04 июня 2015

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

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

...