Windows Management Instrumentation(WMI)は、スクリプトなどの管理アプリケーションが、コンピュータのリソースに関する情報の入手や設定をできるようにする。コンピュータのリソースには、Windows OSサービス、ユーティリティ、パフォーマンス・カウンタ、イベント・ログ、物理的ハードウェア(ディスク・ドライブなど)、論理的ハードウェア(ディスク・ボリュームなど)、アプリケーションがある。
wmic ntevent where "(LogFile='System' and Type='Error' and TimeGenerated>='2006/12/1')" get TimeGenerated, LogFile, SourceName, Message
wmic ... /FORMAT:CSV > test.csv
wmic ... /FORMAT:HTABLE > test.html
iconv -f utf-16 -t euc-jp test.csv > test.csv.euc
Option Explicit Const LOG_DIR = "C:?WORK" Const LOG_PREFIX = "event-" Const LOG_POSTFIX = ".log" ' n日前から検索 Const BEFORE = -3 ' コンピュータ名の取得 Dim objNetWork, strComputerName, strLogPath Set objNetWork = WScript.CreateObject("WScript.Network") strComputerName = objNetWork.ComputerName Set objNetWork = Nothing ' ログファイルのパスをセット strLogPath = LOG_DIR & "?" & LOG_PREFIX & strComputerName & LOG_POSTFIX Dim nowDate, prevDate, fromDate Dim objWMI, colEvents nowDate = CDate(Date) prevDate = DateAdd("d", -1, nowDate) fromDate = DateAdd("d", BEFORE, nowDate) Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!??.?root?cimv2") Set colEvents = objWMI.ExecQuery("select * from Win32_NTLogEvent " + "where TimeWritten >= '" & fromDate & "' and (Type='エラー' or Type='Error')") 'ファイルシステムオブジェクトを作成 Dim objFS, objOut Set objFS = CreateObject("Scripting.FilesystemObject") If objFS.FileExists(strLogPath) Then objFS.DeleteFile(strLogPath) End If Set objOut = objFS.CreateTextFile(strLogPath) 'WScript.Echo colEvents.Count Dim strTitle, strLine, objEvent strTitle = "サーバ名" & vbTab & "発生時刻" & vbTab & "ログ" & vbTab & "タイプ" & vbTab & "カテゴリ" & vbTab & "メッセージ" objOut.WriteLine( strTitle ) For Each objEvent In colEvents strLine = objEvent.ComputerName & vbTab & WMIDateStringToDate(objEvent.TimeWritten) & vbTab & objEvent.LogFile & vbTab & objEvent.Type & vbTab & objEvent.Category & vbTab & objEvent.Message objOut.WriteLine( strLine ) Next objOut.Close Set objFS = Nothing Set colEvents = Nothing Set objWMI = Nothing 'WScript.Echo "End" ' WTC形式から標準形式に変換 Function WMIDateStringToDate(strUtc) WMIDateStringToDate = CDate(Mid(strUtc, 5, 2) & "/" & Mid(strUtc, 7, 2) & "/" & Left(strUtc, 4) & " " & Mid (strUtc, 9, 2) & ":" & Mid(strUtc, 11, 2) & ":" & Mid(strUtc, 13, 2)) End Function