はじめに
この記事は下記の記事調査をした内容の派生です。
今回はWindows Server 2022でデバイスをコマンドから取得するだけのお話です。
コマンドについて
このPnPデバイスを取得してくれるコマンドを使います。
Get-PnpDevice
プラグアンドプレイについての説明です↓
さて、このコマンドが使えると何がうれしいかというと、
デバイス一覧をPowershellでcsvファイルなり好きな形式にエクスポートできるんです。
うれしくないですか?
オプション
オプションは8つあるみたいです。
-
AsJob
バックグラウンドで処理してくれます。
基本的には使わないです。
サーバやデバイスがたくさんあって一覧の取得に時間がかかるとかでないと使わないのではないでしょうか。 -
CimSession
リモートセッションでGet-PnpDeviceを実行したいときに使えるらしいです。
複数のWindowsからデバイス一覧を一気に取得したいときに便利そうです。
今回はローカルで単一のWindowsから取得したので詳細な使い方には触れません。 -
Class
デバイスのクラスでフィルタしてデバイス一覧を取得できます。
クラスがわからない場合は、Get-PnpDeviceの実行結果からClass列を見るか、
GUIのデバイスマネージャーから確認できます。 -
FrieydlyName
デバイスの表示名です。
表示名がわからない場合は、Get-PnpDeviceの実行結果からFrieydlyName列を見るか、
GUIのデバイスマネージャーから確認できます。 -
InstanceId
デバイスごとにシステムから付与される一意の文字列です。
デバイスツリーごとに分かれているらしいです。
-
PresentOnly
現在接続されているデバイスのみを表示するようにフィルタしてくれます。
物理 / 仮想デバイスの区別はしてくれません。(そもそもWindowsが対応していない) -
Status
デバイスの動作状態でフィルタします。
OK は正常動作、Error は問題あり、Unknown は状態が取得できない場合などに表示されます。
WindowsはPnPデバイスを内部的に管理しており、デバイス情報が残っていても状態が正しく取得できない場合にはUnknownになることがあります。
正常に動作しているデバイスのみを取得したい場合はOKでフィルタし、問題のあるデバイスを確認したい場合は Error や Unknown を指定すると便利です。 -
ThrottleLimit
同時に取得できる操作の数らしいです。
CimSessionで複数のWindowsからデバイス情報を取得した場合に、同時に取得できるセッション数を決められるみたいです。
このパラメーターは、コマンドレットの実行中に確立できる同時操作の最大数を指定します。このパラメーターを省略するか、値として0を指定した場合、最適なスロットル制限を計算してくれるらしいです。
今回はローカルで単一のWindowsから取得したので詳細な使い方には触れません。
使い方
下記の条件でフィルタしてみようと思います。
- 接続ステータス : OK
- クラス : Bluetooth
- 現在の接続状況 : オンライン
PS C:> Get-PnpDevice -PresentOnly -Class Bluetooth
Status Class FriendlyName InstanceId
------ ----- ------------ ----------
OK Bluetooth Microsoft Bluetooth Enumerator BTH\MS_B...
OK Bluetooth 汎用属性プロファイル BTHLEDEV...
OK Bluetooth Echo Dot-X28 Avrcp トランスポート BTHENUM\...
OK Bluetooth Bluetooth LE 汎用属性サービス BTHLEDEV...
OK Bluetooth Bluetooth Device (RFCOMM Protocol TDI) BTH\MS_R...
※一部抜粋です。
物理デバイスのみを抜き出すチャレンジ
ここまで読んでいただいた方ならわかると思うんですが、このコマンドには物理デバイスと仮想デバイスを区別させるためのオプションがありません。
冒頭に貼ってあるリンク内でも書きましたが、このコマンドというかWindowsは物理デバイスと仮想デバイスを区別して管理していないので、そもそも公式機能だけではできないらしいです。
と、いうのを踏まえてこのコマンドのでできる範囲で物理デバイスのみをとってみました。
まずどんなクラスがあるかを確認します。
そのファーストステップで使うオプションは
- PresentOnly
- Status : OK
の2つです。
PS C:\users\coogelu> Get-PnpDevice -Status OK -PresentOnly
Status Class FriendlyName InstanceId
------ ----- ------------ ----------
OK Display NVIDIA GeForce RTX 4060 Ti PCI\VEN_...
OK AudioEndpoint EX-LD2381D (NVIDIA High Definition Audio) SWD\MMDE...
OK Bluetooth Microsoft Bluetooth Enumerator BTH\MS_B...
OK Bluetooth 汎用属性プロファイル BTHLEDEV...
OK System Intel(R) SPI (flash) Controller - 7A24 PCI\VEN_...
OK Display Meta Virtual Monitor ROOT\DIS...
OK SoftwareComp... HP Application Enabling Services SWD\DRIV...
OK HIDClass HID 準拠デバイス HID\VID_...
※一部抜粋です。
で、この結果をClassで重複がないようにいい感じに処理します。
処理はPowerShell外でしました。
その結果下記のデバイスが得られました。
class
Display
AudioEndpoint
Bluetooth
System
SoftwareComp...
HIDClass
MEDIA
Mouse
PrintQueue
SoftwareDevice
Net
DiskDrive
Computer
USB
WPD
Monitor
Volume
Camera
Ports
SCSIAdapter
HDC
Firmware
AudioProcess...
SecurityDevices
Processor
Printer
Keyboard
この結果から明らかに物理デバイスでないものを選定します。
SoftwareDevice
System
PrintQueue
SoftwareComponent
ここら辺はどう見ても物理デバイスはなさそうなのではじくことにします。
そのはじくために作ったコマンドがこちらです
Get-PnpDevice -PresentOnly - Status OK| Where-Object {$_.Class -notin "SoftwareDevice","System","PrintQueue","SoftwareComponent"} | Out-File phy_devices.txt
はじくのはGet-PnpDeviceではできないのでPowershellのほかのコマンドと組み合わせです。
これでも完全にはじくことはできませんが、かなりましになります。
最後に
この記事を書くのにかなり時間がかかってしまってので最後が雑ですが、これでおわりです。
windowsはやりたいことがなかなかできないことが多いですが、あきらめがに行きたいと思います。