2013年4月10日水曜日

PowerShellでイベントログを取得する

「なにを今更。Get-Eventlog使うだけじゃん!」
なんてツッコミが飛んできそうですけど。。

いや、確かに使いますよ。げっといべんとろぐ。

とりあえず、こんな感じで欲しい情報は取得できます。

Get-EventLog -ComputerName 192.168.0.1 -LogName "Application"  | Select-Object EntryType,EventID,Source,TimeGenerated,Message


そして今回のお客様のご要望は以下。
  • 何日前までとか指定したい
  • さっと見れるようにテキストに結果吐いて

ということで、こんな感じで実装しました。
$IpAddress = "192.168.0.1"
$EventLogName = "Application"
$StartDate = Get-Date
$EndDate = $StartDate - (New-TimeSpan -day 6)
$file = "C:\" + $EventLogName + ".txt"

#イベントログ取得
function getEventLog ($IpAddress,$EventLogName,$StartDate,$EndDate,$file)
{
    #イベントログ取得
    $logArray = Get-EventLog -Computername $IpAddress -logname $EventLogName -after $EndDate -before $StartDate | Select-Object EntryType,EventID,Source,TimeGenerated,Message
    #期間内のイベントログが無い場合は、ファイルにログ無しと書き込む
    if ($null -eq $logArray)
    {
        $message = "イベントログがありません。 期間:" + $startdate + " ~ " + $enddate
        $message | Out-File -Filepath $file
    }
    else
    {
        #取得したイベントログをファイルに書き込む
        foreach ($row in $logArray)
        {
            #Messageに入っている改行コードを変換
            $workMessage = [string]$row.Message.Replace("`n"," ")
            #日付の書式を整形
            $workTimeGenerated = [string]$row.TimeGenerated.ToString("yyyy/MM/dd HH:mm:ss")
            
            #一行としてまとめる
            $line = $workTimeGenerated + "`t" + [string]$row.EntryType + "`t" + [string]$row.EventID + "`t" + [string]$row.Source + "`t" + $workMessage
            
            #ファイルに書き込む
            $line | Out-File -Filepath $file  -Append
        }
    }
    #ファイルの存在チェックをして終了
    if (Test-Path $file)
    {
        #ログを出力
        Write-Host $file "を作成しました。"
    }
}

#実行
getEventLog $IpAddress $EventLogName $StartDate $EndDate $file


ガッと取ってきて一行づつ取り出して、日付を整形して、本文の改行コードを変換してテキストに追記していってます。

0 件のコメント:

コメントを投稿