当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

作者:精品下载站 日期:2024-12-14 12:35:47 浏览:12 分类:玩电脑

使用 Get-WinEvent PowerShell Cmdlet 的完整指南


Windows 有几种不同的事件日志,但是如何快速检索它们呢? Get-WinEvent cmdlet 可以检索经典的 Windows 事件日志,例如系统和应用程序日志、Windows 事件日志技术生成的日志,甚至 Windows 事件跟踪 (ETW) 日志!

在本文中,了解如何利用 Get-WinEvent 从事件日志中检索和过滤事件!

先决条件

要继续操作,您只需要当前版本的 Windows 10 和 PowerShell 5.1 及更高版本。本文使用 Windows 10 和 PowerShell 7.1。

使用 Get-WinEvent 列出可用日志

如果不知道所有可用日志,就很难知道您可能需要哪些日志条目。通过 Get-WinEvent,您可以使用 -ListLog 参数快速列出所有可用日志。 * 参数值告诉 Get-WinEvent 列出所有日志而不进行过滤。如下所示,将检索所有日志,但使用 Select-Object cmdlet 仅显示一组有限的属性。

Get-WinEvent -ListLog * | Select-Object LogName, RecordCount, IsClassicLog, IsEnabled, LogMode, LogType | Format-Table -AutoSize

并非所有日志都默认启用。您可能需要打开事件查看器,找到日志,然后右键单击以在事件显示之前启用日志。

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

Windows Vista 之后的所有日志均保存为 *.evtx 文件,而不是较旧的 *.evt 格式。属性 IsClassicLog 说明日志事件是在消息文件 (*.mc) 格式中定义还是在清单 (*.xml) 中定义,格式。

一个有趣的属性是 LogMode,您可能已经注意到它通常设置为 Circular

  • Circular - 一旦满了就覆盖最旧的日志条目。
  • Retain - 保留所有事件直至日志已满,并停止记录直至释放。
  • AutoBackup - 事件日志满后自动备份和存档。

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

最后,查看 LogType 属性,有几种不同类型的日志。此属性更多地用作分类属性,但它通常通知如何使用日志以及显示的事件类型。

  • 管理 - 主要面向最终用户和管理用户。
  • 分析 - 通常是大量日志,用于描述程序操作。
  • 调试 - 适用于需要深入了解程序内部的开发人员。
  • 操作 - 操作期间发生的事件,可用于诊断事件和触发过程。

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

列出事件日志提供程序

现在您已经对不同的日志及其属性有了深入的了解,这有助于理解什么是事件日志提供程序。在事件日志术语中,提供者是事件的源。

事件日志提供程序是唯一的,并链接到每个日志(例如应用程序或系统日志),并将充当事件发起的指定源。

也许您想在过滤日志时发现问题,并且您可能只对特定提供商的问题感兴趣。要列出可用的提供程序,请使用 -ListProvider 参数。如下所示,* 列出了所有可用的提供程序以及提供程序所链接的日志,例如 Windows PowerShell 或 System。

Get-WinEvent -ListProvider * | Format-Table -Autosize

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

也许您可能只想列出可用于特定日志的提供程序,例如System。为此,您可以使用 Where-Object 命令并使用 LogLinks 属性的值来过滤事件。 LogLinks 属性将链接的事件日志显示为列表。

要使用 Where-Object 过滤请求的日志,请使用 -In 比较运算符仅过滤 LogLinks 中具有 System 的事件属性值。最后,使用 Format-Table -AutoSize 可以更轻松地读取输出,如下所示。

Get-WinEvent -ListProvider * | Where-Object { 'System' -In ($_ | Select-Object -ExpandProperty Loglinks | Select-Object -ExpandProperty Logname) } | Format-Table -AutoSize

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

使用 Get-WinEvent 检索经典事件日志

解决 Windows 问题的第一步是检索应用程序或系统日志,这恰好是经典事件日志。在下面所示的示例中,您将使用应用程序事件日志的 -MaxEvents 参数检索前 100 事件。

为了使读取结果更容易,请仅选择更容易读取条目所需的属性。否则,条目将按提供者名称进行分组,这使得解析结果列表变得困难。

Get-WinEvent -LogName 'Application' -MaxEvents 100 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

使用 Get-WinEvent 查找现代 Windows 事件

现在您已经从经典应用程序日志中检索了事件,那么来自较新的 Windows 事件日志(例如 Microsoft-Windows-WindowsUpdateClient/Operational)的结果又如何呢?

与经典事件日志(例如 System)不同,Microsoft-Windows-WindowsUpdateClient/Operational 是一种现代日志,使用 Get-WinEvent 来工作与下面相同。

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

只获取最旧的事件怎么样?尽管您可以使用 Sort-Object 对结果进行反向排序,但请使用 -Oldest 参数检索前 10 事件,如下所示。

Get-WinEvent 命令为您进行过滤,而不是返回所有结果并进行排序,这通常会比较慢。

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -Oldest -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

使用 Get-WinEvent 检索 Windows (ETW) 文件的事件跟踪

也许您有从另一台计算机导出的*.evtx 文件或备份了现有日志。您可以使用 Get-WinEvent cmdlet 读取这些日志。如果您需要保留日志用于审核目的,Get-WinEvent 是在脚本中使用标准 cmdlet 快速查询这些日志的好方法。

要演示从 *.evtx 文件检索日志条目,您需要一个导出的日志文件。

1. 打开事件查看器并导航至日志。在此示例中,为应用程序和服务日志 → Windows PowerShell 日志。

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

2. 接下来,单击操作窗格中的将所有事件另存为...菜单项。

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

3. 将文件保存到可通过 Get-WinEvent 命令检索的磁盘位置。

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

现在您已经导出了日志文件,通过 -Path 参数传递日志文件位置以读取事件。在下面显示的示例中,导出 Windows PowerShell 日志以供以后使用。

Get-WinEvent -Path 'C:\Articles\WindowsPowerShell.evtx' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

使用 Get-WinEvent 过滤 Windows 事件日志

虽然您可以使用标准 Where-Object cmdlet 过滤日志,但 Get-WinEvent 提供内置过滤器。通过返回所有结果然后进行过滤,会完成比必要的更多的工作。相反,您应该始终尝试尽可能地从源头进行过滤。

Get-WinEvent cmdlet 提供三个参数来帮助您筛选数千个事件,称为 -FilterHashTable-FilterXPath-FilterXML 。每个参数通常以不同的方式执行相同的任务。

使用 FilterHashTable 过滤事件日志

-FilterHashTable 参数根据匹配的属性(例如 LogName)过滤内容。您可以使用哈希表,例如 @{'LogName'='Application'},而不是使用 -LogName 参数按特定日志进行过滤。将对应于 LogName 事件属性。

下面显示的示例为 -FilterHashTable 参数提供了一个哈希表,该参数仅查找应用程序日志,并且开始时间为当天午夜过后的所有事件,Get-WinEvent 快速返回结果。

Get-WinEvent -FilterHashTable @{'LogName' = 'Application'; 'StartTime' = (Get-Date -Hour 0 -Minute 0 -Second 0)} | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

将上述同一命令的过滤速度与通过 Where-Object 而不是通过管道上的 -FilterHashTable 参数过滤的速度进行比较。正如您所看到的,使用 Where-Object 的命令比使用 -FilterHashTable 参数的命令慢得多。

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

使用 FilterXPath 参数过滤事件日志

事件日志条目存储为 XML 文件,因此您可以使用 XPath 语言(一种 XML 查询语言)来过滤日志条目。执行上面使用的相同命令并转换为 XPath,您可以获得相同的结果。

要制作 XPath 查询,请使用 Windows 事件查看器中的过滤功能,如下所示。

1. 打开事件查看器并导航至日志,例如Windows 日志 → 应用程序日志。

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

2. 接下来,单击右侧窗格中的“过滤当前日志”链接。

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

3. 输入要用于过滤日志的参数。

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

4. 单击 XML 选项卡并复制 Select 标记中包含的部分。

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

5. 现在,使用 -FilterXPath 参数复制并粘贴复制的内容。您现在可以在下面看到,使用从事件日志查看器找到的 XPath 语法,您可以构建一个查询来仅过滤必要的信息。

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[(Level=1  or Level=3)]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

深入探讨如何制作 XPath 查询超出了本文的范围,但基本格式如下所示。当 FilterXPath 参数过滤日期时,您会看到一个很大的区别:您需要使用更具体的日期格式,yyyy-MM-ddTHH:mm:ss.fffZ,日期必须以 UTC 格式返回,由 -AsUTC 开关注明。

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

使用 FilterXML 过滤事件日志结果

最后,最后一个可用的过滤参数是-FilterXML 参数。与 -FilterXPath-FilterHashTable 参数不同,此参数采用 XML,然后用于过滤事件。 -FilterXML 参数允许更复杂的规则,如下所示,可以复制前面的过滤示例。

如上例所示,您可以通过事件查看器 → 筛选当前日志功能检索预先格式化的查询。您将使用整个查询,而不是仅选择 Select 节点中的内容。没有选择实际的过滤器,如 Select 节点中的 * 所示。这将为下一个示例提供通用标记。

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

首先,不要创建单行命令,而是将 XML 查询分开并将标记分配给变量 $Query,如下例所示。将查询分配给变量可以提高易用性和可读性。接下来,将 $Query 变量传递给 Get-WinEvent-FilterXML 参数。

如下所示,您会看到更复杂的查询的结果,该查询返回当天的所有事件并存储在 Application 日志中。

$Query = "<QueryList>
  <Query Id='0' Path='Application'>
    <Select Path='Application'>*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]</Select>
  </Query>
</QueryList>"

Get-WinEvent -FilterXML $Query | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

[玩转系统] 使用 Get-WinEvent PowerShell Cmdlet 的完整指南

结论

Get-WinEvent cmdlet 具有强大的过滤功能,可以轻松查询多个事件日志源。从审核到解决问题,Get-WinEvent cmdlet 是任何系统管理员工具包的重要补充!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯