「すべての」バージョンのWindowsで機能するOSアーキテクチャ(32ビットまたは64ビット)を返す場所がWMIにあるかどうかを調べようとしています。次のことを見つけたとき、Win2k8システムを見てそれを理解したと思いました。
Win32_OperatingSystem / OSArchitecture
私は間違っていた。このフィールドがWin2k3システムに存在するようには見えません。ああ!
では、サーバーのバージョン間で「同じ」であるWMIの別のフィールドを知っている人はいますか?そうでない場合は、同じレジストリキーはどうですか?単純なフィールドクエリの構成のみを許可するツールを使用しているため、複雑なスクリプトを使用して実行することはできません。
どんな助けでも大歓迎です。
しばらく検索してテストした後、私は「修正/回答」を思いつきましたが、それは私が望んでいたものではありません。レジストリを介してからクエリを実行すると、Win2k3およびWin2k8のラボにあるすべてのバージョンで一貫しているように見えます。ここから情報を引き出します。
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment
KEY: PROCESSOR_ARCHITECTURE
X86またはAMD64が表示されます。完璧ではありませんが、少なくとも毎回正しい答えが得られます。
それでも、32/64、32ビット/ 64ビット、またはX86/X64を出力する一貫した「クラス」またはレジストリキーを知っている人がいれば、その情報をいただければ幸いです。
プロセッサではなくオペレーティングシステムアーキテクチャが必要な場合、これは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 & "}"
使用した単純な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"
これを試して:
wmic cpu get DataWidth /format:list
次のWMIクラスとプロパティを使用します-これは2003/XPおよびWin7/2008R2で機能するはずです
ROOT\CIMV2\Win32_Processor
AddressWidth
から Technet :
32ビットオペレーティングシステムでは、値は32であり、64ビットオペレーティングシステムでは、64です。このプロパティはCIM_Processorから継承されます。
最初の答えを拡張するには、これを使用します。
select AddressWidth from Win32_Processor where DeviceID="CPU0"
私はこれが古いことを知っています、私は将来誰のためにでもこれを投稿しています。 私のスクリプト を見てみてください。 BATCHで記述されており、コンピューター上にある場合はWMICを使用しますが、OSが32ビットの64ビットOSを実行しているかどうかを判断するためにWMICを使用する必要はありません。
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
(テストされていません)が、多分:
プラットフォームを決定するために、wmicを使用して以下の構文を試すことができます。
wmic path win32_processor where deviceid="cpu0" get Addresswidth
これは正確にはあなたが求めていたものではありませんが、私はこれをWMIクエリ(グループポリシー設定のターゲティング)で使用しただけで、これまでのところ機能しているようです。
SELECT * FROM Win32_ComputerSystem WHERE SystemType="x64-based pc"
バッチで
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
必要なのは環境変数「PROCESSOR_ARCHITECTURE」だけです。レジストリ呼び出しと同様に、これは「AMD64」または「x86」のいずれかを返します。