Я запускаю VBScript, который может работать под x64 Windows. Мне нужно прочитать ключ реестра из 32-битной части реестра. Для этого я использую путь HKLM\Software\Wow6432Node\xyz вместо HKLM\Software\xyz. Как я могу проверить, выполняется ли скрипт под x64?
Как проверить, работает ли wscript/cscript на хост-системе x64?
Ответы (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-разрядной.
Вы также можете использовать что-то вроде это в зависимости от требуемый уровень сложности.
Даже в 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
Вот решение, основанное на статье базы знаний 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, можно найти здесь.
Вы не упомянули, какой 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.
Это показывает как архитектуру системы, так и архитектуру процесса:
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".
Очень простое решение — проверить, существует ли (виртуальная) папка 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 или выше.