2015年5月30日土曜日

[PowerShell] Get-WinEventで必要なログのみを取得する

PowerShell の Get-WinEvent コマンドを使ってイベントログの内容を出力します。
日常的にイベントログを監視する場合は監視から除外したいログが出てきますので、それを含まない形で出力します。


# 対象コンピュータを指定する
$ComName = [Net.Dns]::GetHostName()

# 抽出を行うログを指定する
$LogName = "System"

# 抽出を行う期間を指定する
$StartTime = (Get-Date).AddDays(-7)
$EndTime   = Get-Date


# 監視対象から除外するイベントを記載する
$ExceptionFilter=
@(
    @{
        Id = 1014;  
        Level = 3; 
        ProviderName = "Microsoft-Windows-DNS-Client";
    },
    @{
        Id = 22;  
        Level = 3; 
        ProviderName = "Microsoft-Windows-Hyper-V-VmSwitch";
    }
)     


# 指定した種類・期間のイベントログを取得する
$EventsList = Get-WinEvent -ComputerName $ComName -FilterHashTable @{LogName=$LogName ; StartTime=$StartTime ; EndTime = $EndTime }


# 重大、エラー、警告以外のイベントを除外する
$EventsList = $EventsList | Where-Object {$_.Level -le 3}


# 除外リストに記載のログを除外する
$Cnt = 0
while ($Cnt -lt $ExceptionFilter.count) {
    $EventsList = $EventsList | Where-Object {-not ($_.Id -eq $ExceptionFilter[$Cnt].Id -and $_.Level -eq $ExceptionFilter[$Cnt].Level -and $_.ProviderName -eq $ExceptionFilter[$Cnt].ProviderName)}
    $Cnt++
}

# イベントのリストを出力する
$EventsList | Format-List -Property  LogName, MachineName, LevelDisplayName, TimeCreated, ProviderName, Id, UserId, Message 
 
 
参考サイト
Get-WinEvent
連想配列を変換してユーザー定義オブジェクトを簡単に作成する

1 件のコメント: