如何使用WMI确定操作系统平台?

11

我正在尝试找出WMI中是否有一个位置可以返回操作系统体系结构(即32位或64位),这将在“所有”Windows版本上工作。当我查看我的Win2k8系统时,我以为我已经找到了答案,发现了以下内容:

 Win32_OperatingSystem / OSArchitecture

我错了。在Win2k3系统中似乎不存在这个字段。唉!

那么,有没有人知道WMI中的另一个字段与各个服务器版本都“相同”?如果没有,是否有注册表键是相同的?我正在使用一个只允许我配置简单字段查询的工具,因此无法使用复杂的脚本执行。

非常感谢任何帮助。

13个回答

6

如果您需要操作系统架构而不是处理器,只要您确信没有64位的Windows 5.x系统,这个方法就可以使用:

Set colItems = objWMI.ExecQuery("Select * from Win32_OperatingSystem",,48)  
on error resume next  

For Each objItem in colItems  
    Ver = objItem.Version  
    OSname = split(objItem.Name,"|")  
    Arch = "32-bit"  
    if left(Ver,3) >= 6.0 then    ' 5.x doesn't support this property  
        Arch = objItem.OSArchitecture  
    end if  
Next  
wscript.echo " OS Version: " & Ver & " {" & trim(OSname(0)) & " " & Arch & "}"

1
在无尽的滚动中,这是我看到的第一个回答问题的,与处理器架构不同的操作系统架构。 - MDMoore313
@BigHomie,OSArchitecture属性在2k3服务器或XP上不可用。 - Tom Pickles
@TomPickles 这个回答的发布者已经表明了这一点,而且 OP 没有限制答案只针对特定的操作系统系列,因此这个答案与专门针对 Win5.x 的答案一样有效。 - MDMoore313
@BigHomie 啊,没看到那个。我的错。 - Tom Pickles

5

您使用的简单WMI查询确实会为计算机中的每个物理CPU返回结果。如果您有单处理器、多核CPU,则只会返回一个结果。我们可以安全地假设计算机至少有一个CPU,因此让我们只使用来自CPU0的信息。

要仅选择64位操作系统...

select * from Win32_Processor where DeviceID="CPU0" and AddressWidth="64"

选择仅限32位操作系统...

select * from Win32_Processor where DeviceID="CPU0" and AddressWidth="32"

1
+1 是因为这个方法可行,但我还是更喜欢 Win32_OperatingSystem.OSArchitecture。可能是习惯使然。 - MDMoore313

5

试试这个:

wmic cpu get DataWidth /format:list

3
请使用以下WMI类和属性-这应该适用于2003 / XP和Win7 / 2008R2。
ROOT\CIMV2\Win32_Processor
AddressWidth

来自Technet:

在32位操作系统上,该值为32,在64位操作系统上,该值为64。此属性继承自CIM_Processor。


2

经过一段时间的搜索和测试,我找到了一个“修复/答案”,尽管这不完全是我所希望的。通过注册表执行查询似乎在我实验室中所有Win2k3和Win2k8的版本上都是一致的。以下是我获取信息的位置:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment

KEY: PROCESSOR_ARCHITECTURE

它显示x86或AMD64。虽然不完美,但至少每次都给我正确的答案。

但是,如果有人知道一个一致的“类”或注册表键,可以输出32/64、32位/64位或X86/X64,我将非常感激提供的信息。


1
你为什么要查询ControlSet001而不是CurrentControlSet?我使用后者也能正常工作。 - Daniel.S
@user172286 CurrentControlSet 肯定更好。我有一台 Windows 计算机,其中注册表键 HKLM\SYSTEM\Select 具有注册表双字 Current 值为 3LastKnownGood 值为 2,现在仅存在 ControlSet003 作为 CurrentControlSetControlSet002。这是因为多年前使用 ControlSet001 启动 Windows 失败,并在将最后已知的好的 ControlSet002 复制到 ControlSet003 后被 Windows 删除所致。 - Mofi

2

进一步阐述第一个答案,可以使用以下方法:

select AddressWidth from Win32_Processor where DeviceID="CPU0"

0

这并不是你要求的完全一样,但我在一个 WMI 查询中使用了它(组策略首选项定位),到目前为止似乎能够正常工作:

SELECT * FROM Win32_ComputerSystem WHERE SystemType="x64-based pc"

0
您可以尝试使用wmic语法来确定平台,具体如下所示:

wmic path win32_processor where deviceid="cpu0" get Addresswidth

0

在VBS中:

On Error Resume Next

Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20

Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Processor", "WQL", _
                                          wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
   WScript.Echo "AddressWidth: " & objItem.AddressWidth
Next

1
François,感谢您的回复!不幸的是,我正在尝试找到一个“简单”的WMI查询,而不是实际构建一个查询。换句话说,我想在WMI中找到一个单一的条目,以列出处理器类型,以便与某些特殊软件一起使用。我无法生成查询,只能提供在WMI中查找数据的位置。谢谢!祝好... Cary - user172286

0

我知道这是老的内容,但我为未来的任何人发布此内容。尝试查看我的脚本。它是用BATCH编写的,如果计算机上有WMIC,则使用它,但不需要它来确定操作系统是否运行32位或64位操作系统。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接