Как определить платформу ОС с помощью WMI?

Я пытаюсь выяснить, есть ли в WMI место, которое вернет архитектуру ОС (т. е. 32-разрядную или 64-разрядную), которая будет работать во всех "всех" версиях Windows. Я думал, что понял это, глядя на мою систему Win2k8, когда я нашел следующее:

 Win32_OperatingSystem / OSArchitecture

Я был неправ. Не кажется, что это поле существует в системах Win2k3. Аргх!

Итак, кто-нибудь знает о другом поле в WMI, которое "является" одинаковым для всех версий сервера? Если нет, то как насчет тот же самый раздел реестра? Я использую инструмент, который позволяет мне настраивать только простые запросы полей, поэтому я не могу использовать сложный скрипт для выполнения.

любая помощь была бы весьма признательна.

13 ответов


попробуйте это:

wmic cpu get DataWidth /format:list

простой запрос WMI, который вы использовали, действительно возвращает результат для каждого физического процессора на компьютере. Он вернет только один результат, если у вас есть один процессор, несколько основных процессоров. Мы можем с уверенностью предположить, что компьютер имеет по крайней мере один процессор, поэтому давайте просто использовать информацию из CPU0.

для выбора только 64-разрядных операционных систем...

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

для выбора только 32-разрядных операционных систем...

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

Если вам нужна архитектура операционной системы, а не процессор, это работает, если вы уверены, что у вас нет 64-битной Windows 5.х систем:

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 & "}"

используйте следующий класс и свойство WMI-это должно работать на 2003/XP и Win7/2008R2

ROOT\CIMV2\Win32_Processor
AddressWidth

С в TechNet:

в 32-разрядной операционной системе значение равно 32, а в 64-разрядной операционная система-64. Это свойство наследуется от CIM_Processor.


после некоторого времени поиска и тестирования я придумал "исправление/ответ", хотя это не совсем то, на что я надеялся. Выполнение запроса через реестр, по-видимому, согласовано во всей версии, которую я имею в своей лаборатории для Win2k3 & Win2k8. Вот откуда я черпаю информацию:

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

KEY: PROCESSOR_ARCHITECTURE

он отображает x86 или AMD64. Она не идеальна, но по крайней мере это дает мне правильный ответ каждый раз.

тем не менее, если кто-нибудь знает согласованный "класс" или раздел реестра, который будет выводить 32/64, 32-бит/64-бит или X86 / X64, я был бы очень признателен за информацию.


чтобы развернуть первый ответ, используйте следующее:

select AddressWidth from Win32_Processor where DeviceID="CPU0"

(не проверено), но, возможно:

Класс CIM_Processor (AddressWidth)


в 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

в пакете

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

вы можете попробовать синтаксис ниже, используя wmic для определения платформы:

wmic path win32_processor where deviceid="cpu0" get Addresswidth

Я знаю, что это старый, я публикую это для всех в будущем. Попробуйте посмотреть на мой скрипт. Он написан в пакете и использует WMIC, если он находится на компьютере, но не нуждается в нем, чтобы определить, работает ли ОС 32 бит 64-битной ОС.


переменная среды "PROCESSOR_ARCHITECTURE" - это все, что нужно. Просто как позвонить в реестре это вернуть или amd64 или х86'.


Это не совсем то, что вы просили, но я просто использовал это в запросе WMI( таргетинг предпочтений групповой политики), и он, похоже, работает до сих пор:

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