個人的には、いつものVBで書くところを今回はPowerShellで。
なぜか?それは、これに参加してみたからです。
「PowerShell Advent Calendar 2011」
http://atnd.org/events/22073
さて、イベントログを取得するだけでしたら、Get-Eventlogで楽々のPowerShellです。
ご参考「PowerShellでイベント・ログの内容を参照する - @IT」。
ところが、ログオン監査で必要なLogon Typeのフィルタリングが、詳細メッセージ中に含まれるため、ちょこっと工夫が必要です。とくに、サーバーとかドメコンですと直接コンソールにログオンしたものとリモートデスクトップのログオンを取得したいだけなのに、Networkのログオンが死ぬほど記録されています。さてどうしたものか・・・
では、実際に取得できるデータがどうなっているのかを見てみましょう^^。
>$obj = Get-WinEvent
>$obj[0]
> $obj | select *
Message : アカウントがログオフしました。
サブジェクト:
セキュリティ ID: <削除>
アカウント名: administrator
アカウント ドメイン: <削除>
ログオン ID: <削除>
ログオン タイプ: 10
このイベントは、ログオン セッションが破棄された場合に生成されます。これは、ログオン ID の値を使
用して、ログオン イベントに関連付けられる場合があります。ログオン ID は、同一コンピューターが次
に再起動するまでの間のみ一意です。
Id : 4634
Version : 0
(以下略)
このログオンタイプをどうやって取り出してフィルタリングするか……
実は、イベントログはご存知の通りさっくりXML化できます(なんといってもGUIの詳細タブクリックするとXMLっぽい画面ですし)
> $objXML = $obj.ToXML()
> $objXML
<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>
<System>
<Provider Name='Microsoft-Windows-Security-Auditing' Guid='{54849625-5478-4994-A5BA-3E3B0328C30D}'/>
<EventID>4634</EventID>
<Version>0</Version>
<Level>0</Level>
<Task>12545</Task>
<Opcode>0</Opcode>
<Keywords>0x8020000000000000</Keywords>
<TimeCreated SystemTime='2011-12-06T06:41:31.002530600Z'/>
<EventRecordID>14470257</EventRecordID>
<Correlation/>
<Execution ProcessID='476' ThreadID='5232'/>
<Channel>Security</Channel>
<Computer><削除></Computer>
<Security/>
</System>
<EventData>
<Data Name='TargetUserSid'>S-1-5-21-<省略>-500</Data>
<Data Name='TargetUserName'>administrator</Data>
<Data Name='TargetDomainName'><削除></Data>
<Data Name='TargetLogonId'>0xb8b6a7f</Data>
<Data Name='LogonType'>10</Data>
</EventData>
</Event>
おぉ、これなら何とか取れそう!。というとこで、XMLでフィルタリングしてみましょう。
〇とりあえずの要件:
1)取得するログ:セキュリティログ
2)取得するイベントID:4624(ログオン),4634(ログオフ)
3)取得するLogon Type:2(コンソール)、10(リモートデスクトップ)
さて、困ったこと。「FilterXPath」の使い方がさっぱりわからん
で、今欲しいのは、上記のXMLより以下の項目です。
1)Event→System→Provider Name ‘Microsoft-Windows-Security-Auditing'
2)Event→System→EventID 4624 or 4634
3)Event→EventData→Data Name ‘LogonType’ 2 or 10
☆Get-Help Get-WinEvent ?full と格闘してみましょう^^;
1) Event[System[Provider[@Name='Microsoft-Windows-Security-Auditing']
2) Event[System[EventID=’4624’ or EventID=’4634’]]
3) Event[EventData[(Data[@Name='LogonType']='2' or Data[@Name='LogonType']='10')]]
☆1から3が同時に成立すればよいのでANDでくっつけます
Event[System[Provider[@Name='Microsoft-Windows-Security-Auditing']]] and Event[System[EventID='4624' or EventID='4634']] and Event[EventData[(Data[@Name='LogonType']='2' or Data[@Name='LogonType']='10')]]
〇数学が大好きな人は、さらにくっつけることもできます(業務でこんなことやったらぶっちょめすw(というか、一生面倒見てもらいます^^;)
Event[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and (EventID='4624' or EventID='4634')] and EventData[(Data[@Name='LogonType']='2' or Data[@Name='LogonType']='10')]]
ということで、完成。管理者さんならちゃんと見やすく バッククォートしときませう。もうね、見やすくないコードは死んでいいよ?
(はい、Pow(ごめんねさい,3))
■例:イベントビューアーから、コンソールかリモートデスクトップにログオン/ログオフしたユーザーを抜き出す。
$objSecLog =Get-WinEvent -FilterXPath `
"Event[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] `
and (EventID='4624' or EventID='4634')] `
and EventData[(Data[@Name='LogonType']='2' or Data[@Name='LogonType']='10')]]"