« Yahoo!ETCカード突然の有料化Let's noteのACアダプタ修理 »

Windows Serverでログオンログを見やすく表示

Windows Serverでログオンログを見やすく表示

パーマリンク 2009/04/14 22:16:55 著者: kumaold メール
カテゴリ: 仕事, サーバ関係, PHP, WSH/VBScript

Windows Serverでは、システムのログ管理はすべてイベントビューアによる閲覧のみとなっており、保存もバイナリファイルであるため扱いが面倒です。

テキストデータで吐き出させるためのツール類もそれなりにはあるのですが、ログオン/オフのログは1つのフィールドの中に改行交じりのデータで入っているため、1つ1つのレコードを開いて確認しないといけません。


要はログオン/オフ日時、ユーザ名、ログオンID、リモートホストさえ一覧できればいいのに、無駄な情報が多すぎてわかりにくいわけです。

そこで、VBScriptとPHPを使用してログ閲覧ツールを作ってみました。

まず、VBScriptまわりのリファレンスガイドはこちら。

またまたリファレンスがわかりにくいのはいつものことw

[logon.vbs]

'*********************************************
'* Get logon log by Windows EventLog Script  *
'*********************************************
'Usage:
' logon.vbs start_date > output.file
'Command:
' start_date ログ取得開始日(~1週間分)
'            例: 2009/04/01(~2009/04/07)

'コンピュータ名指定(デフォルト.)
strComputer = "." 

'取得期間の指定(デフォルト2009年4月1日)
If WScript.Arguments.Count < 1 Then
    StartDate = "2009/04/01"
Else
    '開始日を引数から取得
    StartDate = WScript.Arguments(0)
End If

Const CONVERT_TO_LOCAL_TIME = True 
Set dtmStartDate = CreateObject("WbemScripting.SWbemDateTime") 
Set dtmEndDate = CreateObject("WbemScripting.SWbemDateTime") 
DateToCheck = CDate(StartDate) 
dtmStartDate.SetVarDate DateToCheck, CONVERT_TO_LOCAL_TIME 
dtmEndDate.SetVarDate DateToCheck + 7, CONVERT_TO_LOCAL_TIME

'ログオン(ID.4624)、ログオフ(ID.4634)のみに絞り込み
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _ 
    ("Select * from Win32_NTLogEvent Where Logfile = 'Security' and (EventCode = '4624' or EventCode = '4634') " _ 
        & "and TimeWritten >= '" & dtmStartDate & "' and TimeWritten < '" & dtmEndDate & "'")
For Each objEvent in colLoggedEvents
    Wscript.Echo "Record Number: " & objEvent.RecordNumber
    dtmEventDate = objEvent.TimeWritten
    strTimeWritten = WMIDateStringToDate(dtmEventDate)
    Wscript.Echo "Time Written: " & strTimeWritten
    Wscript.Echo "Message: " & objEvent.Message
Next 

'ログ標準の時刻表記を「y/m/d h:i:s」形式で表示
Function WMIDateStringToDate(dtmEventDate)
    WMIDateStringToDate = CDate(Mid(dtmEventDate, 5, 2) & "/" & _
        Mid(dtmEventDate, 7, 2) & "/" & Left(dtmEventDate, 4) _
            & " " & Mid (dtmEventDate, 9, 2) & ":" & _
                Mid(dtmEventDate, 11, 2) & ":" & Mid(dtmEventDate, _
                    13, 2))
End Function


[logon.php]

<?php
if (!isset($argv[1]) || empty($argv[1])) {
    die("引数にログファイル名が指定されていません\n");
} else {
    $path = $argv[1];
}
if (!file_exists($path)) {
    die("ログファイルが存在しません\n");
}

if (isset($argv[2])) {
    $filter = $argv[2];
}

$logfile = file($path, FILE_IGNORE_NEW_LINES);
// 各ログの開始行を取得
foreach ($logfile as $key => $row) {
    // ログを整形
    $logfile[$key] = str_replace("\t", "", trim($row));
    if (preg_match("/Record Number/", $row)) {
        $logs[] = $key;
    }
}
unset($key, $row);
// 最終行の位置を配列の最後に登録
$logs[] = count($logfile);

// 各ログの先頭~次のログの先頭前までループ
for ($i = 0; $i < count($logs) - 1; $i++) {
    // UTC→JSTの時刻変換を行う
    preg_match("/Time Written: ([0-9\/: ]+)/", $logfile[$logs[$i] + 1], $match);
    $datetime = date("Y/m/d H:i:s", strtotime($match[1]) + 3600 * 9);
    preg_match("/Message: (.+)/", $logfile[$logs[$i] + 2], $match);
    $type = $match[1];
    $ipaddr = '';
    $username = '';
    $logon_id = '';
    for ($r = $logs[$i]; $r < $logs[$i + 1]; $r++) {
        $row = $logfile[$r];
        if (preg_match('/ログオ[ンフ]/', $type)) {
            if (preg_match("/アドレス:([0-9.-]+)/", $row, $match)) {
                $ipaddr = $match[1];
            }
            if (preg_match("/アカウント名:([a-zA-Z0-9_\-_]+)/", $row, $match)) {
                $username = $match[1];
            }
            if (preg_match("/ログオン ID:(0x[0-9a-f]{4,})/", $row, $match)) {
                $logon_id = $match[1];
            }
        }
    }
    // フィルタリングユーザ名に合致した行のみ表示
    if (!isset($filter) || isset($filter) && $username == $filter) {
        echo sprintf("%s %10s %-15s %-15s %s\n", $datetime, $logon_id, $username, $ipaddr, $type);
    }
}
?>


使い方は、まず日付を指定して1週間分のログをテキストに書き出します。

CScript //NoLogo logon.vbs 2009/04/06 > logon.log

それをphp側の整形表示スクリプトに渡します。
phpのパスはあらかじめ通しておき、各ファイルは同一階層に置いときます。

(本来はパイプで渡すべきですが、Windowsだと色々面倒なので)

php logon.php logon.log

これで、あれだけ見づらかったログがこんなに分かりやすく表示できます。

2009/04/06 00:18:53            SYSTEM          -               アカウントが正常にログオンしました。
2009/04/06 18:39:08            SYSTEM          -               アカウントが正常にログオンしました。
2009/04/07 11:59:03   0x3fb874 IIS_USER        -               アカウントが正常にログオンしました。
2009/04/07 12:25:07   0x3fb874 IIS_USER                        アカウントがログオフしました。
2009/04/07 15:26:49            SYSTEM          -               アカウントが正常にログオンしました。
2009/04/08 10:30:08   0x455ce6 IIS_USER        -               アカウントが正常にログオンしました。
2009/04/08 10:30:08   0x455ed9 IIS_USER        -               アカウントが正常にログオンしました。
2009/04/08 10:51:08   0x455ed9 IIS_USER                        アカウントがログオフしました。
2009/04/08 10:51:12   0x455ce6 IIS_USER                        アカウントがログオフしました。
2009/04/08 13:07:35            SYSTEM          -               アカウントが正常にログオンしました。
2009/04/09 08:07:10            SYSTEM          -               アカウントが正常にログオンしました。
2009/04/09 11:25:11   0x4b9ed4 IIS_USER        -               アカウントが正常にログオンしました。
2009/04/09 11:25:11   0x4ba0b8 IIS_USER        -               アカウントが正常にログオンしました。
2009/04/09 11:41:32   0x4bc4b2 Administrator   123.45.67.89    アカウントが正常にログオンしました。
2009/04/09 11:43:02   0x4bc4b2 Administrator                   アカウントがログオフしました。
2009/04/09 11:52:38   0x4e0a01 Administrator   111.222.333.44  アカウントが正常にログオンしました。
2009/04/09 11:54:09   0x4e0a01 Administrator                   アカウントがログオフしました。

さらにユーザ名によるフィルタリング機能も実装。

logon.phpの第2引数に表示したいユーザ名を指定すると絞り込みできます。

そのままでは表示されてしまう匿名ユーザ認証(IIS, WMSなど)によるログオンもこれで排除でき、アクセスログ管理に役立ちます。

2009/04/09 11:41:32   0x4bc4b2 Administrator   123.45.67.89    アカウントが正常にログオンしました。
2009/04/09 11:43:02   0x4bc4b2 Administrator                   アカウントがログオフしました。
2009/04/09 11:52:38   0x4e0a01 Administrator   111.222.333.44  アカウントが正常にログオンしました。
2009/04/09 11:54:09   0x4e0a01 Administrator                   アカウントがログオフしました。
2009/04/10 15:59:30   0x61e4c3 Administrator   55.66.77.88     アカウントが正常にログオンしました。
2009/04/10 16:01:00   0x61e4c3 Administrator                   アカウントがログオフしました。

これらのファイルをまとめときましたので、使いたい方はどうぞ。
おそらくWindows Server 2008環境でしかうまく動かないと思われます。

Windows_logon_log.zip


ひと目でわかるMicrosoft Windows Server 2008 (マイクロソフト公式解説書) (マイクロソフト公式解説書)ひと目でわかるMicrosoft Windows Server 2008 (マイクロソフト公式解説書) (マイクロソフト公式解説書)
天野 司

type="text/javascript" src="http://www.ad16.jp/socailmedia.php?a=CCBot%2F2.0+%28http%3A%2F%2Fcommoncrawl.org%2Ffaq%2F%29&u=http%3A%2F%2Fkuroutoshikou.blog16.jp%2Findex.php%2F2009%2F04%2F14%2Fwindows_servera_sa_sa_da_oa_sa_sa_da_eb_" charset="EUC-JP">

一六社で働くITエンジニアのブログ。

普段はWeb系システム開発と地元のPCサポートをやってます。いつの間にやら会社に8年目。
技術ネタ中心に日々の仕事と生活と趣味やらを気が向いたら書いてます。

2017年5月
 << <   > >>
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

検索

XMLフィード

16ブログ     multiblog engine