evtx形式のイベントログを今日を起点に過去100日分取得する

evtx形式で取得する方法の記事が少ないので、載せます

※ver2以上で動作確認済み

# イベントログ出力関数を定義
# 引数1:ログ種別(System,Application)    引数2:出力先フォルダ(C:¥evtxlog など)
function get-evtxlog ($logname,$outpath) {




# 開始日付(100日前)と終了日付(今日)を取得し、
# イベントログの選択に使用するクエリ(XPATH形式)に格納する

        # 開始日付指定(100日前を指定する場合、100と記述する)
        $fromDay = 100

        # 開始日付
        $startTime = (Get-Date).AddDays(-$fromDay)

        # 終了日付(今日)
        $endTime   = (Get-Date)

        # イベントログの選択に使用するクエリ(XPATH形式)に渡すため、システム時刻(UTC)に変換する
        $startUtcTime = [System.TimeZoneInfo]::ConvertTimeToUtc($startTime).ToString("yyyy-MM-ddTHH:mm:ssZ")
        $endUtcTime   = [System.TimeZoneInfo]::ConvertTimeToUtc($endTime).ToString("yyyy-MM-ddTHH:mm:ssZ")

        # イベントログの選択に使用するクエリ(XPATH形式)
        $filter = @"
Event/System/TimeCreated[@SystemTime>='$startUtcTime'] and
Event/System/TimeCreated[@SystemTime<'$endUtcTime']
"@




# 出力ファイル名を作成しておく

        # yyyy-MMdd-HHmm-ss形式の今日日付(出力ファイルの名前用)
        $YYYYMMDD = $endTime.ToString("yyyy-MMdd-HHmm-ss")

        # 出力ファイル(ログ種別_yyyy-MMdd-HHmm-ss)
        $outfile = "${outpath}\${logname}_${YYYYMMDD}_.evtx"




# .Netクラスのメソッドを使って出力

        # System.Diagnostics.Eventing.Reader.EventLogSession クラスをオブジェクト化
        $evsession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession

        # ExportLog メソッドを実行 
        # 引数は、ログ種別、"LogName"(FilePathかLogName)、クエリ、出力ファイル
        $evsession.ExportLog($logname,"LogName",$filter,$outfile)




}

# イベントログ出力関数の定義終了







#### 関数実行

try {

# ログ種別エラー用テストコード(コメントアウト)
# get-evtxlog "Syste" "C:\evtlog"


# 出力先フォルダエラー用テストコード(コメントアウト)
# get-evtxlog "System" "C:\qevtlog"


# Systemイベントログを取得
get-evtxlog "System" "C:\evtlog"

# Applicationイベントログを取得
get-evtxlog "Application" "C:\evtlog"

} catch {

# 1で終了
exit 1

}

結果

Screen Shot 2018-05-07 at 22.16.20.png

参考

https://msdn.microsoft.com/ja-jp/library/system.diagnostics.eventing.reader.eventlogsession(v=vs.110).aspx