Я запускаю VBScript, который может работать под x64 Windows. Мне нужно прочитать раздел реестра из 32-разрядной части реестра. Для этого я использую путь HKLM\Software\Wow6432Node\xyz
вместо HKLM\Software\xyz
. Как проверить, выполняется ли скрипт в x64?Как проверить, выполняется ли wscript/cscript на хост-системе x64?
ответ
Я не уверен, что вам нужно проверить, выполняется ли скрипт под 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
не доступен, в этом случае вам, вероятно, придется изучить либо Caption
или Version
, чтобы определить, является ли ваша ОС 64-битный.
Вы также можете использовать что-то вроде this в зависимости от требуемого уровня сложности.
Вы не указали, какой API вы используете для чтения из реестра. Например, если вы используете класс WMI StdRegProv
, вы можете использовать флаг __ProviderArchitecture
для запроса доступа к 32-разрядному кусту реестра независимо от того, выполняется ли сценарий под 32-разрядным или 64-разрядным узлом сценариев Windows. Этот метод описан в статье Requesting WMI Data on a 64-bit Platform в 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
.
Даже в 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
Вот решение, основанное на статье базы знаний Майкрософт 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.
Это показывает, как система и процесс архитектуры:
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"
.
Я просто читаю определенный ключ, поэтому теста для чтения с узла в Wow6432Node достаточно. Благодаря! – vividos