はじめに
OS起動後にイベントログでエラーが発生していた場合、過去に発生したイベントコードなのかをVBScriptで確認するサンプルです。OSを再起動してイベントログを確認する際に、過去に発生していたエラーなのかをVBScriptを使って確認します。
このコード、過去のイベントコードを確認する動作が遅いです。。
イベントコードごとに過去3か月のエラー回数を出力する
- eventlogAnalyze.vbs
On error resume next
'//変数
Dim oClassSet_All
Dim oClassSet_Eventcode
Dim oClassSet_OS
Dim oClass
Dim oLocator
Dim oService
Dim strBaseDate
Dim strStartDate
Dim intEventCode
Dim strBeforeEventCode
Dim intEventCount
Dim strAnalyzeMsg
Dim strEventMsg
'//イベントログ遡及開始日を3か月前とする
strStartDate = DateAdd("m", -3, DateAdd("h", -9, now))
'strBaseDate = "2020/12/29 4:30"
'//WMI接続
Set oLocator = WScript.CreateObject("WbemScripting.SWbemLocator")Set oService = oLocator.ConnectServer
'//OS起動日時の取得
Set oClassSet_OS = oService.ExecQuery("Select * From Win32_OperatingSystem")For Each oClass In oClassSet_OS strBaseDate = CStr(oClass.LastBootUpTime)Next
'//OS起動時以降のイベントログを取得する(エラーのみ)
Set oClassSet_All = oService.ExecQuery("Select * From Win32_NTLogEvent Where (logfile='System' or Logfile='application') and (EventType=1) and TimeGenerated > '"& strBaseDate &"'")
'//ヘッダー出力
wscript.echo "最後に起動した日時: " & strBaseDate
wscript.echo "イベントログ遡及確認日時: " & strStartDate
wscript.echo "ComputerName,Logfile,TimeGenerated,TimeGenerated(JST),EventType,type,EventCode,User,SourceName,Message,このイベントIDが過去に発生した回数,新規/既知"
'//イベントログコレクション
For Each oClass In oClassSet_All
'//前レコードとイベントコードが同一であれば、カウントをスキップ
If strBeforeEventCode <> oClass.EventCode then
intEventCount = EventCodeCount(oClass.EventCode,strBaseDate,strStartDate)
strBeforeEventCode = oClass.EventCode
End If
'//新規、既知判定
If intEventCount = 0 then
strAnalyzeMsg = "新規"
Else
strAnalyzeMsg = "既知"
End If
'//イベント日時変換(JST)
eventDate = cdate(left(oClass.TimeGenerated,4) & "/" & mid(oClass.TimeGenerated,5,2) & "/" & mid(oClass.TimeGenerated,7,2) & " " & mid(oClass.TimeGenerated,9,2) & ":" & mid(oClass.TimeGenerated,11,2) & ":" & mid(oClass.TimeGenerated,13,2))
eventDateJST = DateAdd("h", 9 , eventDate)
'//MS-AccessへのCSVで取り込みエラーが出ないように、イベントログメッセージの変換。
'//改行は(CrLf)にする
'//ダブルクォーテーションはシングルクォーテーションにする
steEventMsg = oClass.Message
steEventMsg = Replace(steEventMsg,vbCrLf,"(CrLf)")
steEventMsg = Replace(steEventMsg,vbCr,"(Cr)")
steEventMsg = Replace(steEventMsg,vbLf,"(Lf)")
steEventMsg = Replace(steEventMsg,chr(34),"'")
'//イベントログ出力
wscript.echo _
chr(34) & oClass.ComputerName & chr(34) & "," &_
chr(34) & oClass.Logfile & chr(34) & "," &_
chr(34) & oClass.TimeGenerated & chr(34) & "," &_
chr(34) & eventDateJST & chr(34) & "," &_
chr(34) & oClass.EventType & chr(34) & "," &_
chr(34) & oClass.Type & chr(34) & "," &_
chr(34) & oClass.EventCode & chr(34) & "," &_
chr(34) & oClass.User & chr(34) & "," &_
chr(34) & oClass.SourceName & chr(34) & "," &_
chr(34) & steEventMsg & chr(34) & "," &_
chr(34) & intEventCount & chr(34) & "," &_
chr(34) & strAnalyzeMsg & chr(34)
Next
'//オブジェクトクリア
Set oClassSet_All = Nothing
Set oClass = Nothing
Set oService = Nothing
Set oLocator = Nothing
'//基準日から開始日まで遡ってイベントコードの発生件数をカウントする
Function EventCodeCount(strEventCode,strBaseDate,strStartDate)
Set oClassSet_Eventcode = oService.ExecQuery("Select * From Win32_NTLogEvent Where (logfile='System' or Logfile='application') And (TimeGenerated < '"& strBaseDate &"' And TimeGenerated > '"& strStartDate &"') And Eventcode=" & strEventCode & "")
EventCodeCount = oClassSet_Eventcode.count
End Function
Wscript.quit
実行方法
取得したいサーバーで、コマンドプロンプトから以下のコマンドで実行してください
>cscript //NOLOGO (スクリプトパス)\eventlogAnalyze.vbs > (実行結果出力先パス、ファイル名)
例)cscript c:\temp\eventlogAnalyze.vbs //NOLOGO > c:\temp\eventlogAnalyze.csv
出力結果
CSV形式(カンマ、””区切り)で出力します。
ComputerName:コンピュータ名
Logfile:イベントログの種類(Application、System)
TimeGenerated:イベント発生日時
TimeGenerated(JST):イベント発生日時(日本時間変換後)
EventType:イベントの種類コード
type:イベントの種類
EventCode:イベントコード
User:ユーザー
SourceName:ソース
Message:イベントの内容
このイベントIDが 過去に発生した回数:OS起動前にこのイベントコードが発生した件数
新規/既知:OS起動後に新規に発生したエラーが新規、それ以外は既知