[登録されているタグ]

[記事公開日]2026/01/26

PowerShellでUSB抜き差し履歴を確認する方法(接続・切断・認識不良の痕跡)

「いつ・どのUSB機器が接続/切断されたか」をログとデバイス情報で追う。Systemログ(Kernel-PnP / USB関連)とPnP履歴をPowerShellで確認する実務手順。

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
      

➡️ 関連記事(タイトル順)

すべてを開く | すべてを閉じる

ページ上部へ戻る