x64 Windows で実行できる VBScript を実行しています。レジストリの 32 ビット部分からレジストリ キーを読み取る必要があります。そのために、HKLM\Software\Wow6432Node\xyz
の代わりにパスを使用しますHKLM\Software\xyz
。スクリプトが x64 で実行されるかどうかを確認するにはどうすればよいですか?
6 に答える
64 ビット バージョンの Windows でも、スクリプトを 32 ビット モードで実行できます。
次のコードを使用して、実際のビット モードを決定できます。スクリプトを実行します。
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
スクリプトが x64 で実行されているかどうかを確認する必要があるかどうかはわかりません。
からの読み取りをHKLM\Software\Wow6432Node\xyz
試みます。それが失敗した場合は、からの読み取りを試みますHKLM\Software\xyz
。失敗した場合は、レジストリ キーが存在しません。適切なアクションを実行してください。
もちろん、設計がより複雑な場合 (たとえば、レジストリ キーが存在しない場合に値を書き込むなど)、その提案は機能しません。
オペレーティング システムを調べるための VBScript を次に示します。おそらく、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
Windows XP および 2003 では、OSArchitecture
を使用できないことに注意してください。その場合、 または を調べてCaption
、Version
OS が 64 ビットかどうかを判断する必要があります。
必要な複雑さのレベルに応じて、このようなものを使用することもできます。
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
代替ソリューション
WMIを使用する代替のより簡潔なソリューションは、ここにあります。
これは、システム アーキテクチャとプロセス アーキテクチャの両方を示しています。
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")
に必要なものをチェックしてください<> "x86"
。
レジストリから読み取るために使用する API については言及していません。たとえば、WMIStdRegProv
クラスを使用する場合__ProviderArchitecture
、スクリプトが 32 ビットまたは 64 ビットの Windows スクリプト ホストで実行されているかどうかに関係なく、フラグを使用して 32 ビット レジストリ ハイブへのアクセスを要求できます。この手法については、MSDN の記事「64 ビット プラットフォームでの WMI データの要求」で説明されています。
32 ビット レジストリからの読み取りの例を次に示します。
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
また、この場合、32 ビットのキー名は のHKLM\Software\xyz
代わりに通常の方法で指定する必要があることに注意してくださいHKLM\Software\Wow6432Node\xyz
。