PowerShell 导出Windows 日志为.evtx 格式 2


背景

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结点即为我们的查询表达式。(只需把类似&lt;=这样的字符串替换成<=即可)

<QueryList>
  <Query Id="0" Path="Application">
    <Select Path="Application">*[System[(Level=4) and (EventID=1001) and TimeCreated[timediff(@SystemTime) &lt;= 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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

2 条评论 “PowerShell 导出Windows 日志为.evtx 格式