Я хочу экспортировать большое количество сохраненных файлов журнала безопасности (.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()