如何使用WMI确定OS平台?

时间:2009-09-11 21:38:01

标签: architecture registry wmi operating-system

我试图弄清楚WMI中是否存在将返回可在“所有”版本的Windows上运行的OS体系结构(即32位或64位)的位置。当我发现以下情况时,我以为我已经想到了我的Win2k8系统:

 Win32_OperatingSystem / OSArchitecture

我错了。 Win2k3系统上似乎不存在此字段。哎呀!

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

非常感谢任何帮助。

13 个答案:

答案 0 :(得分: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 :(得分: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"

答案 2 :(得分:5)

试试这个:

wmic cpu get DataWidth /format:list

答案 3 :(得分:3)

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

ROOT\CIMV2\Win32_Processor
AddressWidth

来自Technet

  

在32位操作系统上,该值为32且为64位   操作系统是64.这个属性是继承自的   CIM_Processor。

答案 4 :(得分:2)

经过一段时间的搜索和测试后,我想出了一个“修复/回答”,虽然这并不是我所希望的。通过注册表执行查询似乎与我在Win2k3&amp ;;实验室中的所有版本一致。 Win2k8。这是我从中提取信息的地方:

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

KEY: PROCESSOR_ARCHITECTURE

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

但是,如果有人知道一致的'Class'或注册表项将输出32 / 64,32位/ 64位或X86 / X64,我将非常感谢这些信息。

答案 5 :(得分:2)

要扩展第一个答案,请使用:

select AddressWidth from Win32_Processor where DeviceID="CPU0"

答案 6 :(得分:0)

(未经测试),但可能:

CIM_Processor Class (AddressWidth)

答案 7 :(得分: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

答案 8 :(得分:0)

我知道这已经过时了,我将来会发布这个。试着看my script。它是在BATCH中编写的,如果它在计算机上,则使用WMIC但不需要它以确定操作系统是否运行32位64位操作系统。

答案 9 :(得分:0)

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

wmic path win32_processor where deviceid="cpu0" get Addresswidth

答案 10 :(得分:0)

批处理

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

答案 11 :(得分:0)

环境变量'PROCESSOR_ARCHITECTURE'就是所需要的。就像注册表调用一样,这将返回'AMD64'或'x86'。

答案 12 :(得分:0)

这并不是您要求的,但我只是在WMI查询(组策略首选项定位)中使用它,它似乎工作到目前为止:

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