WMI タスク:イベント ログ
[アーティクル] 07/03/2023
6 人の共同作成者
フィードバック
この記事の内容
イベント ログのための WMI タスクでは、イベント ログ ファイルからイベント データを取得し、ログ ファイルのバックアップやクリアなどの操作を実行します。 その他の例については、https://www.microsoft.com/technet の TechNet ScriptCenter を参照してください。
このトピックに示したスクリプト例では、ローカル コンピューターからのみデータを取得します。 スクリプトを使用してリモート コンピューターからデータを取得する方法の詳細については、「リモート コンピューター上の WMI への接続 」を参照してください。
以下の手順では、スクリプトの実行方法を説明します。
スクリプトを実行するには
コードをコピーし、拡張子 .vbs を付けたファイル (filename.vbs など) に保存します。 テキスト エディターによってファイルに .txt 拡張子が追加されていないことを確認します。
コマンド プロンプト ウィンドウを開き、ファイルを保存したディレクトリに移動します。
コマンド プロンプトで「cscript filename.vbs 」と入力します。
イベント ログにアクセスできない場合は、管理者特権でのコマンド プロンプトから実行しているかどうかを確認します。 セキュリティ イベント ログなどの一部のイベント ログは、ユーザー アクセス制御 (UAC) によって保護されている場合があります。
注意
既定では、cscript により、コマンド プロンプト ウィンドウにスクリプトの出力が表示されます。 WMI スクリプトでは大量の出力が生成される可能性があるため、出力をファイルにリダイレクトすることが必要になる場合があります。 コマンド プロンプトで「cscript filename.vbs > outfile.txt 」と入力し、filename.vbs スクリプトの出力を outfile.txt にリダイレクトします。
次の表に、ローカル コンピューターからさまざまな種類のデータを取得するために使用できるスクリプトの例の一覧を示します。
セキュリティ イベント ログに関する情報を取得する
Win32_NTEventlogFile クラスに接続するときにセキュリティ 特権を含めます。 詳細については、「VBScript を使用した特権操作の実行 」を参照してください。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate,(Security)}!\\" & _
strComputer & "\root\cimv2")
Set colLogFiles = objWMIService.ExecQuery _
("Select * from Win32_NTEventLogFile " _
& "Where LogFileName='Security'")
For Each objLogFile in colLogFiles
Wscript.Echo objLogFile.NumberOfRecords
Wscript.Echo "Maximum Size: " _
& objLogfile.MaxFileSize
Next
$strComputer = "."
$colLogFiles = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $strComputer | Where-Object {$_.LogFileName -eq 'security'}
foreach ($objLogFile in $colLogFiles)
{
"Record Number: " + $objLogFile.NumberOfRecords
"Maximum Size: " + $objLogFile.MaxFileSize
}
イベント ログをバックアップする
Win32_NTEventlogFile クラスと BackupEventLog メソッドを使用します。 WMI に接続するときにバックアップ 特権を含める必要がある場合があります。 詳細については、「VBScript を使用した特権操作の実行 」を参照してください。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate,(Backup)}!\\" & strComputer & "\root\cimv2")
Set colLogFiles = objWMIService.ExecQuery ("Select * from Win32_NTEventLogFile " & "Where LogFileName='Application'")
For Each objLogfile in colLogFiles
errBackupLog = objLogFile.BackupEventLog("c:\scripts\application.evt")
WScript.Echo "File saved as c:\scripts\applications.evt"
Next
$strComputer = "." $colLogFiles = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $strComputer | Where-Object {$_.LogFileName -eq 'Application'}
foreach ($objLogFile in $colLogFiles)
{
[void]$objLogFile.BackupEventlog("c:\scripts\applications.evt")
"File saved as c:\scripts\applications.evt"
}
イベント ログを複数回バックアップする
Win32_NTEventlogFile と BackupEventLog メソッドを使用する前に、バックアップ ファイルに一意の名前があることを確認します。 オペレーティング システムでは、既存のバックアップ ファイルを上書きすることはできません。スクリプトを再度実行するには、バックアップ ファイルを移動するか、名前を変更する必要があります。 WMI に接続するときにバックアップ 特権を含める必要がある場合があります。 詳細については、「VBScript を使用した特権操作の実行 」を参照してください。
dtmThisDay = Day(Date)
dtmThisMonth = Month(Date)
dtmThisYear = Year(Date)
strBackupName = dtmThisYear & "_" & dtmThisMonth & "_" & dtmThisDay
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate,(Backup)}!\\" & strComputer & "\root\cimv2")
Set colLogFiles = objWMIService.ExecQuery ("Select * from Win32_NTEventLogFile " & "Where LogFileName='Application'")
For Each objLogfile in colLogFiles
objLogFile.BackupEventLog("c:\scripts\" & strBackupName & "_application.evt")
objLogFile.ClearEventLog()
WScript.Echo "File saved: " & strBackupName & "_application.evt"
Next
$CurDate = Get-Date $strBackupName = $curDate.Year.ToString() + "_" + $curDate.Month.ToString() + "_" + $CurDate.Day.ToString()
$strComputer = "."
$colLogFiles = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $strComputer | Where-Object {$_.LogFileName -eq 'Application'}
foreach ($objLogFile in $colLogFiles)
{
$BackupFile = $objLogFile.BackupEventlog("c:\scripts" + $strBackupName + "_application.evt")
"File saved: c:\scripts" + $strBackupName + "_application.evt"
}
イベント ログ内のレコード数を判別する
Win32_NTEventlogFile クラスを使用し、NumberOfRecords プロパティの値をチェックします。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colLogFiles = objWMIService.ExecQuery ("Select * from Win32_NTEventLogFile " & "Where LogFileName='System'")
For Each objLogFile in colLogFiles
Wscript.Echo objLogFile.NumberOfRecords
Next
$strComputer = "." $colLogFiles = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $strComputer | Where-Object {$_.LogFileName -eq 'System'}
foreach ($objLogFile in $colLogFiles)
{
$objLogFile.NumberOfRecords
}
イベント ログをクリアする
Win32_NTEventlogFile クラスと ClearEventLog メソッドを使用します。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate,(Backup, Security)}!\\" & strComputer & "\root\cimv2")
Set colLogFiles = objWMIService.ExecQuery ("Select * from Win32_NTEventLogFile " & "Where LogFileName='Application'")
For Each objLogfile in colLogFiles
objLogFile.ClearEventLog()
WScript.Echo "Cleared application event log file"
Next
$strComputer = "." $colLogFiles = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $strComputer | Where-Object {$_.LogFileName -eq 'System'}
foreach ($objLogFile in $colLogFiles)
{
[void]$objLogFile.ClearEventlog()
"Cleared application event log file"
}
イベント ログからイベントを読み取る
Win32_NTLogEvent クラスを使用します。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
("Select * from Win32_NTLogEvent " _
& "Where Logfile = 'System'")
For Each objEvent in colLoggedEvents
Wscript.Echo "Category: " & objEvent.Category & VBNewLine _
& "Computer Name: " & objEvent.ComputerName & VBNewLine _
& "Event Code: " & objEvent.EventCode & VBNewLine _
& "Message: " & objEvent.Message & VBNewLine _
& "Record Number: " & objEvent.RecordNumber & VBNewLine _
& "Source Name: " & objEvent.SourceName & VBNewLine _
& "Time Written: " & objEvent.TimeWritten & VBNewLine _
& "Event Type: " & objEvent.Type & VBNewLine _
& "User: " & objEvent.User
Next
$strComputer = "." $colLogFiles = Get-WmiObject -Class Win32_NTLogEvent -ComputerName $strComputer | Where-Object {$_.LogFile -eq 'System'}
foreach ($objEvent in $colLoggedEvents)
{
"Category: " + $objEvent.Category
"Computer Name: " + $objEvent.ComputerName
"Event Code: " + $objEvent.EventCode
"Message: " + $objEvent.Message
"Record Number: " + $objEvent.RecordNumber
"Source Name: " + $objEvent.SourceName
"Time Written: " + $objEvent.TimeWritten
"Event Type: " + $objEvent.Type
"User: " + $objEvent.Use
}
スクリプトおよびアプリケーション用の WMI タスク
WMI C++ アプリケーションの例
TechNet ScriptCenter