0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

デバイス情報をGet-PnpDeviceコマンドで取得する

0
Posted at

はじめに

この記事は下記の記事調査をした内容の派生です。
今回はWindows Server 2022でデバイスをコマンドから取得するだけのお話です。

コマンドについて

このPnPデバイスを取得してくれるコマンドを使います。

Get-PnpDevice

プラグアンドプレイについての説明です↓


さて、このコマンドが使えると何がうれしいかというと、
デバイス一覧をPowershellでcsvファイルなり好きな形式にエクスポートできるんです。
うれしくないですか?

オプション

オプションは8つあるみたいです。

  1. AsJob
    バックグラウンドで処理してくれます。
    基本的には使わないです。
    サーバやデバイスがたくさんあって一覧の取得に時間がかかるとかでないと使わないのではないでしょうか。

  2. CimSession
    リモートセッションでGet-PnpDeviceを実行したいときに使えるらしいです。
    複数のWindowsからデバイス一覧を一気に取得したいときに便利そうです。
    今回はローカルで単一のWindowsから取得したので詳細な使い方には触れません。

  3. Class
    デバイスのクラスでフィルタしてデバイス一覧を取得できます。
    クラスがわからない場合は、Get-PnpDeviceの実行結果からClass列を見るか、
    GUIのデバイスマネージャーから確認できます。

  4. FrieydlyName
    デバイスの表示名です。
    表示名がわからない場合は、Get-PnpDeviceの実行結果からFrieydlyName列を見るか、
    GUIのデバイスマネージャーから確認できます。

  5. InstanceId
    デバイスごとにシステムから付与される一意の文字列です。
    デバイスツリーごとに分かれているらしいです。

  1. PresentOnly
    現在接続されているデバイスのみを表示するようにフィルタしてくれます。
    物理 / 仮想デバイスの区別はしてくれません。(そもそもWindowsが対応していない)

  2. Status
    デバイスの動作状態でフィルタします。
    OK は正常動作、Error は問題あり、Unknown は状態が取得できない場合などに表示されます。
    WindowsはPnPデバイスを内部的に管理しており、デバイス情報が残っていても状態が正しく取得できない場合にはUnknownになることがあります。
    正常に動作しているデバイスのみを取得したい場合はOKでフィルタし、問題のあるデバイスを確認したい場合は Error や Unknown を指定すると便利です。

  3. 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はやりたいことがなかなかできないことが多いですが、あきらめがに行きたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?