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
en lugar de HKLM\Software\xyz
. ¿Cómo puedo verificar si el script se ejecuta bajo x64?¿Cómo puedo comprobar si wscript/cscript se ejecuta en el sistema operativo host x64?
Respuesta
No estoy seguro de que necesite comprobar 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), entonces esa sugerencia no funcionará.
Aquí hay un VBScript para examinar el sistema operativo. Es posible que también necesita explicación de 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
Tenga en cuenta que para Windows XP y 2003, OSArchitecture
no está disponible, en cuyo caso es probable que tenga a examinar ya sea la Caption
Version
o para determinar si su sistema operativo es 64 bits
También podría usar algo como this dependiendo del nivel de complejidad que requiera.
No mencionó qué API utiliza para leer en el registro. Por ejemplo, si utiliza la clase WMI StdRegProv
, puede usar el indicador __ProviderArchitecture
para solicitar acceso al segmento de registro de 32 bits, independientemente de si el script se ejecuta en Windows Script Host de 32 bits o 64 bits. Esta técnica se describe en el artículo Requesting WMI Data on a 64-bit Platform en MSDN.
He aquí un ejemplo de la 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 clave de 32 bits deben especificarse de manera habitual como HKLM\Software\xyz
en lugar de HKLM\Software\Wow6432Node\xyz
.
Incluso en la versión de 64 bits de Windows, su script puede ejecutarse en modo de 32 bits.
Puede utilizar siguiente código para determinar el modo de bits real, script que corre 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
Aquí es una solución basada en la base de conocimientos artículo de 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
SOLUCIÓN ALTERNATIVA
Una solución alternativa y más concisa que hace uso de WMI se puede encontrar here.
Esta muestra tanto el sistema y el proceso arquitecturas:
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")
Sólo echa el que necesita para <> "x86"
.
- 1. ¿Cómo comprobar si el sistema operativo es Vista en Python?
- 2. ¿Cómo comprobar si el programa se ejecuta desde una consola?
- 3. Cómo comprobar el sistema operativo dentro de R
- 4. ¿Cómo puedo verificar si una aplicación se ejecuta en Android?
- 5. Cómo determinar el sistema operativo
- 6. ¿Cómo puedo determinar el sistema operativo y el nombre de host utilizando el ceceo común?
- 7. Cómo determinar el sistema operativo en elisp?
- 8. Comprobar si el proceso se ejecuta en Windows/Linux
- 9. Cómo comprobar si Google Test se ejecuta en mi código
- 10. C# Comprobar si se ejecuta como administrador
- 11. ¿Cómo detectar el sistema operativo en ejecución?
- 12. cómo comprobar si sshd se ejecuta en una máquina remota
- 13. ¿Cómo hacer que SQL Server se ejecute en Virtual PC accesible para el sistema operativo host?
- 14. ¿Cómo comprobar si una dirección IP es el host local en un sistema de múltiples hosts?
- 15. ¿Cómo copiar un archivo desde VirtualBox al sistema operativo host?
- 16. Detectar el sistema operativo
- 17. ¿PHP tiene una función para detectar el sistema operativo en el que se ejecuta?
- 18. ¿Cómo puedo comprobar si el sistema operativo es Sun OS o Unix o Solaris a partir de bashrc
- 19. ¿Cómo puedo encontrar el sistema operativo actual en Python?
- 20. ¿Cómo puedo detectar el sistema operativo en Perl?
- 21. ¿Cómo se implementa sleep en el nivel del sistema operativo?
- 22. ¿Cómo puedo reemplazar el calendario predeterminado del sistema operativo Android?
- 23. Identificando si el sistema operativo es (abierto) SUSE en Python?
- 24. Acceso a HBase se ejecuta en VM con un cliente en el sistema host
- 25. ¿Cómo puedo cambiar las unidades usando el sistema operativo python?
- 26. Acceso Tomcat localhost: 8080 de VirtualBox VM invitado desde el sistema operativo host
- 27. ¿Es posible ejecutar el ensamblaje x86 en un sistema operativo x64?
- 28. ¿Cómo puedo saber si estoy en x64 o x86 usando .NET?
- 29. ¿Cómo no especifico un tema para WPF y uso el tema del sistema operativo host?
- 30. ¿Cómo comprobar si el programa se ejecuta con el control de Visual Studio?
Estoy leyendo desde una tecla específica, por lo que la prueba de lectura desde el nodo en Wow6432Node es suficiente. ¡Gracias! – vividos