web-dev-qa-db-ja.com

保存されたevtxファイルをテキストに変換する

保存した大量のセキュリティログファイル(.evtx)をテキストまたはCSV形式でエクスポートしたいと考えています。 wevtutilを見つけましたが、保存されたログファイルを処理する場合にのみ、.evtを.evtxに変換できるようです。

wevtutil epl c:\logs\seclog.evtx c:\logs\seclog.txt /lf:true

ファイルはseclog.txtとして作成されますが、.evtx形式です。

テキストに変換することは可能ですか、それともファイルをテキストに変換する別の方法がありますか? Powershellで試しましたが、時間がかかりすぎます。

編集:私はLog Parserを調べましたが、同様に迅速に見えますが、説明フィールドが正しくエクスポートされません。

The description for Event ID xxx in Source "Microsoft-Windows-xxxx" cannot be found. The local computer may not have the...
2
smwk

最後に、Log Parserを使用してCSVに変換し、次に[System.IO.File] :: ReadLines($ filename)を使用してテキストを検索しました。 800MBの.evtxファイルは約2分30秒で変換でき、ファイルの読み取りには約2分かかります。おそらく、XMLやデータベースへのエクスポートの方が速いかもしれませんが、私が費やした時間で十分です。

$logparser = "c:\program files (x86)\Log Parser 2.2\logparser.exe"
$query = "SELECT * INTO c:\logs\logs.csv FROM c:\logs\logs.evtx"

& $logparser -i:evt -o:csv $query
2
smwk

私が覚えている限り、LogParserはすべてのイベント情報を抽出できませんでした(つまり、EventViewerの各イベントのxmlビューに表示されるSystemとEventDataの両方を意味します)。したがって、私はpowershellを使いました。私のスクリプトはうまく機能しますが、非常に遅くなります。10Mbの.evtxファイルを変換するには約80秒かかります...

$a = Get-Item *.evtx
$output_file = [System.IO.StreamWriter] $("all.csv")
foreach($file in $a){
    $events = get-winevent -path $file.FullName

    foreach ($Event in $events) { 
        $xml = [xml]($Event.ToXml())

        foreach ($s in $xml.Event.System.ChildNodes) {
            $output_file.Write($s.Name + ":" + $s.InnerText + ",")
        }
        foreach ($d in $xml.Event.EventData.Data) {
            $text = $d.InnerText
            $text = if ($text) { $text.replace("`n","") } else { $text }
            $output_file.Write($d.Name + ":" + $text + ",")
        }
        $output_file.WriteLine()
    }
}

$output_file.Flush()
$output_file.Close()
0
Andrey Sapegin