背景
PowerShell的导出功能已经非常强大,可以将对象集合导出为csv,xml,html,Json,可以参考下面的命令:
- ConvertTo-Csv
- ConvertTo-Html
- ConvertTo-Json
- ConvertTo-Xml
但是有的朋友更喜欢将windows 事件日志,导出为.evtx格式,(无损格式,因为windows日志本身就是以这种格式存储的,比如:%SystemRoot%\System32\Winevt\Logs\Application.evtx)这样直接可以通过Windows 事件查看器来读取,非常方便。尽管PowerShell已经有处理Eventlog的命令了:
PS > Get-Command -Noun EventLog | select Name Name ---- Clear-EventLog Get-EventLog Limit-EventLog New-EventLog Remove-EventLog Show-EventLog Write-EventLog
但是仍旧找不到导出为evtx格式的命令。这时候,我们就可以退而求其次,让PowerShell强大的兼容性发挥作用了。使用wevtutil。
wevtutil命令的用法
PS I:\Users\非苔> wevtutil
未指定命令。
Windows 事件命令行实用程序。
用于检索有关事件日志和发布者的信息,
安装和卸载事件清单,运行查询以及导出、存档和清除日志。
用法:
你可以使用短(如 ep /uni)或长(如
enum-publishers /unicode)形式的命令和选项名称。
命令、选项和选项值不区分大小写。
变量均使用大写形式。
wevtutil COMMAND [ARGUMENT [ARGUMENT] ...] [/OPTION:VALUE [/OPTION:VALUE] ...]
命令:
el | enum-logs          列出日志名称。
gl | get-log            获取日志配置信息。
sl | set-log            修改日志配置。
ep | enum-publishers    列出事件发布者。
gp | get-publisher      获取发布者配置信息。
im | install-manifest   从清单中安装事件发布者和日志。
um | uninstall-manifest 从清单中卸载事件发布者和日志。
qe | query-events       从日志或日志文件中查询事件。
gli | get-log-info      获取日志状态信息。
epl | export-log        导出日志。
al | archive-log        存档导出的日志。
cl | clear-log          清除日志。
常用选项:
/{r | remote}:VALUE
如果指定,则在远程计算机上运行该命令。VALUE 是远程计算机名称。
/im 和 /um 选项不支持远程操作。
/{u | username}:VALUE
指定一个不同的用户以登录到远程计算机。
VALUE 是 domain\user 或 user 形式的用户名。只有在指定 /r 选项时才适用。
/{p | password}:VALUE
指定的用户密码。如果未指定,
或者 VALUE 为 "*",则会提示用户输入密码。
只有在指定 /u 选项时才适用。
/{a | authentication}:[Default|Negotiate|Kerberos|NTLM]
用于连接到远程计算机的身份验证类型。默认值为 Negotiate。
/{uni | unicode}:[true|false]
使用 Unicode 显示输出。如果为 true,则使用 Unicode 显示输出。
要了解特定命令的详细信息,请键入以下命令:
wevtutil COMMAND /?
wevtutil导入日志示例
现在我们尝试将“应用程序(Application)”路径下,所有消息(Level=4),EventID=1001,并且在一个小时内产生的windows事件日志导出到:D:\1001.evtx。
命令的参数很方便,但是查询表达式不方便。在不熟练的情况下,推荐打开“windows 事件查看器”,定位到->windows 日志->应用程序。在右边的操作面板中,打开筛选器,配置筛选条件,然后在“筛选器”的XML视图中会看到下面的格式,其中Select结点即为我们的查询表达式。(只需把类似<;=这样的字符串替换成<=即可)
<QueryList>
  <Query Id="0" Path="Application">
    <Select Path="Application">*[System[(Level=4) and (EventID=1001) and TimeCreated[timediff(@SystemTime) <= 43200000]]]</Select>
  </Query>
</QueryList>
然后在PowerShell 中这样调用
PS > wevtutil epl Application D:\1001.evtx /q:"*[System[(Level=4) and (EventID=1001) and TimeCreated[timediff(@SystemTime) <= 43200000]]]"
最后再注意一点,上面有个Application可以换成Security,Setup,System等日志路径。但是查询表达式中的System永远都是System,不需要,也不能与前面的路径对应,否则过滤的事件日志为空,一时半会还找不到原因。
本文链接: https://www.pstips.net/export-eventlog-by-evtx-format.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
                                      请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

这个格式你都找得到,神啊!
筛选条件除了EventID ,可以设置其他的吗?比如我想筛选Source以MSExchange开头的error怎么做呢?我用Source=MSExchange* 是无效的