vbscript - vbs - ¿Cómo puedo verificar si wscript/cscript se ejecuta en el sistema operativo host x64?
createobject wscript shell (5)
Estoy ejecutando un VBScript que puede ejecutarse bajo x64 Windows. Necesito leer una clave de registro de la parte de 32 bits del registro. Para eso utilizo la ruta HKLM/Software/Wow6432Node/xyz
lugar de HKLM/Software/xyz
. ¿Cómo puedo verificar si el script se ejecuta bajo x64?
No estoy seguro de que deba verificar si el script se está ejecutando en x64.
Intente leer desde HKLM/Software/Wow6432Node/xyz
, si eso falla, intente leer desde HKLM/Software/xyz
, si eso falla, su clave de registro no existe, realice las acciones apropiadas.
Por supuesto, si su diseño es más complicado (por ejemplo, escribe un valor en esa clave de registro si no existe), esa sugerencia no funcionará.
Aquí hay un VBScript para examinar el sistema operativo. Probablemente también necesite una explicación de las Propiedades disponibles de la clase 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
Tenga en cuenta que para Windows XP y 2003, OSArchitecture
no está disponible, en cuyo caso es probable que tenga que examinar el Caption
o la Version
para determinar si su sistema operativo es de 64 bits.
También podría usar algo como esto dependiendo del nivel de complejidad que requiera.
No mencionó qué API usa para leer en el registro. Por ejemplo, si usa la clase WMI StdRegProv
, puede utilizar el indicador __ProviderArchitecture
para solicitar acceso al sector de registro de 32 bits, independientemente de si el script se ejecuta en Windows Script Host de 32 o 64 bits. Esta técnica se describe en Requesting WMI Data en un artículo de plataforma de 64 bits en MSDN.
Aquí hay un ejemplo de lectura del registro de 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
Tenga en cuenta también que, en este caso, los nombres de las claves de 32 bits deben especificarse de forma habitual como HKLM/Software/xyz
lugar de HKLM/Software/Wow6432Node/xyz
.
Incluso en la versión de 64 bits de Windows tu script puede ejecutarse en modo de 32 bits.
Puede usar el siguiente código para determinar el modo de bit real, el script que se ejecuta en:
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
Esto muestra las arquitecturas de sistema y proceso:
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")
Simplemente marque el que necesita para <> "x86"
.
Aquí hay una solución basada en el artículo de la base de conocimiento de Microsoft Cómo verificar si la computadora está ejecutando un sistema operativo de 32 bits o 64 bits :
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
SOLUCIÓN ALTERNATIVA
Una solución alternativa y más concisa que hace uso de WMI se puede encontrar aquí .