Claude CodeでGet-WinEventを使いイベントログの原因を切り分ける
Windowsのイベントログを期間とIDで絞って抽出し、再起動やサービス停止の前後関係をClaude Codeに整理させる手順です。読み取り専用の権限設定と、出力に混ざるユーザー名・端末名の扱いも書きます。
Windowsが勝手に再起動した、サービスが止まった。そんなときの調査は、イベントログをGet-WinEventで絞り込んでClaude Codeに読ませると進めやすくなります。コツは、ログ全体を渡さないことです。期間、ログ名、IDで先に絞り、必要なプロパティだけを出力して、前後関係の整理をClaude Codeに任せます。
この記事では、PowerShellツールを使った抽出コマンドの組み立て、時系列整理の頼み方、読み取り専用で回すための権限設定を順に書きます。出力にはアカウント名や端末名が混ざるので、渡す前に伏せる方法も最後に扱います。
ログ全体を渡さず、先に絞る理由
Claude Codeがコマンドの出力を受け取る量には上限があります。成功したコマンドの出力が約30,000文字を超えると、全文は会話に入らず、保存先のファイルパスと先頭2,000文字ほどのプレビューだけが返ります。失敗扱いの出力は、約10,000文字までです。
イベントログはすぐにこの量を超えます。全件を出すと、肝心の再起動前後のイベントがプレビューの外に出てしまいます。
絞り込みの手段はGet-WinEvent自体が持っています。Microsoft Learnの説明では、Where-Objectは全件を取得してから条件を当てるのに対し、フィルターのパラメーターは取得しながら適用されるため、後者のほうが効率的です。つまり、絞るのはClaude Codeに読ませる前の抽出コマンドの側で済ませます。
PowerShellツールを使える状態にする
WindowsでGit Bashを入れていない環境では、PowerShellツールは自動で有効になります。Git Bashがある環境では、claude.aiとConsoleのアカウントなら既定で有効です。Amazon Bedrock、Google Cloud、Microsoft Foundryのセッションでは、環境変数を設定します。
{
"env": {
"CLAUDE_CODE_USE_POWERSHELL_TOOL": "1"
}
}WindowsではPowerShell 7以降のpwsh.exeを自動検出し、なければPowerShell 5.1のpowershell.exeを使います。シェルの選び方や起動設定の違いはClaude Codeのシェル起動設定にまとめています。
Bashのdenyルールを置いている環境には注意が要ります。Git Bashのあるシステムでは、Bashを拒否するルールがあるとPowerShellツールも無効になります。Bash(git push *)のような範囲を絞ったルールでも同じです。上の環境変数を1にするか、PowerShell(...)形式のルールを追加すれば無効化を避けられます。
期間とIDで絞ったログを取り出す
抽出は-FilterHashtableが扱いやすい方法です。LogName、ProviderName、Id、Level、StartTime、EndTimeといったキーを組み合わせます。値のワイルドカードが使えるのはLogNameとProviderNameだけです。
調べたい時刻の前後を切り出す例です。StartTimeとEndTimeは、不具合に気づいた時刻の前後に合わせて書き換えてください。
$from = Get-Date '2026-10-09 08:00'
$to = Get-Date '2026-10-09 10:00'
Get-WinEvent -FilterHashtable @{
LogName = 'System'
StartTime = $from
EndTime = $to
} | Select-Object TimeCreated, Id, ProviderName,
LevelDisplayName, Message |
Sort-Object TimeCreated |
Format-List特定のIDだけを見たいときは、Idキーを足します。Id = 1003のように単独でも指定でき、StartTimeと同時に書けます。ログ名はSystemのほかApplicationなど、調べたい症状に近いものを選びます。
情報レベルのイベントが多すぎるときは、SuppressHashFilterが使えます。Learnの例ではSuppressHashFilter=@{Level=4}で情報レベル(Level 4)を除外しています。
件数を保険で制限するなら、-MaxEventsが使えます。最新から指定件数を返します。
前後関係をClaude Codeに整理させる
抽出コマンドが決まったら、頼み方は具体的にします。ログを読んで原因を教えてほしい、という曖昧な指示では、推測が混ざった答えになりがちです。次のように、材料と出力の形を指定します。
PowerShellツールで、2026-10-09 08:00〜10:00のSystemログを
Get-WinEventで抽出して。読み取りだけで、設定やサービスは変更しないこと。
抽出後に次の形で整理して。
1. 時刻順の表(時刻 / ID / 提供元 / 要約)
2. 再起動またはサービス停止にあたるイベントと、その直前10分のイベント
3. 原因として説明できる点と、ログからは断定できない点を分けて書く3番目の指定が重要です。イベントログは「何が起きたか」を残しますが、「なぜ起きたか」まで書いているとは限りません。断定できる点とできない点を分けさせると、推測が事実の顔をして混ざるのを防げます。
整理の結果を鵜呑みにせず、Claude Codeが示したIDと時刻を、イベントビューアーで開き直して照合する運用が安全です。IDの意味は、提供元(ProviderName)ごとに別のドキュメントで確認できます。
抽出結果が長いときは、いったんCSVに書き出してから読ませる手もあります。出力が上限を超えても、ファイルなら必要な範囲をClaude Codeが読み直せます。ファイルに書くときのエンコードは、後述のv2.1.214の挙動を確認してください。
調査用に読み取り専用の権限を許可する
調査のたびに許可ダイアログが出ると流れが止まります。Get-WinEventだけを許可すれば、読み取りの繰り返しは確認なしで進みます。
{
"permissions": {
"allow": [
"PowerShell(Get-WinEvent *)"
],
"deny": [
"PowerShell(Remove-Item *)"
]
}
}PowerShellの権限ルールは、Bashと同じ形式です。*は任意の位置で一致します。コマンドのエイリアスは正規化されてから照合され、照合は大文字小文字を区別しません。
パイプ(|)やセミコロン(;)で連結したコマンドは、サブコマンドごとに分解して確認されます。許可されるのは、すべてのサブコマンドがルールに一致したときだけです。上の抽出例はSelect-ObjectやSort-Object、Format-Listを連結しているので、Get-WinEventの許可ルールだけでは通りません。連結先のコマンドも許可するか、確認ダイアログで都度承認します。削除系のコマンドの扱いはPowerShell Remove-Itemがブロックされる条件で扱っています。
出力に混ざるユーザー名・端末名の扱い
イベントログには、アカウントや端末に関する情報が付きます。-FilterHashtableにUserIDというキーがあり、SIDまたはドメインアカウント名で絞れることからも、イベントがアカウントと結び付いていることが分かります。Messageの本文にも、ユーザー名やパスが入ることがあります。
PowerShellツールの出力は、Claude Codeが読み取る結果としてそのまま会話に入ります。社内の調査なら問題にならない場合もありますが、社外のチケットや共有ドキュメントに結果を貼る前提なら、渡す前に伏せる設計が安全です。
方法は3つあります。
- 出力するプロパティを
Select-Objectで必要なものに限る -replaceでユーザー名や端末名を固定の文字列に置き換える- 調査対象を絞って、個人に紐づくイベントを最初から除く
置き換えの例を示します。環境に合わせて、パターンを書き換えてください。
Get-WinEvent -FilterHashtable @{
LogName = 'System'; StartTime = $from; EndTime = $to
} | ForEach-Object {
[pscustomobject]@{
Time = $_.TimeCreated
Id = $_.Id
Source = $_.ProviderName
Message = ($_.Message -replace $env:USERNAME, '<USER>' `
-replace $env:COMPUTERNAME, '<HOST>')
}
}この置き換えは、環境変数に入っている現在のユーザー名と端末名だけを伏せます。他のアカウントやドメイン名、IPアドレスは残るので、伏せたい対象に合わせて-replaceを足してください。
もうひとつ、プロジェクトのCLAUDE.mdに「イベントログの調査では、ユーザー名と端末名を伏せたスクリプトだけを使う」と書いておく方法があります。Claude Codeが毎回ゼロから抽出コマンドを組み立てる場面でも、伏せ字の処理を挟み込めます。ただしCLAUDE.mdは指示であって強制ではないので、絶対に外へ出せない情報は、そもそもその端末のログを渡さない運用が確実です。
別の端末のログや保存済みのevtxを読ませる
調査対象が手元の端末とは限りません。-ComputerNameにNetBIOS名、IPアドレス、FQDNのいずれかを渡すと、別のコンピューターのログを取得できます。指定できるのは一度に1台です。PowerShellリモート処理は使いませんが、リモートから読むにはイベントログサービス用のファイアウォールポートを開けておく必要があります。
障害が起きた端末から.evtxを持ち出せる場合は、-Pathでファイルを読む方法もあります。Pathキーは.etl、.evt、.evtxを受け付け、-FilterHashtableの中でも使えます。
Get-WinEvent -FilterHashtable @{
Path = 'C:\Work\system-export.evtx'
StartTime = $from
EndTime = $to
}保存済みのファイルを使うと、調査を依頼した端末に影響を与えずに済みます。ユーザー名や端末名を伏せる処理も、持ち出した先の安全な環境で一度だけ走らせれば足ります。
つまずきやすい点
管理者権限が必要なログがあります。Microsoft Learnの説明では、管理者として実行していないと、ログの情報を取得できないというエラーが出ることがあります。権限エラーが出たら、Claude Codeを管理者権限のターミナルから起動し直すかどうかを、調査の必要性と照らして決めます。
文字化けにも注意が要ります。v2.1.214以降のWindowsでは、PowerShell 5.1の>と>>がUTF-8でファイルを書き、ネイティブコマンドへパイプした非ASCII文字もUTF-8で渡されます。それより前のバージョンでは、>がUTF-16LEで書き出され、日本語を含むMessageが読み取りで崩れる可能性があります。バージョンの確認はclaude --versionで行います。標準出力の取り込みに関する別のつまずきは、WindowsでstdoutをClaude Codeが取得できない原因に書いています。
最後に、大きな範囲を抽出するとき、メモリの上限も気になります。LinuxやWSLでの上限の設定はCLAUDE_CODE_TOOL_MEMORY_LIMITの記事を参照してください。
まとめ
イベントログの調査では、Claude Codeに生ログを渡すより、抽出条件を人が決めるほうが成果が安定します。期間とIDを-FilterHashtableで絞り、必要なプロパティだけを出力し、整理の指示に「断定できない点を分ける」を入れる。この3点が土台です。
個人情報の扱いは、権限設定より前の設計の問題です。伏せ字の処理を抽出コマンドの側に組み込めば、Claude Codeが何を受け取るかを、人が先に決められます。