1.概要:
Windows事件日志是管理员跟踪操作系统、其组件或程序记录的错误、警告和其他信息报告的重要工具。可以使用事件查看器(eventvwr.msc)查看Windows事件日志。也可以使用 PowerShell命令行 Get-WinEvent 获取和分析事件日志中的信息。
2.操作步骤/更多信息:
Get-WinEvent 列出事件日志和事件日志提供程序,可以从所选的日志或从所选的事件提供程序生成的日志中获取事件, 还可以将来自多个源的事件组合到单个命令中。
Get-WinEvent 允许使用 XPath 查询、结构化 XML 查询和哈希表查询筛选事件。
要使用 Get-WinEvent 命令,必须以管理员身份运行 PowerShell。如果尝试以非管理员用户身份运行 Get-WinEvent,将无法访问某些日志,包括安全日志。
若要从特定日志中获取事件列表,必须指定其名称。例如,以下命令列出应用日志中的最后 20 个事件:
Get-WinEvent -LogName Application -MaxEvents 20
System、Application、Security或Setup日志是最常见的查询日志,还可以指定其他日志名称。可以使用以下命令在 Windows 中获取事件日志的完整列表:
Get-WinEvent -ListLog *
还可以一次从多个日志中选择事件。例如,如果要从过去 24 小时的系统和应用程序日志中获取有关错误和警告的信息,可以使用以下代码:
$StartDate = (Get-Date) - (New-TimeSpan -Day 1)
Get-WinEvent Application,System | Where-Object {($_.LevelDisplayName -eq "错误" -or $_.LevelDisplayName -eq "警告") -and ($_.TimeCreated -ge $StartDate )}
可以使用“select-object”或“format-table”仅显示特定事件字段:
Get-WinEvent可以从保存的日志文件获取事件信息,通过-path参数指定对应的文件名。
Get-WinEvent -Path 'C:\Test\Windows PowerShell.evtx'
使用FilterHashtable选项进行快速事件搜索
使用 Where-Object 从事件查看器日志中筛选特定事件的方法可能很容易理解,但它比较慢。在大多数情况下,最好使用 FilterHashtable 选项进行事件筛选。
FilterHashtable 参数允许您按以下事件属性进行筛选:
- LogName
- ProviderName
- Path
- Keywords
- ID
- Level (1=Critical, 2=ERROR, 3=Warning, 4=Information, 5=Verbose, 6=TRACE, 0=Info)
- StartTime
- EndTime
- UserID (user’s SID)
- Data
下面是在特定时间段内搜索事件的示例:
Get-WinEvent -FilterHashTable @{LogName='System'; StartTime=(get-date).AddDays(-7); EndTime=(get-date).AddHours(-1); ID=1234}
如果要在事件描述中查找特定文本,可以使用以下命令:
Get-WinEvent -FilterHashtable @{logname='System'}|Where {$_.Message -like "*net*"}
使用 FilterXml 进行高级筛选
带有FilterHashtable选项的筛选器有一些限制,如果需要使用具有许多条件的复杂查询来选择事件,则需要使用FilterXml选项,该选项允许使用XML查询进行筛选。
以下是从系统日志中获取过去 30 天最新错误的另一种方法:
$xmlQuery = @' <QueryList> <Query Id="0" Path="System"> <Select Path="System">*[System[(Level=2 or Level=3) and TimeCreated[timediff(@SystemTime) <= 2592000000]]]</Select> </Query> </QueryList> '@ Get-WinEvent -FilterXML $xmlQuery
若要生成复杂的 XML 查询代码,可以使用事件查看器操作:
1)运行命令eventvwr.msc打开事件查看器 ;
2)找到要为其创建查询的日志,然后单击“筛选当前日志”;
3)在筛选器窗体中选择所需的查询参数。在此示例中,要查找特定用户过去 7 天内具有特定 EventID 的事件。
4)若要获取 XML 查询代码,请转到“XML”选项卡,然后复制 XPath 代码 。
<QueryList> <Query Id="0" Path="System"> <Select Path="System">*[System[(Level=1 or Level=2 or Level=3 or Level=4 or Level=0 or Level=5) and (EventID=12) and TimeCreated[timediff(@SystemTime) <= 604800000]]]</Select> </Query> </QueryList>
5)如有必要,可以手动编辑此查询。
6)若要将事件列表导出到 CSV 文件,可以使用以下命令:
$events= Get-WinEvent -FilterXML $xmlQuery $events| Export-CSV "C:\ps\FilterSYSEvents.csv" -NoTypeInformation -Encoding UTF8