web-dev-qa-db-ja.com

WMIでOSプラットフォームを決定する方法は?

「すべての」バージョンのWindowsで機能するOSアーキテクチャ(32ビットまたは64ビット)を返す場所がWMIにあるかどうかを調べようとしています。次のことを見つけたとき、Win2k8システムを見てそれを理解したと思いました。

 Win32_OperatingSystem / OSArchitecture

私は間違っていた。このフィールドがWin2k3システムに存在するようには見えません。ああ!

では、サーバーのバージョン間で「同じ」であるWMIの別のフィールドを知っている人はいますか?そうでない場合は、同じレジストリキーはどうですか?単純なフィールドクエリの構成のみを許可するツールを使用しているため、複雑なスクリプトを使用して実行することはできません。

どんな助けでも大歓迎です。

11
user172286

しばらく検索してテストした後、私は「修正/回答」を思いつきましたが、それは私が望んでいたものではありません。レジストリを介してからクエリを実行すると、Win2k3およびWin2k8のラボにあるすべてのバージョンで一貫しているように見えます。ここから情報を引き出します。

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

KEY: PROCESSOR_ARCHITECTURE

X86またはAMD64が表示されます。完璧ではありませんが、少なくとも毎回正しい答えが得られます。

それでも、32/64、32ビット/ 64ビット、またはX86/X64を出力する一貫した「クラス」またはレジストリキーを知っている人がいれば、その情報をいただければ幸いです。

2
user172286

プロセッサではなくオペレーティングシステムアーキテクチャが必要な場合、これは64ビットのWindows5.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 & "}"
6
gudbarnone

使用した単純なWMIクエリは、実際にコンピューター内のすべての物理CPUの結果を返します。シングルプロセッサ、マルチコアCPUを使用している場合、1つの結果のみが返されます。コンピュータには少なくとも1つのCPUがあると安全に想定できるので、CPU0からの情報だけを使用してみましょう。

64ビットオペレーティングシステムのみを選択するには...

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

32ビットオペレーティングシステムのみを選択するには...

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

これを試して:

wmic cpu get DataWidth /format:list
5

次のWMIクラスとプロパティを使用します-これは2003/XPおよびWin7/2008R2で機能するはずです

ROOT\CIMV2\Win32_Processor
AddressWidth

から Technet

32ビットオペレーティングシステムでは、値は32であり、64ビットオペレーティングシステムでは、64です。このプロパティはCIM_Processorから継承されます。

3
user1141792

最初の答えを拡張するには、これを使用します。

select AddressWidth from Win32_Processor where DeviceID="CPU0"
2
TMassa

私はこれが古いことを知っています、私は将来誰のためにでもこれを投稿しています。 私のスクリプト を見てみてください。 BATCHで記述されており、コンピューター上にある場合はWMICを使用しますが、OSが32ビットの64ビットOSを実行しているかどうかを判断するためにWMICを使用する必要はありません。

0
Computer Repair

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
0
fboulant

(テストされていません)が、多分:

CIM_Processorクラス(AddressWidth)

0
ChristopheD

プラットフォームを決定するために、wmicを使用して以下の構文を試すことができます。

wmic path win32_processor where deviceid="cpu0" get Addresswidth
0
Joe

これは正確にはあなたが求めていたものではありませんが、私はこれをWMIクエリ(グループポリシー設定のターゲティング)で使用しただけで、これまでのところ機能しているようです。

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

バッチで

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
Stenka Razin

必要なのは環境変数「PROCESSOR_ARCHITECTURE」だけです。レジストリ呼び出しと同様に、これは「AMD64」または「x86」のいずれかを返します。

0
Tony D