3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(Windows)ログオン・ログアウトをイベントログから解析する

ターミナルサーバでユーザがリモートデスクトップでログイン・ログアウトしてる情報を取りたいという要件です。

これらの情報はサーバのイベントログ→セキュリティに記録されています。

ただイベントログは分かりづらいんですよね。

取りあえず実際にログイン、ロック、ロック解除、ログオフを行って、その時にどのようなイベントが出力されるか実験してみました。

結果は下記のとおりです。

●ログイン時

-------------------------------------------

イベントの種類:成功の監査

イベント ソース:Security

イベント カテゴリ:ログオン/ログオフ

イベント ID:552

日付:2010/07/26

時刻:16:31:34

ユーザー:NT AUTHORITY\SYSTEM

コンピュータ:TESTSV

説明:

明示的な資格情報を使ったログオン試行:

ログオンしたユーザー:

ユーザー名:TESTSV$

ドメイン:HOGEDOMAIN

ログオン ID:(0x0,0x000)

ログオン GUID:-

資格情報に使われたユーザー:

ターゲット ユーザー名:hogeuser

ターゲット ドメイン:HOGEDOMAIN

ターゲット ログオン GUID: {xxxx}

ターゲット サーバー名:localhost

ターゲット情報:localhost

呼び出し側プロセス ID:3700

ソース ネットワーク アドレス:10.0.1.100

ソース ポート:4359

-------------------------------------------

イベントの種類:成功の監査

イベント ソース:Security

イベント カテゴリ:ログオン/ログオフ

イベント ID:528

日付:2010/07/26

時刻:16:31:34

ユーザー:HOGEDOMAIN\hogeuser

コンピュータ:TESTSV

説明:

ログオンの成功:

ユーザー名:hogeuser

ドメイン:HOGEDOMAIN

ログオン ID:(0x0,0x000)

ログオンの種類:10

ログオン プロセス:User32

認証パッケージ:Negotiate

ワークステーション名:TESTSV

ログオン GUID:{xxxx}

呼び出し側ユーザー名:TESTSV$

呼び出し側ドメイン:HOGEDOMAIN

呼び出し側ログオン ID:(0x0,0x000)

呼び出し側プロセス ID: 3700

移行されたサービス: -

ソース ネットワーク アドレス:10.0.1.100

ソース ポート:4359

-------------------------------------------

イベントの種類:成功の監査

イベント ソース:Security

イベント カテゴリ:ログオン/ログオフ

イベント ID:552

日付:2010/07/26

時刻:16:31:35

ユーザー:HOGEDOMAIN\hogeuser

コンピュータ:TESTSV

説明:

明示的な資格情報を使ったログオン試行:

ログオンしたユーザー:

ユーザー名:hogeuser

ドメイン:HOGEDOMAIN

ログオン ID:(0x0,0x000)

ログオン GUID:{xxxx}

資格情報に使われたユーザー:

ターゲット ユーザー名:administrator

ターゲット ドメイン:HOGEDOMAIN

ターゲット ログオン GUID: {xxxx}

ターゲット サーバー名:localhost

ターゲット情報:localhost

呼び出し側プロセス ID:816

ソース ネットワーク アドレス:-

ソース ポート:-

-------------------------------------------

イベントの種類:成功の監査

イベント ソース:Security

イベント カテゴリ:ログオン/ログオフ

イベント ID:528

日付:2010/07/26

時刻:16:31:35

ユーザー:HOGEDOMAIN\administrator

コンピュータ:TESTSV

説明:

ログオンの成功:

ユーザー名:administrator

ドメイン:HOGEDOMAIN

ログオン ID:(0x0,0x2BBBEF20)

ログオンの種類:2

ログオン プロセス:seclogon

認証パッケージ:Negotiate

ワークステーション名:TESTSV

ログオン GUID:{xxxx}

呼び出し側ユーザー名:hogeuser

呼び出し側ドメイン:HOGEDOMAIN

呼び出し側ログオン ID:(0x0,0x000)

呼び出し側プロセス ID: 816

移行されたサービス: -

ソース ネットワーク アドレス:-

ソース ポート:-

-------------------------------------------

ログイン時はイベントID 528(ログイン) がログインユーザとAdministratorでそれぞれ出て、イベントID 552 がログインユーザとSYSTEMでそれぞれ出力されるようです。

(リモートデスクトップ接続なのでログインの種類は10になってます。)

ロック時は特にイベントに残っていませんでした。

●ロック解除時

-------------------------------------------

イベントの種類:成功の監査

イベント ソース:Security

イベント カテゴリ:ログオン/ログオフ

イベント ID:552

日付:2010/07/26

時刻:16:37:45

ユーザー:NT AUTHORITY\SYSTEM

コンピュータ:TESTSV

説明:

明示的な資格情報を使ったログオン試行:

ログオンしたユーザー:

ユーザー名:TESTSV$

ドメイン:HOGEDOMAIN

ログオン ID:(0x0,0x000)

ログオン GUID:-

資格情報に使われたユーザー:

ターゲット ユーザー名:hogeuser

ターゲット ドメイン:HOGEDOMAIN

ターゲット ログオン GUID: {xxxx}

ターゲット サーバー名:localhost

ターゲット情報:localhost

呼び出し側プロセス ID:3700

ソース ネットワーク アドレス:10.0.1.100

ソース ポート:4359

-------------------------------------------

イベントの種類:成功の監査

イベント ソース:Security

イベント カテゴリ:ログオン/ログオフ

イベント ID:528

日付:2010/07/26

時刻:16:37:45

ユーザー:HOGEDOMAIN\hogeuser

コンピュータ:TESTSV

説明:

ログオンの成功:

ユーザー名:hogeuser

ドメイン:HOGEDOMAIN

ログオン ID:(0x0,0x000)

ログオンの種類:7

ログオン プロセス:User32

認証パッケージ:Negotiate

ワークステーション名:TESTSV

ログオン GUID:{xxxx}

呼び出し側ユーザー名:TESTSV$

呼び出し側ドメイン:HOGEDOMAIN

呼び出し側ログオン ID:(0x0,0x000)

呼び出し側プロセス ID: 3700

移行されたサービス: -

ソース ネットワーク アドレス:10.0.1.100

ソース ポート:4359

-------------------------------------------

イベントの種類:成功の監査

イベント ソース:Security

イベント カテゴリ:ログオン/ログオフ

イベント ID:538

日付:2010/07/26

時刻:16:37:45

ユーザー:HOGEDOMAIN\hogeuser

コンピュータ:TESTSV

説明:

ユーザーのログオフ:

ユーザー名:hogeuser

ドメイン:HOGEDOMAIN

ログオン ID:(0x0,0x000)

ログオンの種類:7

-------------------------------------------

ロック解除時はイベントID 528(ログイン),538(ログアウト) がログインユーザで出るようです。なぜログオン・ログアウトの両方がでるのかよくわかりません。

またSYSTEMでイベントID 552 が出ています。

(ロック解除なのでログインの種類は7になってます。)

●ログオフ時

-------------------------------------------

イベントの種類:成功の監査

イベント ソース:Security

イベント カテゴリ:ログオン/ログオフ

イベント ID:551

日付:2010/07/26

時刻:16:40:04

ユーザー:HOGEDOMAIN\hogeuser

コンピュータ:TESTSV

説明:

ログオフを開始したユーザー:

ユーザー名:hogeuser

ドメイン:HOGEDOMAIN

ログオン ID:(0x0,0x000)

-------------------------------------------

イベントの種類:成功の監査

イベント ソース:Security

イベント カテゴリ:ログオン/ログオフ

イベント ID:538

日付:2010/07/26

時刻:16:40:06

ユーザー:HOGEDOMAIN\hogeuser

コンピュータ:TESTSV

説明:

ユーザーのログオフ:

ユーザー名:hogeuser

ドメイン:HOGEDOMAIN

ログオン ID:(0x0,0x000)

ログオンの種類:10

-------------------------------------------

ログアウトの時はイベントID 538(ログアウト),551(ログオフ開始) が該当ログインユーザで出るようです。

ログオン・ログオフに関係するイベントIDの詳細は、MS Technet:ログオン イベントの監査ファイルサーバー監査(ログオン/ログオフ) | Windowsイベントログ - WhiteFoxが参考になります。

ログオン・ログオフには該当ユーザ以外にもAdministrator,SYSTEMが絡んでくるようです。

しかし鬱陶しいので該当ユーザだけで抽出した方がよさそうですね。

さて、イベントログは今回の使用率の用に何かの統計を取るのには非常に不向きです。

CSVでエクスポートしてもそっから加工してやるのは一苦労なフォーマットになっています。

このイベントログを解析してくれるツールが無いものかと探したら、マイクロソフトが提供している Log Parser というツールが結構使えるようです。

なので早速試してみました。

ダウンロードはMSダウンロードセンター:ダウンロードの詳細 : Log Parser 2.2 日本語版から行えます。

SQLみたいなクエリを書くことで幅広い集計や抽出ができるようです。

使い方は、Log Parserの概要 - @ITLog Parserでログを統合的に扱い運用保守に役立てる(基本編)(1/4):CodeZineが参考になります。

クエリ構文や関数の詳細はツールに同封のヘルプファイル(ちゃんと日本語)が役立ちます。

とりあえず下記クエリを query02.txt として保存し、LogParserにかけてみました。(外部クエリファイルが使えるのもうれしいです。)

SELECT * 

INTO res1.csv

FROM TESTSV.evt

WHERE eventid IN (528;538) /*ログオン・ログアウトのみ*/

AND Strings LIKE 'hogeuser%' /*指定したユーザのみ*/

AND TimeGenerated > '2010-07-10 00:00:00'

ORDER BY TimeGenerated DESC

C:\Program Files\Log Parser 2.2>LogParser.exe -i:EVT -o:CSV file:query02.txt

統計情報:

---------

処理された要素: 59976

出力された要素: 8

実行時間: 2.42 秒

結果はこんなCSVで出てきます。(横に長いので見にくいですが....)

EventLogRecordNumberTimeGeneratedTimeWrittenEventIDEventTypeEventTypeNameEventCategoryEventCategoryNameSourceNameStringsComputerNameSIDMessageData

C:\Program Files\Log Parser 2.2\TESTSV.evt8172682010/07/26 16:402010/07/26 16:405388Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|10TESTSVS-1-5-21-xxxユーザーのログオフ: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 10

C:\Program Files\Log Parser 2.2\TESTSV.evt8172632010/07/26 16:372010/07/26 16:375288Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|7|User32 |Negotiate|TESTSV|{xxx}|TESTSV$|HOGEDOMAIN|(0x0,0x000)|3700|-|10.0.1.100|4359TESTSVS-1-5-21-xxxログオンの成功: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 7 ログオン プロセス: User32 認証パッケージ: Negotiate ワークステーション名: TESTSV ログオン GUID: {xxx}

C:\Program Files\Log Parser 2.2\TESTSV.evt8172642010/07/26 16:372010/07/26 16:375388Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|7TESTSVS-1-5-21-xxxユーザーのログオフ: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 7

C:\Program Files\Log Parser 2.2\TESTSV.evt8172472010/07/26 16:312010/07/26 16:315288Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|10|User32 |Negotiate|TESTSV|{xxx}|TESTSV$|HOGEDOMAIN|(0x0,0x000)|3700|-|10.0.1.100|4359TESTSVS-1-5-21-xxxログオンの成功: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 10 ログオン プロセス: User32 認証パッケージ: Negotiate ワークステーション名: TESTSV ログオン GUID: {xxx}

C:\Program Files\Log Parser 2.2\TESTSV.evt8170822010/07/26 15:012010/07/26 15:015388Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|10TESTSVS-1-5-21-xxxユーザーのログオフ: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 10

C:\Program Files\Log Parser 2.2\TESTSV.evt8170572010/07/26 14:502010/07/26 14:505388Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|10TESTSVS-1-5-21-xxxユーザーのログオフ: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 10

C:\Program Files\Log Parser 2.2\TESTSV.evt8170542010/07/26 14:502010/07/26 14:505288Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|10|User32 |Negotiate|TESTSV|{xxx}|TESTSV$|HOGEDOMAIN|(0x0,0x000)|7384|-|192.168.125.224|3258TESTSVS-1-5-21-xxxログオンの成功: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 10 ログオン プロセス: User32 認証パッケージ: Negotiate ワークステーション名: TESTSV ログオン GUID: {xxx}

C:\Program Files\Log Parser 2.2\TESTSV.evt8170262010/07/26 14:392010/07/26 14:395288Success Audit event2ログオン/ログオフSecurityhogeuser|HOGEDOMAIN|(0x0,0x000)|10|User32 |Negotiate|TESTSV|{xxx}|TESTSV$|HOGEDOMAIN|(0x0,0x000)|2552|-|10.0.1.100|3156TESTSVS-1-5-21-xxxログオンの成功: ユーザー名: hogeuser ドメイン: HOGEDOMAIN ログオン ID: (0x0,0x000) ログオンの種類: 10 ログオン プロセス: User32 認証パッケージ: Negotiate ワークステーション名: TESTSV ログオン GUID: {xxx}

Log Parserでイベントログを出すとフィールドが全部で15個しか出てこず、ユーザ名やドメイン名、ログオンの種類などの情報が連結されて Strings や Message に入ってしまいます。Strings では | が区切り文字に、Message は : が区切り文字になってるようですね。

しかし、Log Parserには様々な関数が用意されており、このような任意の区切り文字で分割し、指定された部分を取得するなんてこともできるようです。

なので上記のユーザ名を条件にする部分も関数を使えばきれいにかけます。

こんな感じです。(ついでにログオンの種類を10つまりリモートデスクトップのみの接続の条件を付け加えてます。)

SELECT * 

INTO res1.csv

FROM TESTSV.evt

WHERE eventid IN (528;538) /*ログオン・ログアウトのみ*/

AND EXTRACT_TOKEN( Strings , 3 , '|') = 'hogeuser' /*指定したユーザのみ(区切関数使用)*/

AND EXTRACT_TOKEN( Strings , 3 , '|') = '10' /*リモートデスクトップ接続のみ*/

AND TimeGenerated > '2010-07-10 00:00:00'

ORDER BY TimeGenerated DESC

今回の要件は指定した期間で各ユーザがログイン・ログアウトを一日どれくらい行っているかを知りたいので下記のようなクエリとしました。

集計関数を使って回数を求めます。

SELECT TO_DATE(TimeGenerated) , EXTRACT_TOKEN( Strings , 0 , '|'), COUNT(EXTRACT_TOKEN( Strings , 0 , '|')) 

INTO res1.csv

FROM TESTSV.evt

WHERE eventid IN (528;538)

AND EXTRACT_TOKEN( Strings , 0 , '|') NOT LIKE 'Administrator'

AND EXTRACT_TOKEN( Strings , 0 , '|') NOT LIKE 'TESTSV$'

AND EXTRACT_TOKEN( Strings , 0 , '|') NOT LIKE 'ANONYMOUS LOGON'

AND TimeGenerated > '2010-07-10 00:00:00'

AND EXTRACT_TOKEN( Strings , 3 , '|') = '10'

GROUP BY EXTRACT_TOKEN( Strings , 0 , '|') , TO_DATE(TimeGenerated)

ORDER BY TO_DATE(TimeGenerated) , EXTRACT_TOKEN( Strings , 0 , '|') ASC

ORDER BY の注意点ですが、普通のSQLだと指定した列ごとに ASC , DESC を指定できますが、Log Parserだと ORDER BY 句全体で一つのASCまたはDESCしか指定できないようです。また、ORDER BY句は最後の句になる必要があるようです。

ORDER BY clm1 ASC , clm2 DESC

/*上はNGで下ならOKということになります。*/

ORDER BY clm1 , clm2 DESC

Log ParserからOfficeを使ってチャート(グラフ)を作ったり、SQL Server に出力したりすることもできるようですね。

まぁふつうはCSVにさえ出てくれば後は自由に加工できるんで助かるんですが。。。

また、今回は取り上げませんでしたがクエリを外部ファイルにした時にパラメータを動的に変更することもできるようです。詳しくは参考元の@ITの記事が役立ちます。