Je cours un VBScript qui peut s'exécuter sous x64 Windows. J'ai besoin de lire une clé de registre de la partie 32 bits du registre. Pour cela, j'utilise le chemin HKLM\Software\Wow6432Node\xyz
au lieu de HKLM\Software\xyz
. Comment puis-je vérifier si le script est exécuté sous x64?Comment vérifier si wscript/cscript s'exécute sur un système d'exploitation hôte x64?
Répondre
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.
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
.
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
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.
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"
.
Je ne fais que lire à partir d'une clé spécifique, donc le test de lecture du noeud dans Wow6432Node est suffisant. Merci! – vividos