Eventquery.vbs

なんとなく仕事の話が気になって続きを調べてみる。

Windowsイベントログをテキストファイルに出したくて、
WindowsXP以降、管理用ツールとして付属されることになったEventquery.vbsを使っている。
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/ja/library/ServerHelp/68672494-7700-4cbf-8392-4b6ef87b8749.mspx?mfr=true


しかし激しく使い勝手が悪い。
検索条件とかフィルタが細かく指定できるのはいいけど、出力の制御が冴えない。
メンバーの調査によると、

  • 日付&時間順でソートされない
  • おまけに日付や時間は、"2006/9/10 10:1"とか"2006/12/1 1:30"みたく出るもんだからソートしにくい
  • 出力項目をカスタマイズできない
  • Windows2000で使えない(リソースキット買えばいいらしいが)
  • イベントログのサイズが大きすぎる(8メガくらい)と何も出力されなくなる

どういうこと?、とソースを覗いてみると。

  • 400行近い関数が…
  • インデントぐちゃぐちゃ

読む気なくした。どのみちCopyright付いてて改造なんてダメだよな。
出来が悪いんならWMIのサンプル扱いしてくれてればなぁ。


なのでWMIで作ってみるが。

ということでさくっとこんな感じに。

eventlog2txt.vbs

Option Explicit

Dim sourceName
Dim fromDate
Dim toDate
Dim queryString
Dim locator
Dim service
Dim resultSet
Dim row
Dim line

If WScript.Arguments.Count = 3 Then
    sourceName = WScript.Arguments.Item(0)
    fromDate = WScript.Arguments.Item(1)
    toDate = WScript.Arguments.Item(2)
Else
    WScript.StdOut.WriteLine _ 
       "Usage: cscript getEventLog.vbs [ソース名] [開始日付] [終了日付]"
    WScript.Quit
End If

queryString = "SELECT * FROM Win32_NTLogEvent " & _
                "WHERE Logfile = 'Application' AND " & _
                "SourceName = '" & SourceName & "' AND " & _
                "TimeGenerated >= '" & fromDate & "' AND " & _
                "TimeGenerated <= '" & toDate & "'"

Set locator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set service = Locator.ConnectServer
Set resultSet = Service.ExecQuery(queryString)

For Each row In resultSet
    ' 後でソートするのでMessageの改行はカット
    line = chr(&H22) & row.TimeGenerated & chr(&H22) & "," & _
           chr(&H22) & row.Type & chr(&H22) & "," & _
           chr(&H22) & row.SourceName & chr(&H22) & "," & _
           chr(&H22) & row.ComputerName & chr(&H22) & "," & _
           chr(&H22) & row.CategoryString & chr(&H22) & "," & _
           chr(&H22) & row.User & chr(&H22) & "," & _
           chr(&H22) & Replace(row.Message, VbCrLf, "") & chr(&H22)
    WScript.StdOut.WriteLine line
Next

Set row = Nothing
Set resultSet = Nothing
Set service = Nothing
Set locator = Nothing

生成時刻を先頭に出力させたから、ソートはDOSコマンドにまかせりゃいいじゃん。

cscript eventlog2txt.vbs MY_APP 1900/01/01 2006/07/15 | sort /+2

もしもEventquery.vbsがどーしても実運用に耐えられなかったらだけど、その時は代わりをなんとか作れそうだ。
イベントログのサイズの問題は、なんかWQLの制限っぽい気がするけど…。