[記事公開日]2026/01/26
PowerShellでUSB抜き差し履歴を確認する方法(接続・切断・認識不良の痕跡)
「いつ・どのUSB機器が接続/切断されたか」をログとデバイス情報で追う。Systemログ(Kernel-PnP / USB関連)とPnP履歴をPowerShellで確認する実務手順。
USB
履歴確認
トラブル調査
「USBメモリを挿したのに出てこない」「外付けHDDが切断される」「いつの間にかUSBが抜けていた」など、
USBトラブルは“その瞬間”を見ていないと原因が追いづらいです。
ただしWindowsは、USB機器の接続・切断・認識失敗の痕跡をイベントログに残します。
この記事では、PowerShellでUSBの抜き差し履歴を確認し、原因の範囲を狭める方法をまとめます。
※「USB抜き差し履歴」といっても、Windowsが残すのは主に「デバイスの列挙(認識)」「ドライバ適用」「切断/エラー」のログです。
“誰が抜いたか”のような人の特定は基本的にできませんが、「いつ・何が・どうなったか」はかなり詰められます。
もくじ
1. まず押さえる:USB履歴の取り方は2系統ある
- A:イベントログで追う(いつ接続/切断/失敗が起きたか=時系列の証拠)
- B:PnPデバイス情報で追う(どんなUSB機器が登録されているか=機器の特定)
現場ではまずA(ログ)で「時刻と現象」を固めて、B(デバイス情報)で「どの機器か」を突き合わせる流れが最短です。
2. 最短:SystemログからUSB関連(Kernel-PnP など)を拾う
USB挿抜やドライバ適用の痕跡は、まず System ログに出ます。
ここでは、USBに関係しやすいプロバイダーを広めに拾います(環境差があるため“広く→絞る”が安定します)。
2-1. 直近200件:USB関連プロバイダーをまとめて確認
Get-WinEvent -FilterHashtable @{
LogName = "System"
} -MaxEvents 2000 |
Where-Object {
$_.ProviderName -in @(
"Microsoft-Windows-Kernel-PnP",
"Microsoft-Windows-DriverFrameworks-UserMode",
"Microsoft-Windows-USB-USBHUB3",
"Microsoft-Windows-USBHUB",
"Microsoft-Windows-USBXHCI",
"Microsoft-Windows-UserPnp"
)
} |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Sort-Object TimeCreated -Descending |
Select-Object -First 200
まずは Message をそのまま見て「USB」「VID」「PID」「Device」「Hub」「Port」などの文字が出ているログを探します。
ログが多いPCほど、最初は広めに拾ってから絞るのが安全です。
2-2. 直近7日など期間を絞る(ログが多い場合)
$days = 7
Get-WinEvent -FilterHashtable @{
LogName = "System"
StartTime = (Get-Date).AddDays(-$days)
} |
Where-Object {
$_.ProviderName -in @(
"Microsoft-Windows-Kernel-PnP",
"Microsoft-Windows-DriverFrameworks-UserMode",
"Microsoft-Windows-USB-USBHUB3",
"Microsoft-Windows-USBHUB",
"Microsoft-Windows-USBXHCI",
"Microsoft-Windows-UserPnp"
)
} |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Sort-Object TimeCreated -Descending |
Select-Object -First 300
3. 「接続/切断の時刻」を明確にする(イベントIDの絞り込み)
USBの挿した/抜いたを追うとき、最終的に必要なのは「その時刻に何が起きたか」です。
ただし、USB関連のイベントIDは環境で揺れます(Win10/11、ドライバ、ハブ種類で差が出ます)。
そこで、まずは対象ログから“USBっぽいもの”だけを抽出して見やすくします。
「USB」や「VID_」「PID_」などを含むログだけ抽出します。
※日本語環境でも VID/PID はだいたい残ります。
$days = 14
Get-WinEvent -FilterHashtable @{
LogName = "System"
StartTime = (Get-Date).AddDays(-$days)
} |
Where-Object {
($_.ProviderName -in @(
"Microsoft-Windows-Kernel-PnP",
"Microsoft-Windows-DriverFrameworks-UserMode",
"Microsoft-Windows-USB-USBHUB3",
"Microsoft-Windows-USBHUB",
"Microsoft-Windows-USBXHCI",
"Microsoft-Windows-UserPnp"
)) -and
($_.Message -match "USB|VID_|PID_|USBSTOR|UASP|Mass Storage|記憶|ストレージ|ハブ|Hub|Port")
} |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Sort-Object TimeCreated -Descending |
Select-Object -First 200
この抽出結果に、次のような痕跡が出ていれば「挿抜の履歴」をかなり追えます。
- USB機器の列挙(認識)/ドライバの適用(初回接続・再接続)
- ハブのポートに関する接続・切断・リセット
- ドライバフレームワークの開始/停止(UMDF)
- 認識失敗・構成エラー・デバイス開始失敗
4. 「どのUSB機器か」を特定する:PnPデバイス一覧(VID/PID)
ログに VID/PID が出てきたら、次は「その機器が何か」を突き合わせます。
Windowsに登録されているPnPデバイス(USB系)を一覧表示します。
4-1. USB系PnPデバイスを一覧(PresentOnlyで現在接続中に絞ることも可)
# 現在接続中のUSBデバイス(まずはPresentOnly)
Get-PnpDevice -PresentOnly |
Where-Object { $_.InstanceId -match "^USB" } |
Select-Object Status, Class, FriendlyName, InstanceId |
Sort-Object Class, FriendlyName
4-2. 接続履歴として残る「USBSTOR(USBストレージ)」を一覧
# USBストレージ(過去接続分も含めて見えることが多い)
Get-PnpDevice |
Where-Object { $_.InstanceId -match "^USBSTOR" } |
Select-Object Status, Class, FriendlyName, InstanceId |
Sort-Object FriendlyName
InstanceId に VID_****&PID_**** が入っている場合、ログのVID/PIDと突き合わせできます。
5. 「いつ挿したか/抜いたか」を機器ごとに追う(InstanceIdで絞る)
最終的には、特定のUSB機器(InstanceId)に対して、関連ログだけを抽出できると強いです。
ここでは、PnPで見つけた InstanceId(例:VID/PID を含む)を元に、Systemログを絞ります。
下の $needle に、調べたい機器のキーワード(例:VID_XXXX、PID_YYYY、USBSTOR、製品名の一部)を入れてください。
$days = 30
$needle = "VID_XXXX" # 例:VID_0781(SanDisk等)
# $needle = "USBSTOR" # USBストレージ全般を追う場合
Get-WinEvent -FilterHashtable @{
LogName = "System"
StartTime = (Get-Date).AddDays(-$days)
} |
Where-Object {
($_.ProviderName -in @(
"Microsoft-Windows-Kernel-PnP",
"Microsoft-Windows-DriverFrameworks-UserMode",
"Microsoft-Windows-USB-USBHUB3",
"Microsoft-Windows-USBHUB",
"Microsoft-Windows-USBXHCI",
"Microsoft-Windows-UserPnp"
)) -and
($_.Message -match [regex]::Escape($needle))
} |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Sort-Object TimeCreated
これで「その機器が接続された/構成された/切断された/エラーになった」時刻が追いやすくなります。
6. USB抜き差し調査で「よくある原因パターン」(ログの読み方)
6-1. 短時間で接続・切断が繰り返される
- コネクタの接触不良(USBポート側/ケーブル側)
- バスパワー不足(外付けHDD、USB給電不足)
- ハブ経由で電圧降下(セルフパワーではないハブなど)
6-2. 認識するがストレージとして出ない/不安定
- USBストレージの論理障害・ファイルシステム不整合
- UASP/ドライバ相性(特定ケース)
- ディスクI/Oエラー→OSが一時的に切り離す
6-3. ハブ/ポートのリセットが多い
- USBコントローラ/ドライバ不調(USBXHCI周り)
- 省電力設定(USB選択的中断)が絡むこともある
「USBストレージが不安定」「切断が頻発」「認識したりしなかったり」などがある場合、
トラブル切り分け中に何度も抜き差し・通電を繰り返すと症状が悪化することがあります。
特にデータ救出が目的の場合は、無理な操作は控えてください。
7. 仕上げ:調査結果を「見やすく」まとめる(ログ1行化)
調査メモや報告書に貼るなら、Messageの改行を潰して1行化すると扱いやすいです。
$days = 7
Get-WinEvent -FilterHashtable @{
LogName = "System"
StartTime = (Get-Date).AddDays(-$days)
} |
Where-Object {
($_.ProviderName -in @(
"Microsoft-Windows-Kernel-PnP",
"Microsoft-Windows-DriverFrameworks-UserMode",
"Microsoft-Windows-USB-USBHUB3",
"Microsoft-Windows-USBHUB",
"Microsoft-Windows-USBXHCI",
"Microsoft-Windows-UserPnp"
)) -and
($_.Message -match "USB|VID_|PID_|USBSTOR|UASP|Mass Storage|記憶|ストレージ|Hub|Port")
} |
ForEach-Object {
[PSCustomObject]@{
TimeCreated = $_.TimeCreated
Provider = $_.ProviderName
Id = $_.Id
Level = $_.LevelDisplayName
Message = ($_.Message -replace "\r?\n"," " )
}
} |
Sort-Object TimeCreated -Descending |
Select-Object -First 200 |
Format-Table -AutoSize
➡️ 関連記事(タイトル順)
- PowerShellで起動時間が遅い原因を調べる方法(イベントログでボトルネック特定)
- PowerShellで接続された外付けストレージ履歴を確認する方法(USB/外付けHDD/SSD/SDカード)
- PowerShellでブルースクリーン履歴を確認する方法(STOPコード/再起動痕跡)
- PowerShellでバッテリー劣化を数値で確認する方法(ノートPC)
- PowerShellでネットワーク切断履歴を調べる方法(有線・Wi-Fi共通)
- PowerShellでドライバーエラーを一覧表示する方法(デバイス不調の切り分け)
- PowerShellで「電源が落ちた原因」を調べる方法(Event ID 41 / 6008 実践)
- PowerShellでWindowsアップデート失敗履歴を確認する方法(原因の手掛かりをログで掴む)
- PowerShellでUSB抜き差し履歴を確認する方法(接続・切断・認識不良の痕跡)
- PowerShellでSSD / HDDの異常兆候を調べる方法(SMART的観点)
