PowerShell でイベントログを抽出してみた。

GUIツールであるイベントビューアを使わず、PowerShellのコマンドレットだけでイベントログを検索し、条件に合致するイベントを抽出する方法を考えてみました。

 

 

<前提>

(1).Net Framework 3.5 以上がインストールされている必要があります。

※Windows Server 2008 R2 の場合は、サーバーマネージャーの「機能の追加」で「.Net Framework 3.5.1 の機能」をインストールすれば大丈夫です。

(2)PowerShellを「管理者として実行」する必要があります。

 

 

<検索条件>

(1)「アプリケーションとサービスログ」の中にある、「Microsoft-Windows-GroupPolicy/Operational」を検索します。

(2)直近24時間以内に記録されたイベントを検索します。

(3)「エラー」や「警告」など、「情報」以外のイベントを検索します。

 

 

<コマンド例> (全3行)

$CT = Get-Date

$24ha = $CT.AddHours(-24)

Get-WinEvent -Logname Microsoft-Windows-GroupPolicy/Operational | Where-Object {$_.TimeCreated -ge $24ha -and $_.LevelDisplayName -ne "情報"}

 

 

<コマンド解説>

一行目では、現在の時刻(current time)を Get-Date コマンドレットにより取得し、変数「$CT」に格納しています。

 

二行目では、時刻を加算減算するメソッド「AddHours」を使用して24時間前の時刻を取得し、変数「$24ha」に格納しています。

(二行目は、$CT.AddDays(-1) と記述して一日前の時刻を取得しても、全く同じ意味になります。)

 

三行目のパイプ(|)より前の部分で実行している Get-WinEvent コマンドレットは、指定したイベントログの全イベントを取得するためのコマンドレットです。

このコマンドレットを実行するために、前提(1)・(2)を両方満たしている必要があります。

 

そして最後にパイプ以降の部分で、取得した全イベントの中から検索条件に合致するものだけを抽出しています。

-ge は「〜以上」、-ne は「〜と不一致」を意味し、それら二つの条件式を -and により並記しています。