(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の概要 - @ITやLog 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の記事が役立ちます。