2009-02-17 6 views
5

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

ответ

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

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

+0

Я просто читаю определенный ключ, поэтому теста для чтения с узла в Wow6432Node достаточно. Благодаря! – vividos

1

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

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

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

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