会社で使用している2003serverでセキュリティログを保存しなければならなくなりました。
色々と調べていたら参考になりそうな情報を発見したのでコピーさせていただきました。
--------------------------------------------------------------------------------
Windowsログとは、マイクロソフトのシステムログともいわれていて、FreeBSDやLinuxでいうシスログに相当するものです。
個人的には満足のいくものではないものなのですが、OSがリリースされてきていても、あまり満足にいくものにはなっていないようです。
(IMEやサウンドなど、満足できていないものは多いのです)
※Windows VistaやServer 2008では、多少改善されているみたいですが、良くわかっていないです。このマシンもVistaなんですが
不満点として、
・イベントログの情報を他のマシンにsyslog転送のように送ることはできない(※XPまでは)
・ログのローテートすることができない
・出力される1行の出力中に平気で改行コードが含まれていたりすることがある
など、そんなに大変そうでもないことがそのままでした。
今回利用するツールは、eventquery.vbs というマイクロソフトより提供されている VBスクリプトです。
Windows XPやServer 2003には標準で提供されているものです。
本ページではこれを使った内容を備忘録としてメモを置いておくことにしました。
毎度でお約束みたいなものですが、念のために。本ページに書かれている内容を鵜呑みにして、利用して。発生したなど、いかなる損害も一切の責任を負いませんので自己責任において参照ください。
1. イベントログ
Windows XP/Server 2003では、システムのログとしてWindows ログを出力しています。通常イベントログと呼ばれるものです。
アプリケーション、セキュリティ、システムのように分かれています。
前日の分のイベントログをスケジュールとして自動的にログ保存用のディレクトリにたまっていくように作成することにします。
Windows XPでもWindows Server 2003でも設定方法は同様です。 @echo off
rem
rem 2008-11- 9 イベントログの定期バックアップのバッチファイル
rem [修正履歴]
rem 2008-11- 9 初期のバージョン
rem 前日日付算出
rem 参照: http://www.atmarkit.co.jp/fwin2k/win2ktips/419batchdate/batchdate.html
rem バッチ・ファイル中で日付をファイル名に使用する - @IT
set yy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
set /a dd=%dd%-1
set dd=00%dd%
set dd=%dd:~-2%
set /a ymod=%yy% %% 4
if %dd%==00 (
if %mm%==01 (set mm=12&& set dd=31&& set /a yy=%yy%-1)
if %mm%==02 (set mm=01&& set dd=31)
if %mm%==03 (set mm=02&& set dd=28&& if %ymod%==0 (set dd=29))
if %mm%==04 (set mm=03&& set dd=31)
if %mm%==05 (set mm=04&& set dd=30)
if %mm%==06 (set mm=05&& set dd=31)
if %mm%==07 (set mm=06&& set dd=30)
if %mm%==08 (set mm=07&& set dd=31)
if %mm%==09 (set mm=08&& set dd=31)
if %mm%==10 (set mm=09&& set dd=30)
if %mm%==11 (set mm=10&& set dd=31)
if %mm%==12 (set mm=11&& set dd=30)
)
set i-DATE=%yy%%mm%%dd%
rem
rem イベントログのCSV出力
rem 参照: http://technet2.microsoft.com/WindowsServer/ja/library/68672494-7700-4cbf-8392-4b6ef87b87491041.mspx?mfr=true
rem Eventquery.vbs - Microsoft TechNet
rem Eventquery.vbs
rem /v 詳細
rem /l イベントログの種類指定
rem /fo フォーマット形式指定
rem /fi 条件を指定
rem /nh ヘッダーなし
rem 例
rem cscript c:\windows\system32\eventquery.vbs /v /l system /fo csv /fi "Datetime eq 11/01/2008,12:00:00AM-11/07/2008,11:59:59PM" > YYMMDD_SYSTEM.csv
rem cscript は絶対パス指定が必要
rem システムログを詳細に取得
rem CSV形式で出力
rem 条件式は11/1~11/7まで
rem ファイルは、日付.csv
rem 残っている問題
rem 1. 詳細に制御コード(改行など)が入っていることが良くあるので、CSVとして壊れることがある
rem 2.出力された結果がソートされていないので使いにくい。MSのツールにまともなsortがない
rem 3.日付で 08 09は 8 9 として処理しないとおかしくなる
cscript c:\windows\system32\eventquery.vbs /v /l system /fo csv /fi "Datetime eq %mm%/%dd%/%yy%,12:00:00AM-%mm%/%dd%/%yy%,11:59:59PM" > c:\temp\%i-DATE%_system_eventlog.csv
上記をスケジュールとして定時実行して、ログが作成されていることを確認。
問題がなければ出力するディレクトリを正式なものと差し変える
DOS窓より、
schtasks /create /sc DATE /MO 1 /TN EVENTLOG_BACKUP /ST 00:01 /TR c:\eventlog_everydaysave.bat
などのように登録して実施。
SCHTASKS /Query
などで確認することができる。
以下の章の内容も加える場合には、同バッチファイルの最後に1行を追加して実行されるようにする必要があります。
2. イベントログのバックアップとクリア
イベントログの中身がずっと残りっぱなしの状態で、ローテートしないままなのも残念なので、バックアップ後にクリアするようなスクリプトを探して組み合わせてみました。
#なんだか、HPBの設定を調整していないので、見にくい状態だな ' イベントログをバックアップし、完了後にクリアするスクリプト
' 参考ページ
' http://www.wisesoft.co.uk/Scripts/vbscript_backup_and_clear_an_event_log.aspx
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate,(Backup)}!\\" & _
strComputer & "\root\cimv2")
' 日付編集
Dim nowDate,monthString,dayString,BackupFileName,strMessage
nowDate = Date
monthString = Month(nowDate)
IF Len(monthString)<2 THEN
monthString = "0" & monthString
END IF
dayString = Day(nowDate)
IF Len(dayString)<2 THEN
dayString = "0" & dayString
END IF
' イベントログ書き込み用
' Constants for type of event log entry
' 参考 http://www.wisesoft.co.uk/scripts/vbscript_write_to_the_event_log.aspx
const EVENTLOG_SUCCESS = 0
const EVENTLOG_ERROR = 1
const EVENTLOG_WARNING = 2
const EVENTLOG_INFORMATION = 4
const EVENTLOG_AUDIT_SUCCESS = 8
const EVENTLOG_AUDIT_FAILURE = 16
set objShell = CreateObject("WScript.Shell")
' アプリケーション
Set colLogFiles = objWMIService.ExecQuery _
("Select * from Win32_NTEventLogFile where LogFileName='Application'")
BackupFileName = "c:\\backup_log\\application_" & Year(nowDate) & monthString & dayString & ".evt"
For Each objLogfile in colLogFiles
errBackupLog = objLogFile.BackupEventLog(BackupFileName)
If errBackupLog <> 0 Then
Wscript.Echo "The Application event log could not be backed up.(Application)"
Else
objLogFile.ClearEventLog()
strMessage = "clearebentlog: バックアップを実行しました(Application)"
objShell.LogEvent EVENTLOG_INFORMATION, strMessage
End If
Next
' セキュリティ
Set colLogFiles = objWMIService.ExecQuery _
("Select * from Win32_NTEventLogFile where LogFileName='Security'")
BackupFileName = "c:\\backup_log\\security_" & Year(nowDate) & monthString & dayString & ".evt"
For Each objLogfile in colLogFiles
errBackupLog = objLogFile.BackupEventLog(BackupFileName)
If errBackupLog <> 0 Then
Wscript.Echo "The Application event log could not be backed up.(Security)"
Else
objLogFile.ClearEventLog()
strMessage = "clearebentlog: バックアップを実行しました(Security)"
objShell.LogEvent EVENTLOG_INFORMATION, strMessage
End If
Next
' システム
Set colLogFiles = objWMIService.ExecQuery _
("Select * from Win32_NTEventLogFile where LogFileName='System'")
BackupFileName = "c:\\backup_log\\system_" & Year(nowDate) & monthString & dayString & ".evt"
For Each objLogfile in colLogFiles
errBackupLog = objLogFile.BackupEventLog(BackupFileName)
If errBackupLog <> 0 Then
Wscript.Echo "The Application event log could not be backed up.(System)"
Else
objLogFile.ClearEventLog()
strMessage = "clearebentlog: バックアップを実行しました(System)"
objShell.LogEvent EVENTLOG_INFORMATION, strMessage
End If
Next
このスクリプトを cleareventlog.vbs として c:\windows に置く場合、上記の章の最後に
cscript c:\windows\cleareventlog.vbs
のように加えることで、バックアップとクリアを実施できるようになります。
上記では、リテラルに c:\backup_log という ディレクトリが前提になっている形で書かれていますが、それぞれの環境に合わせて修正して使ってください。
とりあえず、備忘録として動作済みとして、ネットに置いておきます。
それぞれの著作者の組み合わせなので、皆様がさらにこれら同様の内容のコンテンツをネットに公開していただけると幸いです。
-------------------------------------------------------------------------------
自分の環境でうまく動作させられなくて苦戦していますが正常に動作したらまとめたいと思います。
0 件のコメント:
コメントを投稿