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

Architecture 如何使用WMI确定操作系统平台?,architecture,registry,wmi,operating-system,Architecture,Registry,Wmi,Operating System,我试图找出WMI中是否有一个位置将返回操作系统体系结构(即32位或64位),该体系结构将在“所有”版本的Windows中工作。当我发现以下内容时,我认为我已经通过查看我的Win2k8系统找到了答案: Win32_OperatingSystem / OSArchitecture 我错了。Win2k3系统上似乎不存在此字段。啊 那么,是否有人知道WMI中的另一个字段在不同的服务器版本中“是”相同的?如果不是,那么相同的注册表项呢?我使用的工具只允许我配置简单的字段查询,所以我不能使用复杂的脚本来

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

 Win32_OperatingSystem / OSArchitecture
我错了。Win2k3系统上似乎不存在此字段。啊

那么,是否有人知道WMI中的另一个字段在不同的服务器版本中“是”相同的?如果不是,那么相同的注册表项呢?我使用的工具只允许我配置简单的字段查询,所以我不能使用复杂的脚本来执行

任何帮助都将不胜感激。

(未经测试),但可能:


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

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

KEY: PROCESSOR_ARCHITECTURE
它显示x86或AMD64。这并不完美,但至少每次都能给我正确的答案


不过,如果有人知道将输出32/64、32位/64位或X86/X64的一致“类”或注册表项,我将非常感谢您提供这些信息。

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

要仅选择64位操作系统

select * from Win32_Processor where DeviceID="CPU0" and AddressWidth="64"
select * from Win32_Processor where DeviceID="CPU0" and AddressWidth="32"
要仅选择32位操作系统

select * from Win32_Processor where DeviceID="CPU0" and AddressWidth="64"
select * from Win32_Processor where DeviceID="CPU0" and AddressWidth="32"
在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
试试这个:

wmic cpu get DataWidth /format:list

我知道这是旧的,我张贴这对任何人在未来。试试看。它是批量编写的,如果它在计算机上,但不需要它,则使用WMIC来确定操作系统是否运行32位或64位操作系统。

要展开第一个答案,请使用以下命令:

select AddressWidth from Win32_Processor where DeviceID="CPU0"

使用以下WMI类和属性-这应该适用于2003/XP和Win7/2008R2

ROOT\CIMV2\Win32_Processor
AddressWidth
发件人:

在32位操作系统上,值为32,而在64位操作系统上,值为32 操作系统是64。此属性继承自 CIM_处理器


您可以使用wmic尝试以下语法来确定平台:

wmic path win32_processor where deviceid="cpu0" get Addresswidth
成批

IF EXIST "%PROGRAMFILES% (x86)" goto 64BIT
goto 32BIT

:64BIT
echo tantalana a 64 bit
goto FINE

:32BIT
echo tantalaniccia a 32 bit
goto FINE

:FINE
echo ciao

如果您需要操作系统体系结构而不是处理器,那么如果您确信没有64位Windows 5.x系统,这一点就可以实现:

Set colItems=objWMI.ExecQuery(“从Win32\u操作系统中选择*”,48)
出错时继续下一步
对于每个对象,在colitem中
Ver=objItem.Version
OSname=split(objItem.Name,“|”)
Arch=“32位”
如果left(Ver,3)>=6.0,则“5.x”不支持此属性
Arch=objItem.OSArchitecture
如果结束
下一个
wscript.echo“OS版本:”&Ver&“{”&trim(OSname(0))&“&Arch&}”

环境变量“PROCESSOR\u ARCHITECTURE”就是所需的全部。与注册表调用一样,这将返回“AMD64”或“x86”

这并不完全是您所要求的,但我只是在WMI查询(组策略首选项目标)中使用了它,到目前为止它似乎有效:

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

Christophe,这似乎返回了正确的架构。但是,如果有超过一(1)个CPU,则简单的WMI查询似乎会为每个CPU返回“AddressWidth”。如果您还有其他想法,我们将不胜感激!非常感谢!!!干杯CaryFrançois,谢谢你的回复!不幸的是,我试图找到一个“简单”的WMI查询,而不是实际构建查询。换句话说,我想在WMI中对一个条目进行分类,该条目将列出用于某些特殊软件的处理器类型。我无法生成查询,我只能在WMI中提供查找数据的位置。谢谢干杯CaryYou没有按照OP的要求使用WMI。您为什么要查询ControlSet001而不是CurrentControlSet?使用后者,我的工作正常。@user172286
CurrentControlSet
肯定会更好。我有一台Windows计算机,其中注册表项
HKLM\SYSTEM\Select
具有注册表双字
Current
,值
3
lastnowngood
2
,现在只存在
ControlSet003
CurrentControlSet
ControlSet002
。这是因为用
ControlSet001启动Windows几年前就失败了,在将上一个已知的好
ControlSet002
复制到
ControlSet003
后被Windows删除了。在无休止地滚动之后,这是我看到的第一个回答这个问题的方法,操作系统体系结构与处理器体系结构相反。@BigHomie OSArchitecture属性不适用于2k3服务器或XP。@TomPickles此答案的海报清楚地说明了这一点,并且OP没有将答案限制为特定的操作系统系列,因此此答案与专门针对Win5的答案一样有效。x@BigHomie啊,我没看到。我的缺点。+1 b/c这是可行的,但我仍然更喜欢
Win32_OperatingSystem.OSArchitecture
,我想这是习惯的产物。如果运行在32位环境中的64位Windows上的x86应用程序正在访问环境变量
PROCESSOR_ARCHITECTURE
,这是不正确的,正如Microsoft在关于的第页上记录的那样。