EVENTQUERY.vbsでイベントログを出力する

Windows XP、Windows Server 2003にはEVENTQUERY.vbsというVBSファイルが既定でインストールされていて、これを利用するとイベントログに書き込まれたログが比較的簡単に摘出できます。

EVENTQUERY.vbs [/s Computer [/u Domain\User [/p Password]]][/fi FilterName][/fo {TABLE | LIST | CSV}][/r EventRange [/nh] [/v] [/l [APPLICATION] [SYSTEM] [SECURITY] ["DNS server"] [UserDefinedLog] [DirectoryLogName] [*] ]

               [/FO 形式] [/R 範囲] [/NH] [/L ログ名 | *]

説明:
    EVENTQUERY.vbs スクリプトにより、管理者は 1 つ以上のイベント
    ログ中のイベントとイベントのプロパティを一覧表示できます。

パラメータ一覧:
    /S     サーバー             接続先のサーバーを指定します。

    /U   [ドメイン\]ユーザー  コマンドが実行されるユーザー
                                のコンテキストを指定します。

    /P     パスワード      指定のユーザー コンテキストの
                           パスワードを指定します。

    /V                     詳細情報を表示します。出力時に詳細情報を
                           画面に表示するように指定します。

    /l   [APPLICATION] [SYSTEM] [SECURITY] ["DNS server"] [UserDefinedLog] [DirectoryLogName] [*]
                           監視するログを指定します。有効な値は、
                           Application、System、Security、"DNS server"、
                           ユーザー定義ログ、およびディレクトリ ログです。
                           "DNS server" は、/s パラメータで指定したコン
                           ピュータで DNS サービスを実行している場合にのみ
                           使用できます。複数のログを監視するように指定する
                           には、/l パラメータを繰り返し使います。
                           ワイルドカード (*) も使えます。これが既定です。

    /FI    フィルタ        クエリによりフィルタして取り込むまたは
                           除外するイベントの種類を指定します。

    /FO    形式            出力を表示する形式を指定します。
                           有効な形式は "TABLE"、"LIST" および
                           "CSV" です。

    /R     範囲            一覧表示するイベントの範囲を指定します。
                           有効な値:
                               'N' - 最近の N 個のイベントを一覧表示します。
                              '-N' - 最古の N 個のイベントを一覧表示します。
                           'N1-N2' - N1 から N2 のイベントを一覧表示します。

    /NH                    "列ヘッダー" が出力に表示されないように指定
                           します。
                           "TABLE" および "CSV" の形式にのみ有効です。

    /L     ログ名          照会するログを指定します。

    /?                     このヘルプ/使用法を表示します。

    有効なフィルタ 使用できる演算子    有効な値
    -------------  ------------------  ------------
    DATETIME       eq,ne,ge,le,gt,lt   MM/dd/yy(yyyy),hh:mm:ssAM(/PM)
    TYPE           eq,ne               SUCCESS, ERROR, INFORMATION,
                                       WARNING, SUCCESSAUDIT,
                                       FAILUREAUDIT
    ID             eq,ne,ge,le,gt,lt   負でない整数(0 - 65535)
    USER           eq,ne               文字列
    COMPUTER       eq,ne               文字列
    SOURCE         eq,ne               文字列
    CATEGORY       eq,ne               文字列

注意: フィルタ "DATETIME" は "開始日- 終了日" のように指定可能です。
      この形式では "eq" 演算子のみ利用可能です。

例:
    EVENTQUERY.vbs
    EVENTQUERY.vbs /L system
    EVENTQUERY.vbs /S system /U user /P password /V /L *
    EVENTQUERY.vbs /R 10 /L Application /NH
    EVENTQUERY.vbs /R -10 /FO LIST /L Security
    EVENTQUERY.vbs /R 5-10 /L "DNS Server"
    EVENTQUERY.vbs /FI "Type eq Error" /L Application
    EVENTQUERY.vbs /L Application
            /FI "Datetime eq 08/15/02,03:15:00AM-08/15/02,03:15:00PM"
    EVENTQUERY.vbs /FI "Datetime gt 07/04/02,04:27:00PM"
            /FI "Id gt 700" /FI "Type eq warning" /L System
    EVENTQUERY.vbs /FI "Type eq error OR Id gt 1000 "

例えばアプリケーションのイベントログからイベントID”1004″のソース”BINLSVC”が出したログを詳細付きでリスト表示する場合には以下をコマンドプロンプトに入力します。

Cscript "C:\WINDOWS\system32\eventquery.vbs" /l APPLICATION /FI "Id eq 1004 And Source eq BINLSVC" /FO List /V

演算子の部分は分かりにくいけど、それぞれ

eq = equal(指定された値と比較して等しいか判定)
ne = notEquals(指定された値と比較して等しくないか判定)
ge = greaterEqual(指定された値と等しいか、もしくは大きいかを判定)
le = lessEqual(指定された値と等しいか、もしくは小さいか判定)
gt = greaterThan(指定された値と比較して大きいか判定)
lt = lessThan(指定された値と比較して小さいか判定)

となっています。

なので例えばイベントIDが1004の場合とするのであれば

Id eq 1004

と記載しますし、逆にイベントIDが1004以外とするのであれば

Id ne 1004

とするわけです。

日付を指定して自動的にイベントログを保存したい場合には以下のようなスクリプトを作ると便利です。物凄くつくりの雑なものですが、参考程度に・・・。

Option Explicit

Call Main

'------------------------------------------------
' Main
'------------------------------------------------
Sub Main()
	Dim strPCNAME,strUSERNAME,strPASSWORD,strFILTER,strOUTPUT_TYPE
	'------------------------------------------------
	'PC名
	strPCNAME   = ""
	'ユーザ名
	strUSERNAME = ""
	'パスワード
	strPASSWORD = ""
	'フィルター(/FIの前に半角スペースが必要)
	strFILTER   = " /FI ""Datetime eq " & strDate(now-8) & ",12:00:00AM-" & strDate(now-1) &_
		 ",12:00:00AM"" /FI ""Id eq 1004 And Source eq BINLSVC"""

	'出力形式(/FOの前に半角スペースが必要)
	'strOUTPUT_TYPE = " /FO CSV"
	strOUTPUT_TYPE = " /FO LIST"
	'------------------------------------------------

	'QUERY_EVENTの呼び出し
	Call QUERY_EVENT(strFILTER,strPCNAME,strUSERNAME,strPASSWORD,strOUTPUT_TYPE)
End Sub

'------------------------------------------------
' QUERY_EVENT
'------------------------------------------------
'eventquery.vbsの実行
Function QUERY_EVENT(strFILTER,strPCNAME,strUSERNAME,strPASSWORD,strOUTPUT_TYPE)
	Dim objWshShell,objExec
	'eventquery.vbsに渡すコマンドライン
	Dim strCMDLine
	'イベントログの値
	Dim strEventLOG

	Set objWshShell = WScript.CreateObject("WScript.Shell")

	'ID・パスワード等が空白ならコマンドに組み込まない
	If strPCNAME <> "" AND strUSERNAME <> "" AND strPASSWORD <> "" Then
		strPCNAME = "/S " & strPCNAME & " "
		strUSERNAME = "/U " & strUSERNAME & " "
		strPASSWORD = "/P " & strPASSWORD & " "
	End If

	'実行コマンド
	strCMDLine = "Cscript C:\WINDOWS\system32\eventquery.vbs /V /L APPLICATION "& strPCNAME & strUSERNAME & strPASSWORD & strFILTER & strOUTPUT_TYPE

	Wscript.Echo strCMDLine

	Set objExec = objWshShell.Exec(strCMDLine)
	strEventLOG = objExec.StdOut.ReadAll

	Wscript.Echo strEventLOG
End Function

'------------------------------------------------
' strDate(日付整形)
'------------------------------------------------
Function strDate(dtYMD)
    Dim objFS
    Dim WSHShell
    If Len(Datepart("m",dtYMD)) = 1 then
        strDate = "0" & Datepart("m",dtYMD)
    Else
        strDate = Datepart("m",dtYMD)
    End if

    If Len(Datepart("d",dtYMD)) = 1 then
        strDate = strDate & "/" & "0" & Datepart("d",dtYMD)
    Else
        strDate = strDate & "/" & Datepart("d",dtYMD)
    End if

    strDate =strDate & "/" & Datepart("YYYY",dtYMD)
End Function

一応簡単に説明しておきますと、8日前から昨日までのアプリケーションのイベントログからイベントID”1004″のソース”BINLSVC”が出したログを詳細付きで表示します。以下の部分を変更すると範囲が変わります。

strDate(now-8)

また、Windows Server 2003以降のOSでのみ実行できる方法ですが、実行結果が流れてしまってイライラする場合には

Cscript hogehoge.vbs | clip

と実行する事により結果をクリップボードにコピーする事も出来ます。何気に覚えておくと便利ですよ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です