Windowsでは、ユーザーのログオン・ログオフイベントがセキュリティログに記録されています。PowerShellを使えば、これらのイベントログからログオン履歴を抽出し、不審なアクセスや深夜のログインなどを検出する監視体制を構築できます。本記事では、イベントログからログオン履歴を取得し、不正アクセスの兆候をチェックする方法を紹介します。
対象となるログオンイベントの種類
Windowsのセキュリティログには、ログオンに関する以下のようなイベントが記録されています:
- 4624:正常なログオン
- 4625:ログオン失敗(認証エラーなど)
- 4634:ログオフ
ログオン履歴を取得する基本コマンド
Get-WinEvent -FilterHashtable @{
LogName='Security';
Id=4624;
StartTime=(Get-Date).AddDays(-1)
} | Select-Object TimeCreated, Id, @{Name='User';Expression={
($_ | ForEach-Object {
[xml]$x = $_.ToXml()
$x.Event.EventData.Data | Where-Object {$_.Name -eq 'TargetUserName'} | Select-Object -ExpandProperty '#text'
})
}}
このスクリプトは、過去24時間の「正常なログオン(4624)」イベントを取得し、ログイン時間とユーザー名を抽出します。
ログオン失敗(4625)の検出
ログイン失敗が続いている場合、不正アクセスの兆候となる可能性があります。以下のスクリプトで失敗イベントも確認可能です:
Get-WinEvent -FilterHashtable @{
LogName='Security';
Id=4625;
StartTime=(Get-Date).AddDays(-1)
} | Select-Object TimeCreated, @{Name='ユーザー';Expression={
[xml]$x = $_.ToXml()
$x.Event.EventData.Data | Where-Object {$_.Name -eq 'TargetUserName'} | Select-Object -ExpandProperty '#text'
}}, @{Name='失敗理由';Expression={
[xml]$x = $_.ToXml()
$x.Event.EventData.Data | Where-Object {$_.Name -eq 'FailureReason'} | Select-Object -ExpandProperty '#text'
}}
特定のユーザーや時間帯でフィルタリング
管理者ユーザーや夜間(例:22時〜翌5時)のログオンだけを抽出したい場合は、Where-Object
で条件を追加します:
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} |
Where-Object {
$_.TimeCreated.Hour -ge 22 -or $_.TimeCreated.Hour -lt 5
}
CSVファイルに保存して記録する
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} |
Select-Object TimeCreated, MachineName, Message |
Export-Csv -Path "C:\Logs\logon_history.csv" -Encoding UTF8 -NoTypeInformation
注意点と前提条件
- 対象PCの「監査ポリシー」でログオンイベント監視が有効である必要があります
- ログ保持期間や最大サイズが制限されている場合、過去データが失われる可能性があります
- 管理者権限でPowerShellを実行する必要があります
まとめ
PowerShellを活用することで、Windowsのイベントログからログオン履歴を効率的に取得し、不審なアクセスの兆候を早期に検出できます。スケジュールタスクと組み合わせて定期的に実行・通知することで、システムのセキュリティ監視体制を強化できます。管理対象が複数台にわたる場合でも、リモートログ取得を組み合わせて一元管理が可能です。