背景
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* 是无效的