2009-02-17 19 views

Répondre

3

Je ne suis pas sûr que vous devez vérifier si le script s'exécute sous x64.

Essayez de lire à partir de HKLM\Software\Wow6432Node\xyz, si cela échoue, essayez de lire HKLM\Software\xyz, si cela échoue, votre clé de registre n'existe pas, prendre une mesure appropriée.

Bien sûr, si votre conception est plus compliquée (par exemple, si vous écrivez une valeur dans cette clé de registre si elle n'existe pas), cette suggestion ne fonctionnera pas.

Voici un VBScript pour examiner le système d'exploitation. Vous aurez probablement besoin aussi expliquer la 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 

Notez que pour Windows XP et 2003, OSArchitecture n'est pas disponible, auquel cas vous devrez probablement examiner soit le Caption ou Version pour déterminer si votre système d'exploitation est 64 bits.

Vous pouvez également utiliser quelque chose comme this en fonction du niveau de complexité dont vous avez besoin.

+0

Je ne fais que lire à partir d'une clé spécifique, donc le test de lecture du noeud dans Wow6432Node est suffisant. Merci! – vividos

1

Vous n'avez pas mentionné quelle API vous utilisez pour lire dans le registre. Par exemple, si vous utilisez la classe WMI StdRegProv, vous pouvez utiliser l'indicateur __ProviderArchitecture pour demander l'accès à la ruche de registre 32 bits, que le script soit exécuté sous Windows Script Host 32 bits ou 64 bits. Cette technique est décrite dans l'article Requesting WMI Data on a 64-bit Platform dans MSDN.

Voici un exemple de lecture du registre 32 bits:

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 

Notez également que, dans ce cas, les 32 bits les noms clés doivent être spécifiés de manière habituelle comme HKLM\Software\xyz au lieu de HKLM\Software\Wow6432Node\xyz.

4

Même sur une version 64 bits de Windows, le script peut s'exécuter en mode 32 bits.

Vous pouvez utiliser le code suivant pour déterminer réel mode binaire, vous créez un script en cours d'exécution sur:

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

Voici une solution basée sur l'article de base de connaissances Microsoft 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 

ALTERNATIVE SOLUTION

Une solution alternative et plus concise qui utilise WMI peut être trouvé here.

0

Cela montre à la fois le système et les architectures processus:

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

juste vérifier celui que vous avez besoin pour <> "x86".