将保存的 evtx 文件转换为文本

将保存的 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...

答案1

最后我使用 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

据我所知,LogParser 无法提取所有事件信息(我的意思是,您可以在 EventViewer 中每个事件的 xml 视图中看到 System 和 EventData)。因此,我使用了 powershell。我的脚本运行良好,但速度很慢:转换 10 Mb .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()

答案3

我需要将一堆 .evtx 批量转换为 .txt 文件 - 我最终使用 Log Parser 将其转换为 .csv(然后我可以将其重命名为 .txt),但最简单的方法(并且只使用原生 Windows 工具)是使用wevtutil

wevtutil /qe File.evtx /lf: true 将在 cmd 中打开并显示 .evtx 文件。您所要做的就是让它将该输出输出为 .txt!

wevtutil /qe File.evtx /lf: true > File.txt

我编写了一个批处理脚本,它将递归地检查文件夹中所有日期明确的事件文件,并将每个 .evtx 文件转换为该文件夹内的 .txt 文件:

set spath=\\SERVER\Share\Audits
set eventLogDir="dir /B /s %spath% | findstr  \.evtx$"
FOR /F %%d in ('%eventLogDir%') do wevtutil qe %%d /lf:true > %%d.txt

编辑 - 我确实意识到查询输出wevtutil不太好读。使用 Log Parser 代替我的脚本,我能够获得更好的输出,并且仍然使用 .txt 保存

set spath=\\SERVER\Share\Audits
set eventLogDir="dir /B /s %spath% | findstr  \.evtx$"
FOR /F %%d in ('%eventLogDir%') do "C:\Program Files (x86)\Log Parser 2.2\LogParser.exe" "Select * into %%d.txt from %%d" -i:evt -o:csv

答案4

如果您正在寻找一种点击式转换 EVTX 文件的方法,您可以尝试 Gigasheet。这是一款基于 Web 的应用程序,可以解析 EVTX,您可以导出 CSV 格式的数据。您可以同时上传最多 99 个文件,上传最大 10GB 的文件是免费的。

完整详情请点击这里: https://www.gigasheet.co/post/online-evtx-parser-and-viewer

我们在 Gigasheet 中的解析基于 @omerbenamram 的 Rust EVTX 解析器。查看 Github 上的基准测试,看起来对于大多数应用程序来说,性能应该都很棒:https://github.com/omerbenamram/evtx

全面披露:我是 Gigasheet 的联合创始人。

相关内容