在 VBScript 中仅使用 FileSystemObject,如何确定操作系统的处理器体系结构?

Using Only FileSystemObject in a VBScript, How Can I Determine the Operating System's Processor Architecture?

在 Windows RT 上的 VBScript 中,a running script only has access to three COM objects,其中之一是 Scripting.FileSystemObject

如何仅使用 FileSystemObject 来确定操作系统的处理器架构(在本例中为ARM)?

通常我会查询 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment -> PROCESSOR_ARCHITECTURE,或者我会使用 WScript.Shell 来获取系统级环境变量 PROCESSOR_ARCHITECTURE。但是,我不能在这种情况下使用通常的技术。

注意:我考虑过使用 Scripting.FileSystemObject 获取 ntoskrnl.exe 的文件版本,这会告诉我我使用的是 Windows 6.3 版。然后在尝试创建 WScript.Shell 对象并失败后,假设我必须在 ARM Windows RT 设备上。但是,这感觉很草率。已经有一段时间了,但我已经看到防病毒干扰在 VBScript 中实例化对象的能力的情况,我希望这段代码是 accurate/reliable.

On error resume Next
Set X = createobject("shell.application")
If err.number <> 0 then
    MsgBox "winrt"
    err.clear
End if
On error Goto 0

所以在编程中,我们尝试测试发生了什么,而不是试图弄清楚可能发生什么。

基于 this answer,我能够组合一个强大的 VBScript 函数,从可执行文件的 PE header 读取“机器类型”。

函数及其先决条件太长 post,但我已将它们添加到 my GitHub repository 上名为 GetExecutableProcessorArchitectureFromFile.vbs 的文件中。

使用函数 GetExecutableProcessorArchitectureFromFile(),我们可以使用如下代码在 Windows RT(或任何其他 Windows 操作系统)上获取操作系统处理器架构:

' Note: it's best to get the Windows path programmatically; however, the scope of doing so is outside the scope of this question
strWindowsPath = "C:\Windows"
intReturnCode = GetExecutableProcessorArchitectureFromFile(strOSProcessorArchitecture, strWindowsPath & "\explorer.exe")
If intReturnCode >= 0 Then
    WScript.Echo("OS Processor Architecture=" & strOSProcessorArchitecture)
End If

我已经在 Intel IA-32(32 位 x86)、AMD64 / Intel x86-x84(x64)、ARM(32 位)、ARM64、Alpha、PowerPC 和 MIPS 可执行文件上测试了这项技术。


注意:我最终使用了 %WINDIR%\explorer.exe,因为 explorer.exe 存在于所有支持 VBScript 的 Windows 版本中,不包括 Windows Server Core 和Nano,一直回到 Windows 95 运行 VBScript 5.1。构建如下逻辑树会更健壮:

  • 检查 C:\Windows\Sysnative\ntoskrnl.exe(此路径允许 Windows-on-Windows (WOW) 进程 - 例如,64 位 Windows 上的 32 位 cscript.exe - 访问“本机”系统二进制文件。但是,请注意:如果缺少 KB942589,此方法将不适用于 Windows XP 和 Windows Server 2003/2003 R2 x64。如果当前进程为 运行 在 OS-native 处理器架构下。但是,我的函数可以优雅地处理故障)
  • 如果之前的尝试失败(即 intReturnCode < 0),请检查 C:\Windows\System32\ntoskrnl.exe
  • 如果之前的尝试失败(即 intReturnCode < 0),请检查 C:\Windows\System\krnl386.exe(Windows 95、98 和 ME)
  • 如果之前的尝试失败(即 intReturnCode < 0),请检查 C:\Windows\explorer.exe

注意 2:如果有人需要有关如何以编程方式获取 Windows 或 Windows 系统路径的指针,请参阅 [=24= 中的 GetWindowsPath.vbsGetWindowsSystemPath.vbs ].