背景・目的
モニタやUSBデバイスを接続しまくっているWindows PCは、接触不良などが原因でデバイスの挿抜が意図せず検出されてしまうことがある。この場合は不定期にデバイスの挿抜音が鳴って大変わずらわしい。しかし、挿抜音が鳴るだけで通知ポップアップなど何も出ないデバイスもあるため、悪さをしているデバイスの特定が難しいことがある。
接続されているデバイスの一覧を見るための一般的なツールとして、デバイスマネージャーやusbview.exeなどがある。これらのソフトは挿抜を検知してから画面に反映されるまで数秒かかるため、接触不良などの原因で短時間に抜き差しが検知された場合ではこれらのツールで原因となるデバイスを特定することは難しい。
(Linuxで言うところのudev的に)デバイスの挿抜をPowerShellでリアルタイムにログ出力する方法を発見したのでメモしておく
方法
PowerShellを開いて管理者権限で以下のスクリプトを実行する。
(下記コードはChatGPTが生成したもので、内容を1ミリも理解していないため実行は自己責任です)
while ($true) {
$currentDevices = Get-PnpDevice -PresentOnly
$newDevices = Compare-Object $previousDevices $currentDevices -Property InstanceId -PassThru
if ($newDevices) {
$timestamp = Get-Date -Format "yyyy/MM/dd HH:mm:ss"
$newDevices | ForEach-Object {
if ($_.SideIndicator -eq "<=") {
Write-Host "$timestamp - Device removed: $($_.InstanceId)"
} elseif ($_.SideIndicator -eq "=>") {
Write-Host "$timestamp - Device added: $($_.InstanceId)"
}
}
}
$previousDevices = $currentDevices
Start-Sleep -Seconds 1
}
上記スクリプト実行中にデバイスが挿抜されると、ログが表示される。
DisplayPort接続のモニタが挿抜されたときの例。
2024/07/06 16:48:07 - Device removed: DISPLAY\IOD180E\5&2F3551B6&1&UID168193
2024/07/06 16:48:08 - Device added: DISPLAY\IOD180E\5&2F3551B6&1&UID168193
2024/07/06 16:48:20 - Device removed: DISPLAY\IOD180E\5&2F3551B6&1&UID168193
2024/07/06 16:48:21 - Device added: DISPLAY\IOD180E\5&2F3551B6&1&UID168193
上記のデバイスが何のデバイスか、詳細を知るコマンド。
(上記ログからデバイスID的な文字列をコピーして貼り付ける)
方法1
Get-PnpDevice -InstanceId "DISPLAY\IOD180E\5&2F3551B6&1&UID168193"
方法2
Get-WmiObject Win32_PnPSignedDriver | Where-Object { $_.DeviceID -eq "DISPLAY\IOD180E\5&2F3551B6&1&UID168193" }
結果
GPUからDisplayPort接続していたモニタが接触不良を起こし、挿抜音を発生させていた
(イベントビューアのシステムログから簡単にログが見れるようにしてほしい、、)
備考
検証済みPC: Windows 11 Pro - 23H2
(CPU: AMD / Ryzen 5 3600)
未検証: Windows 10マシン
参考