Назад | Перейти на главную страницу

Преобразование сохраненных файлов 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...

В конце концов, я использовал Log Parser для преобразования в CSV, а затем [System.IO.File] :: ReadLines ($ filename) для поиска по тексту. Файл .evtx размером 800 МБ можно преобразовать примерно за 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

Насколько я помню, LogParser не смог извлечь всю информацию о событиях (я имею в виду как System, так и EventData, которые вы можете видеть в представлении xml для каждого события в EventViewer). Поэтому я выбрал PowerShell. Мой скрипт работает хорошо, но очень медленно: ему нужно около 80 секунд, чтобы преобразовать файл .evtx размером 10 Мб ...

$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()