![将保存的 evtx 文件转换为文本](https://linux22.com/image/684626/%E5%B0%86%E4%BF%9D%E5%AD%98%E7%9A%84%20evtx%20%E6%96%87%E4%BB%B6%E8%BD%AC%E6%8D%A2%E4%B8%BA%E6%96%87%E6%9C%AC.png)
我希望将大量已保存的安全日志文件 (.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 的联合创始人。