Bluetoothに関連する情報をPowerShellで扱う
今回は、Bluetoothに関連する情報をPowerShellで扱う方法を考える。GUIでは「設定」→「Bluetoothとデバイス」→「デバイス」とすることで、接続されているデバイスを一覧表示できる。
コマンドラインからは、以下のコマンドでページを開くことがてきる。
bthprops.cpl
start ms-settings:connecteddevices
「bthprops.cpl」は、コントロールパネルのアイコンに対応するプログラムで、「C:\Windows\System32」にある。もう1つは、設定アプリのURI起動である。
「設定」→「Bluetoothとデバイス」→「デバイス」では、注意して見ないと、Bluetoothデバイスかどうかを判別できない。デバイス名の下に「ペアリング済み」と表示されているのがBluetoothデバイスである。
深い知識を持たない一般ユーザーに、BluetoothデバイスとUSBデバイスを区別する作業は不要、というスタンスがここからは感じられる。Windows 8以降、コントロールパネルと設定が分離してから、Windowsには、このように詳細を伏せるところが見られるようになった。
こうしたことに興味がないユーザーには良いのだろうが、情報を必要とするユーザーは、大量の情報が表示される「デバイスマネージャー」やコマンドラインなどを使わざるを得なくなる。
さて、Bluetoothは通信方式なのだが、Windowsの中では、「デバイス」としての静的な情報と、通信/プロトコルとしての動的な情報がある。前者は、どんなデバイスが登録(ペアリング)されているのか、といったWindowsのデバイスシステムの中の情報である。後者については、APIを使い、プロトコルに応じた動き、たとえば、Bluetoothのアドバタイズを受信するといった処理となる。
後者については、プログラミングが関わるため、別の機会に解説することにしたい。
PnPデバイスからBluetooth関連のデバイスを取り出す
PowerShellで、デバイス情報を扱うには「Get-PnpDevice」コマンドを使うのが定石である。Windowsが認識しているすべてのデバイスは、PnpDeviceとして登録されている。
ただし、大量のデバイスがあるため、Where-Object(エイリアスは「?」)を使って、目的のものだけを取り出すことを考える。これが、PowerShellでのデバイス情報処理の基本である。
Bluetoothデバイスのクラス(Class)は「Bluetooth」だが、出力させてみると、Bluetooth関連のサービスなども列挙される。物理的なBluetoothデバイスを探したければ、以下のコマンドを使う。
Get-PnpDevice | ? Class -eq "Bluetooth" | ? CompatibleID -like "*GENERIC*DEVICE*"
Get-PnpDeviceの出力をWhere-Object(エイリアスは「?」)で、フィルタすることで必要なデバイスのみを取り出すことができる。なお、出力を成形するためft(Format-Tableコマンドのエイリアス)を使っている
このとき「CompatibleID」が「{BTHENUM\GENERIC_DEVICE}」となっているものはClassic Bluetoothデバイス(Bluetooth BR/EDR)で、「{BTHLE\GenericDevice}」になっているものが、Bluetooth LE(Low Energy)デバイスだ。1つのデバイスが同時に両方の特性を持っていることもあるので注意してほしい(Nameなどが同一)。
実行環境によっては、InstanceIDの後半が省略されて、すべて表示されないことがある。そのような場合には、
Get-PnpDevice | ? Class -eq "Bluetooth" | ? CompatibleID -like "*GENERIC*DEVICE*" | ft -AutoSize
とする。
列挙したBluetoothデバイスのプロパティにある「InstanceID」を使うことで、PnpDeviceのプロパティを入手できる。それには、
Get-PnpDeviceProperty -InstanceId <InstanceID>
とする。
大量の情報が出力されるが、重要なものとして「DEVPKEY_DeviceContainer_Category」「DEVPKEY_Device_HardwareIds」がある。前者はデバイスのカテゴリ、後者にはBluetoothデバイスのMACアドレスが含まれている。
なお、Get-PnpDevicePropertynの出力する情報は、レジストリの「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\BTHENUM」(Bluetooth Classicデバイス)、「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\BTHLE」(Bluetooth LEデバイス)にあるものと一部共通している。
PnpDevicePropertyを比較する
Get-PnpDevicePropertyで、デバイス情報をオブジェクトとして撮り出せるため、これを変数に記録し、Compare-Objectコマンド(https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/compare-object?view=powershell-7.4)で比較することで、その変化を調べられる。具体的には、以下の手順を使う。
$S1=Get-PnpDeviceProperty -InstanceId <InstanceID>
#デバイスを切断するなど、デバイスの状態を変える操作をする
$S2=Get-PnpDeviceProperty -InstanceId <InstanceID>
Compare-Object $S1 $S2 -Property KeyName,Data
Compare-Objectは、2つのオブジェクトを比較し違いを表示するコマンド。複数のプロパティを持つオブジェクトの場合、比較対象とするプロパティを指定する必要がある。ここでは、PnpDevicePropertyのKeyNameとDataプロパティを指定した。
Classic Bluetoothデバイスを接続すると、PnpDeviceProperty「{83DA6326-97A6-4088-9453-A1923F573B29} 15」がFalseとなり、接続した時間(UTC)が「DEVPKEY_Bluetooth_LastConnectedTime」に記録されることがわかる。
PnpDevicePropertyを状態変化の前後で変数に記録して比較することで、プロパティの変化を調べることもできる。今回は、Bluetoothを例に解説したが、基本的な考えは、PnpDevice全般に適用可能だ。

この連載の記事
-
第508回
PC
Scalable Vector Graphics(SVG)そもそも何なのか? -
第507回
PC
Windows 11の「開発者モード」とは何か? -
第506回
PC
Windows 11は早くも来秋登場の26H2プレビューの準備が始まる -
第505回
PC
結構変化しているWindows 11のエクスプローラーの基本設定を見直す -
第504回
PC
新しいOutlookとOutlook Classic、そろそろ古いOutlookとExchangeの組み合わせは引退の頃合いか -
第503回
PC
機能が増えたこともあり、寄せ集めから統合化に進むWindowsの便利ツール「PowerToys」 -
第502回
PC
Windows 11でBluetoothのオーディオ新規格「Bluetooth LE Audio」を試す -
第501回
PC
Windows 11 Ver.25H2での変更点、新機能を整理する -
第500回
PC
Windows 11 Ver.25H2が完成した -
第499回
PC
Windowsでの致命的だが回復可能なエラーに備える手段を2つ紹介 -
第498回
PC
Windows Terminalの安定版V1.23が公開 設定UIが改良される - この連載の一覧へ














