使用PowerShell查询Windows事件日志

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) &lt;= 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) &lt;= 604800000]]]</Select>

</Query>

</QueryList>

5)如有必要,可以手动编辑此查询。

6)若要将事件列表导出到 CSV 文件,可以使用以下命令:

$events= Get-WinEvent -FilterXML $xmlQuery

$events| Export-CSV "C:\ps\FilterSYSEvents.csv" -NoTypeInformation -Encoding UTF8