Get-WinEvent
イベントログをフィルターして取得するPowerShellコマンドレット。FilterHashtableでの絞り込みに対応し、NTLM監査ログなど大量のイベントの集計に使う。
FilterHashtable
Get-WinEventでログ名・ID・レベル・期間などをキーと値のハッシュテーブルで指定し、イベントログのAPI側で絞り込みを行わせるパラメーター。
FilterHashtableパラメーター
Get-EventLog
Windows PowerShell 5.1専用で、System・Application・Securityなどクラシックログだけを読み取れる旧世代のイベントログ取得コマンドレット。
Get-EventLogコマンドレット
Where-Object
パイプラインを流れるオブジェクトを条件式で絞り込むコマンドレット。
後段フィルタによる調査の遅延
Get-WinEventの出力全件をパイプへ流してからWhere-Objectなどで絞り込むことで、絞り込みがイベントログ側ではなくPowerShell側で行われ、調査にかかる時間が大きく悪化すること。
クライアント側フィルタの遅延
FilterXPath
Get-WinEventでXPath式を指定し、共通項目だけでなくイベントデータ固有の項目でもサーバー側で絞り込みを行わせるパラメーター。
FilterXPathパラメーター
TaskScheduler/Operationalログ
タスクスケジューラの実行履歴が記録される、アプリケーションとサービスログ配下の詳細ログ。既定で無効になっている場合がある。
ToXml()のイベントデータ(EventData)
各イベントのToXml()メソッドで取得できるXML表現のうち、EventData配下にある名前付きの項目。表示用メッセージと異なりOSの表示言語に依存せず値を取り出せる。
表示言語に依存するメッセージ表示
MessageプロパティやLevelDisplayNameなど、イベントログの表示用文字列がOSの表示言語によって変わること。
Messageの言語依存
LevelDisplayNameの言語依存
セキュリティログ(Securityログ)
ログオン成功・失敗など認証関連の監査イベントが記録されるWindowsのイベントログ。読み取りには既定で管理者権限相当が必要。
Securityログ
管理者権限
コンピューター全体の設定を変更できる権限。
昇格
Event Log Readersグループ
管理者権限を与えずにローカルコンピューターのイベントログを読み取れるようにする、Windowsのビルトインセキュリティグループ(SID S-1-5-32-573)。
wevtutil
イベントログの一覧・エクスポート、チャネルのアクセス許可(SDDL)の確認や変更、最大サイズの変更などを行うコマンドラインツール。
Invoke-Command
指定した複数のコンピューターに対してスクリプトブロックを並列に実行するPowerShellコマンドレット。WinRMによるリモート処理を前提とする。
Invoke-Commandコマンドレット
複数台のイベントログ収集
複数のWindowsコンピューターのイベントログをまとめて調べる、または収集サーバーへ集約する作業。
複数台からのログ収集
Windowsイベント転送(WEF)
追加のエージェント導入なしに、複数のWindowsコンピューターのイベントを1台の収集サーバーへ転送するWindows標準の機能。
イベントログの保持期間(ログサイズ)
イベントログが上書きされずに保持される期間。既定の最大サイズは小さく、イベント数が多い環境では数日で一巡することがある。
ログの最大サイズ
ログのロールオーバー
Get-WinEventはクラシックログに加えアプリケーションとサービスログも読めるためGet-EventLogの後継として使われ、PowerShell 7ではGet-EventLog自体が利用できない。
Get-WinEventの出力をパイプ後段でWhere-Objectで絞ると、全イベントをオブジェクト化してから捨てることになり調査が遅くなり得る。
FilterHashtableを使うとイベントログのAPI側で絞り込みが行われるため、後段フィルタによる遅延を避けられる。
FilterXPathも同様にサーバー側で絞り込むため、複雑な条件でも後段フィルタによる遅延を避けられる。
Get-WinEventはLogName・ID・Level・StartTimeなど決まったキーを持つFilterHashtableパラメーターで絞り込みを指定できる。
Get-WinEventはイベントデータの中身も含めて絞り込めるFilterXPathパラメーターを持つ。
タスク名などイベントデータ固有の項目で絞り込みたいTaskScheduler/Operationalログの調査では、記事はFilterXPathの利用を推奨している。
Get-WinEventが返す各イベントはToXml()メソッドでXML化でき、EventData配下の名前付き項目を取り出せる。
ToXml()のEventDataを使えば、Messageの正規表現切り出しのように表示言語で結果が変わる問題を避けられる。
セキュリティログの読み取りは既定の構成では管理者権限相当が必要になる(Event Log Readersグループへの追加やチャネルACLの変更で、管理者権限なしでも読み取りだけを許可できる)。
調査担当者に管理者権限を渡さずセキュリティログを読ませたい場合、記事はEvent Log Readersグループへの追加を推奨している。
ログオン・ログオフの追跡など認証関連の調査では、Get-WinEventはセキュリティログ(Security)を対象に指定できる。
セキュリティログなど個別チャネルの読み取り許可(SDDL)はwevtutil gl/slで確認・変更できる。
台数が多い単発調査では、複数コンピューターに並列実行できるInvoke-Commandが推奨される。
恒常的にログを集約したい場合は、追加エージェント不要のWindowsイベント転送(WEF)が推奨される。
-ComputerNameでの直接取得・Invoke-Commandでの並列実行・.evtx採取後の解析のいずれでも、各コンピューター上でイベントを取得する部分は結局Get-WinEventが担う(Windowsイベント転送(WEF)はこの限りではなく、転送はサブスクリプションの仕組みで行われる)。
タスクスケジューラの実行履歴を調べる場合、それはMicrosoft-Windows-TaskScheduler/OperationalログとしてGet-WinEventでのみ読める。
Get-EventLogはクラシックログしか扱えないため、TaskScheduler/Operationalのようなアプリケーションとサービスログには使えない。
調べたい時間帯のイベントがログ上書きで既に失われていればGet-WinEventでも取得できず、十分なログ保持期間が前提となる。
ログの最大サイズはwevtutil sl /msで変更できる。