每位Windows系统管理员可能都熟悉Windows事件日志。在PowerShell中使用这个cmdlet允许系统管理员一次性解析许多计算机上的许多事件。这使得系统管理员不再需要在事件查看器中四处点击,试图找出正确的过滤器以及确定关键事件存储在何处。然而,`Get-EventLog`确实有其缺点,你将会看到。
使用Get-EventLog列出事件日志
`Get-EventLog` cmdlet在所有现代版本的Windows PowerShell上都可用。在其最简单的用法中,此cmdlet需要一个要查询的事件日志,然后将显示该事件日志中的所有事件。
但是,如果你不知道事件日志的名称,该怎么办?在这种情况下,我们需要找出本地计算机上所有可用的事件日志。我们通过使用命令`Get-EventLog -List`来实现这一点。

你可以看到我在我的本地系统上有一些事件日志,但是你可能想知道其他的在哪里?在事件查看器的“应用程序和服务日志”下显示了数十个其他事件日志。为什么它们不在这里呢?
如果你需要这些事件,不幸的是,`Get-EventLog`将无法工作。相反,你需要查看Get-WinEvent。`Get-EventLog` cmdlet目前可以被视为传统的cmdlet,但我仍经常使用它,仅仅因为它非常容易使用。
使用Get-EventLog查询事件
现在我们知道所有可用的事件日志,我们可以阅读该事件日志中的事件。也许我想查看应用程序事件日志中的所有事件。要获取这些事件,我需要使用Get-EventLog
并指定LogName
参数,该命令将通过返回该事件日志中的所有事件来履行。

默认情况下,您在输出中只会看到六个属性:
Index
Time
EntryType
Source
InstanceId
Message
实际上,Get-EventLog
返回其中的16个属性。您只看到六个的原因是由于PowerShell格式规则定义了输出。下面是通过将Get-EventLog
管道传递到Select-Object
并选择所有属性找到的实际输出的示例。

使用Get-EventLog进行过滤
在寻找事件时,很可能我们不需要全部事件。相反,我们可能只需要一些。在这种情况下,我们需要过滤特定的事件。Get-EventLog
有几种不同的方法可以做到这一点。Get-EventLog
cmdlet 可以根据时间戳、输入类型、事件ID、消息、源和用户名进行过滤。这照顾到了查找事件的大多数方式。
为了演示过滤功能,也许我会定期查询事件,并且希望找到最新的十个事件。在这种情况下,我可以使用 Newest
参数,并指定我想要查看的事件数量。 Get-EventLog -LogName Application -Newest 10
将仅返回最新的十个事件。
也许我想要找到特定时间点之后的所有事件。为此,我们有 After
参数。 After
参数接受日期/时间,所以如果我只想查找在应用程序日志中发生在 1/26/19 10:17 AM 之后的事件,我可以这样做 Get-EventLog -LogName Application -After '1/26/19 10:17'
。我们也可以执行相同的过程,但选择在某个日期之前发生的事件,是的,你可能已经猜到了,使用 Before
参数。
Get-EventLog
有很多不同的过滤方式,不包括基于时间戳的过滤。我们还可以根据其他属性过滤事件,如事件 ID(实例 ID)和消息,这些通常是常见的搜索属性。也许我知道我正在寻找一个 ID 为 916 的事件;我们会将 916 传递给 InstanceId
参数。
我们还可以组合过滤器。也许我收到了很多 ID 为 916 的事件,但我只想要那些消息中包含字符串 svchost 的事件。在这种情况下,我们可以向 Get-EventLog
添加 Message
参数,并指定通配符,比如 svchost。
额外的脚本!
你需要一个在真实脚本中使用 Get-EventLog 的绝佳示例吗?如果是的话,你真是太幸运了!以下是一个高级使用案例,你可以立即下载并使用!
摘要
Get-EventLog
cmdlet 是一个很棒的命令,如果你需要快速查询其中一个常见事件日志,它非常方便。它易于使用,并提供了一些基本的过滤能力。但是,如果您需要进行深入的事件日志调查,Get-WinEvent
命令可能会更好用,但它稍微难以使用,有时需要了解像 XPath 这样的语法。