The other side of ADユーザー監査 ~ PowerShellからイベントログのクエリを実行

 
 
ライトニングトークで紹介したActive Directoryユーザーの監査ですが、
Tech Fieldersのサイトに私が発表したスライドがアップされました。
 
 
詳細は上記サイトからダウンロードできるコンテンツを見ていただくとして、
ここでは、イベントログのフィルタについて、少しフォローアップをしておきたいと思います。
 
 
Active Directoryユーザーの監査を行うときに、
まず誰を監査するか、対象を決めてください、という話をしました。
そのときに、発表スライドでは該当するユーザーをログオンイベントから選択できるように、
イベントIDが4624で、ログオンタイプが3(DCで認証されたログオンという意味)という
条件でXPathフィルタを設定する方法を紹介しました。
 
 
では、このようなフィルタをPowerShellから実行する場合、 どのように実装するか試してみました。
イベントログからのデータの取り出し方は
安納さんのブログ「ユーザーIDの変更履歴を収集するスクリプト」を参考にさせていただきました。
それで、作ったスクリプトはこちら。 
 


$ev=Get-Eventlog -LogName "security" | Where-Object {$_.eventid -eq 4624}
$ev | foreach {
    $time=$_.TimeGenerated.ToString()
    $line=($_.message).split("`n")
    if ($line[8]=3 -and $line[12] -notlike "*$*" -and $line[12] -notlike "*SYSTEM*"){
        $time + $line[12] + $line[14]
        }   
}

 
だいぶ汚いスクリプトなのですが、
簡単に説明しておくと、
イベントID4624のログを取得して、分解(($_.message).split("`n")の部分)した上で、
ログオンタイプが3で、かつアカウント名に$またはSYSTEMの名前がつかないログを
出力するように設定しています。
($とSYSTEMを除外しているのは、コンピュータアカウントのログオンログと
サービスアカウントのログオンログを除外するためです)
 
ここに出てくる$line[8]と$line[12]ですが、
これは個々のイベントログを行単位で分解したときの8行目、12行目を表しています。
それぞれの行の意味は下記を参照してください。
 
 
行で区切った上でif文で条件設定すれば、XPathと同じクエリが実行できますね。
それでもって、スクリプトを実行した様子がこちら。
 
 
左から、日時、アカウント名、ログオンIDとそれぞれ並んで表示されていることがわかります。
これなら、追跡したいユーザーとそのログオンIDが一目瞭然ですね。
 
本当なら、CSV形式できれいに表示されるように成形するところなのでしょうが、
本質を見てもらいたかったので、ご勘弁を。
 
どうぞ、お試しください。