wscript vbs notas ejecutar crear con como bloc archivos archivo vbscript registry 64bit wsh

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