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

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

 Win32_OperatingSystem / OSArchitecture

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

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

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

Ответ 1

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

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

KEY: PROCESSOR_ARCHITECTURE

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

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

Ответ 2

Простой запрос 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

Попробуйте следующее:

wmic cpu get DataWidth /format:list

Ответ 4

Если вам нужна архитектура операционной системы, а не процессор, это работает, если вы уверены, что у вас нет 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

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

ROOT\CIMV2\Win32_Processor
AddressWidth

Из Техника:

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

Ответ 6

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

select AddressWidth from Win32_Processor where DeviceID="CPU0"

Ответ 8

В 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

Ответ 9

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

Ответ 10

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

wmic path win32_processor where deviceid="cpu0" get Addresswidth

Ответ 11

В пакетном режиме

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

Ответ 12

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

Ответ 13

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

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