1. トップ
  2. 新着ニュース
  3. IT
  4. IT総合

WindowsのPowerShellからBluetoothデバイスを調べる

ASCII.jp / 2025年1月19日 10時0分

Bluetoothに関連する情報をPowerShellで扱う

 今回は、Bluetoothに関連する情報をPowerShellで扱う方法を考える。GUIでは「設定」→「Bluetoothとデバイス」→「デバイス」とすることで、接続されているデバイスを一覧表示できる。

Bluetooth
ペアリングしたBluetoothデバイスは、「設定」→「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*"

Bluetooth
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>

とする。

Bluetooth
Get-PnpDevicePropertyを使うことで、デバイスに関する静的な情報が得られる

 大量の情報が出力されるが、重要なものとして「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

Bluetooth
Bluetoothデバイスの切断時、接続時でGet-PnpDevicePropertyを変数に記録すれば、Compare-Objectコマンドでその差分を求めることができる

 Compare-Objectは、2つのオブジェクトを比較し違いを表示するコマンド。複数のプロパティを持つオブジェクトの場合、比較対象とするプロパティを指定する必要がある。ここでは、PnpDevicePropertyのKeyNameとDataプロパティを指定した。

 Classic Bluetoothデバイスを接続すると、PnpDeviceProperty「{83DA6326-97A6-4088-9453-A1923F573B29} 15」がFalseとなり、接続した時間(UTC)が「DEVPKEY_Bluetooth_LastConnectedTime」に記録されることがわかる。

 PnpDevicePropertyを状態変化の前後で変数に記録して比較することで、プロパティの変化を調べることもできる。今回は、Bluetoothを例に解説したが、基本的な考えは、PnpDevice全般に適用可能だ。

この記事に関連するニュース

トピックスRSS

ランキング

記事ミッション中・・・

10秒滞在

記事にリアクションする

記事ミッション中・・・

10秒滞在

記事にリアクションする

デイリー: 参加する
ウィークリー: 参加する
マンスリー: 参加する
10秒滞在

記事にリアクションする

次の記事を探す

エラーが発生しました

ページを再読み込みして
ください