MR2オーナー吉田貴幸のブログ

MR2(SW20)オーナー吉田貴幸のブログ。仕事はITインフラエンジニア。愛車の記事とIT関連の情報を発信しています

【Windows】[VBScript] イベントログで OS再起動に発生していないエラーのみ を出力する

 f:id:takayuki-yoshida:20190421223552p:plain

 

はじめに

 

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起動後に新規に発生したエラーが新規、それ以外は既知