🐷

WMI を PowerShell で使う

2024/12/12に公開

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