Как определить платформу ОС с WMI? - PullRequest
11 голосов
/ 12 сентября 2009

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

 Win32_OperatingSystem / OSArchitecture

Я был не прав. Похоже, что это поле не существует в системах Win2k3. Argh!

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

Любая помощь будет принята с благодарностью.

Ответы [ 13 ]

6 голосов
/ 03 августа 2012

Если вам нужна архитектура операционной системы, а не процессора, это работает, если вы уверены, что у вас нет 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 & "}"
5 голосов
/ 06 июня 2011

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

wmic cpu get DataWidth /format:list
5 голосов
/ 04 мая 2010

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

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

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

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

select * from Win32_Processor where DeviceID="CPU0" and AddressWidth="32"
3 голосов
/ 11 января 2012

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

ROOT\CIMV2\Win32_Processor
AddressWidth

С Technet :

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

2 голосов
/ 14 сентября 2011

Чтобы расширить первый ответ, используйте это:

select AddressWidth from Win32_Processor where DeviceID="CPU0"
2 голосов
/ 12 сентября 2009

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

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

KEY: PROCESSOR_ARCHITECTURE

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

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

0 голосов
/ 29 августа 2017

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

SELECT * FROM Win32_ComputerSystem WHERE SystemType="x64-based pc"
0 голосов
/ 21 мая 2015

Переменная среды 'PROCESSOR_ARCHITECTURE' - это все, что нужно. Так же, как и вызов реестра, он вернет либо AMD64, либо x86.

0 голосов
/ 24 мая 2012

В партии

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
0 голосов
/ 16 мая 2012

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

wmic path win32_processor where deviceid="cpu0" get Addresswidth
...