WMI を PowerShell で使う
WMI とは
Windows におけるシステム/アプリケーション/ネットワーク/デバイスなどに関して、情報取得/追加や削除などを簡単に実現するための統一された I/F です。
WMI の一番よくある使い方は、管理している各 PC のソフトウェアやハードウェア構成を収集するなどです。
- OS バージョン調べたり
- ソフトのインストールの有無を調べたり
- メモリ容量やストレージ容量を調べたり
- IPアドレスとかネットワーク設定を取得したり
- 評価や保守の際に、うまく動かない環境の情報を収集したり
と、いろんなことに使えます。
WMI 用のコマンドレット
Get-WmiObject のような WMI 用のコマンドレットが、PowerShell 5.1 以前に含まれている。
でもそれらは、最新の PowerShell 7 とかでは使えない。
PowerShell 6 以降を使用している場合、CIM コマンドレットを使うとのこと。
CIM コマンドレット
どのような CIM コマンドレットがあるかは、下記のコマンドを使います。
Get-Command -Noun Cim*
そうすると、以下のような結果が得られます。
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-CimAssociatedInstance 7.0.0.0 CimCmdlets
Cmdlet Get-CimClass 7.0.0.0 CimCmdlets
Cmdlet Get-CimInstance 7.0.0.0 CimCmdlets
Cmdlet Get-CimSession 7.0.0.0 CimCmdlets
Cmdlet Invoke-CimMethod 7.0.0.0 CimCmdlets
Cmdlet New-CimInstance 7.0.0.0 CimCmdlets
Cmdlet New-CimSession 7.0.0.0 CimCmdlets
Cmdlet New-CimSessionOption 7.0.0.0 CimCmdlets
Cmdlet Register-CimIndicationEvent 7.0.0.0 CimCmdlets
Cmdlet Remove-CimInstance 7.0.0.0 CimCmdlets
Cmdlet Remove-CimSession 7.0.0.0 CimCmdlets
Cmdlet Set-CimInstance 7.0.0.0 CimCmdlets
WMI クエリの実行例
PnP デバイスの列挙
それでは PowerShell で Win32_PnPEntity を列挙してみましょう。
Get-CimInstance -Query 'SELECT * FROM Win32_PnPEntity'
複数のデバイスが出力されるはずです。
結果例をいくつか示します。
Logicool Unifying Receiver
Caption : Logitech USB Input Device
Description : Logitech USB Input Device
InstallDate :
Name : Logitech USB Input Device
Status : OK
Availability :
ConfigManagerErrorCode : 0
ConfigManagerUserConfig : False
CreationClassName : Win32_PnPEntity
DeviceID : USB\VID_046D&PID_C52B&MI_00\9&1CFCFC45&0&0000
ErrorCleared :
ErrorDescription :
LastErrorCode :
PNPDeviceID : USB\VID_046D&PID_C52B&MI_00\9&1CFCFC45&0&0000
PowerManagementCapabilities :
PowerManagementSupported :
StatusInfo :
SystemCreationClassName : Win32_ComputerSystem
SystemName : A077293600
ClassGuid : {745a17a0-74d3-11d0-b6fe-00a0c90f57da}
CompatibleID : {USB\Class_03&SubClass_01&Prot_01, USB\Class_03&SubClass_01, USB\Class_03}
HardwareID : {USB\VID_046D&PID_C52B&REV_1211&MI_00, USB\VID_046D&PID_C52B&MI_00}
Manufacturer : Logitech (x64)
PNPClass : HIDClass
Present : True
Service : HidUsb
PSComputerName :
Intel PCI Express Root
Caption : Intel(R) PCI Express Root Port #10 - 51B1
Description : Intel(R) PCI Express Root Port #10 - 51B1
InstallDate :
Name : Intel(R) PCI Express Root Port #10 - 51B1
Status : OK
Availability :
ConfigManagerErrorCode : 0
ConfigManagerUserConfig : False
CreationClassName : Win32_PnPEntity
DeviceID : PCI\VEN_8086&DEV_51B1&SUBSYS_0B041028&REV_01\3&11583659&0&E8
ErrorCleared :
ErrorDescription :
LastErrorCode :
PNPDeviceID : PCI\VEN_8086&DEV_51B1&SUBSYS_0B041028&REV_01\3&11583659&0&E8
PowerManagementCapabilities :
PowerManagementSupported :
StatusInfo :
SystemCreationClassName : Win32_ComputerSystem
SystemName : A077293600
ClassGuid : {4d36e97d-e325-11ce-bfc1-08002be10318}
CompatibleID : {PCI\VEN_8086&DEV_51B1&REV_01, PCI\VEN_8086&DEV_51B1, PCI\VEN_8086&CC_060400, PCI\VEN_808
6&CC_0604…}
HardwareID : {PCI\VEN_8086&DEV_51B1&SUBSYS_0B041028&REV_01, PCI\VEN_8086&DEV_51B1&SUBSYS_0B041028, PCI
\VEN_8086&DEV_51B1&CC_060400, PCI\VEN_8086&DEV_51B1&CC_0604}
Manufacturer : INTEL
PNPClass : System
Present : True
Service : pci
PSComputerName :
USB 関連デバイスの列挙
前項までで、PnP デバイスを列挙してみました。
とてもたくさんのデバイスが出力されたはずです。
それでは応用として、以下のコマンドで USB 関連デバイスのみを列挙してみましょう。
Get-CimInstance -Query "SELECT * FROM Win32_PnPEntity WHERE DeviceID LIKE 'USB%'"
上記に示す例のように、WQL の構文を少し工夫すると、出力をフィルタできます。WQL については、WQL (WMI 用の SQL) も参考になります。
USB 関連デバイスの列挙(ManagementObjectSearcher 編)
wmisearcher 型アクセラレータの使用によると、[wmisearcher]型アクセラレータは、WQL ステートメント文字列から ManagementObjectSearcher オブジェクトを作成します。
と書かれています。
USB 関連デバイスの列挙を ManagementObjectSearcher を使う書き方に変えてみると、以下のように書くことができます。
$usbSearcher = [wmisearcher]"SELECT * FROM Win32_PnPEntity WHERE DeviceID LIKE 'USB%'"
$usbSearcher.Get()
もちろん、こんなこともできます。
$usbSearcher = [wmisearcher]"SELECT * FROM Win32_PnPEntity WHERE DeviceID LIKE 'USB%'"
$usbSearcher.GetType().FullName
# System.Management.ManagementObjectSearcher
$usbSearcher.Get().Count
# 46
Discussion