PowerShell Get-WinEventでWindowsログを日付条件などを付けて検索

powershell logo PowerShell

はじめに Introduction

前回の記事で記載した「Windowsパソコンのブルートフォースアタック対策」のフロー①として「処理開始時間から直近30分以内に発生したイベントID:4625を検索する」をやっていきたいと思います。」


PowerShellで書いていきますがGet-WinEventコマンドでWindowsログを取得できるようです。
Windowsログの検索・絞込はパイプでWhere-Objectコマンドに渡して絞り込むようです。


Get-EventLog -LogName Application | Where-Object Source -Match defrag
Get-WinEvent -LogName Application | Where-Object { $_.ProviderName -Match 'defrag' }

MicrosoftのドキュメントではWhere-Objectコマンドだとパフォーマンスが良くないようで、Get-WinEventコマンドのFilterHashtableオプションで絞込みした方がいいと書いてありましたので、その方法で行きたいと思います。

Get-WinEventコマンドで検索

セキュリティログでIDが4625で、日付が2023-08-23 00:00~01:00までのログを検索


PS C:\WINDOWS\system32> Get-WinEvent -FilterHashtable @{LogName="Security";Id=4625;StartTime="2023-08-23 00:00";EndTime="2023-08-23 01:00"}


   ProviderName: Microsoft-Windows-Security-Auditing

TimeCreated                      Id LevelDisplayName Message
-----------                      -- ---------------- -------
2023/08/23 0:53:05             4625 情報             アカウントがログオンに失敗しました。...
2023/08/23 0:40:30             4625 情報             アカウントがログオンに失敗しました。...
2023/08/23 0:27:42             4625 情報             アカウントがログオンに失敗しました。...
2023/08/23 0:15:12             4625 情報             アカウントがログオンに失敗しました。...
2023/08/23 0:02:44             4625 情報             アカウントがログオンに失敗しました。...

検索範囲の開始時間と終了時間を変数にする

検索範囲の開始時間と終了時間は処理実行の30分前から現在までとしたいので、開始時間と終了時間を変数にします。
日付は「yyyy-MM-dd HH:mm」形式で、秒単位の指定は出来るか分かりません。


#### 定義
$RangeMinutes = 30
$SearchEndTime   = $(Get-Date -Format "yyyy-MM-dd HH:mm")
$SearchStartTime = $(Get-Date (Get-Date).AddMinutes(-$RangeMinutes) -Format "yyyy-MM-dd HH:mm")

#### 本処理
Get-WinEvent -FilterHashtable @{LogName="Security";Id=4625;StartTime="$SearchStartTime";EndTime="$SearchEndTime"}

検索結果が0件の場合はエラーとなる

上記スクリプトで検索してヒットするログが無い場合、下記の様なエラーが表示されます。
エラー処理を考えないとダメですね。


Get-WinEvent : 指定した選択条件に一致するイベントが見つかりませんでした。
発生場所 行:4 文字:1
+ Get-WinEvent -FilterHashtable @{LogName="Security";Id=4625;StartTime= ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (:) [Get-WinEvent], Exception
    + FullyQualifiedErrorId : NoMatchingEventsFound,Microsoft.PowerShell.Commands.GetWinEventCommand

各処理フローのスクリプト

各処理フローの具体的なスクリプトは記事を作成できしだいアップしていきます。
■ Windowsパソコンのブルートフォースアタック対策【概要編】


①処理開始時間から直近30分以内に発生したイベントID:4625を検索する
PowerShell Get-WinEventでWindowsログを日付条件などを付けて検索
はじめに Introduction 前回の記事で記載した「Windowsパソコンのブルートフォースアタック対策」のフロー①として「処理開始時間から直近30分以内に発生したイベントID:4625を検索する」をやっていきたいと思います。」...

②イベントID:4625のログ詳細から接続元IPを抽出してリストを作成
【準備中】
③抽出したIPが直近30分で何回ログイン失敗しているかカウントする
【準備中】
④カウント数が閾値以上のIPをブラックリストIPとして抜粋する
【準備中】
⑤ブラックリストIPをファイヤーウォールで拒否する
【準備中】
⑥以上の処理をタスクスケジューラーで5分毎に自動実行する
【準備中】

コメント