使用 PowerShell 进行高级事件日志过滤
在之前的博客文章“使用 PowerShell 监控事件日志”中,我向您展示了如何使用 Get-WinEvent 使用 PowerShell 执行基本的事件日志监控。在本文中,我想演示如何使用 Get-WinEvent 使用 -FilterHashtable 参数来运行更复杂的查询。
让我们首先返回系统事件日志中的最后 50 个事件:
Get-WinEvent –LogName System –MaxEvents 50正如我在上一篇博客文章中提到的,Get-WinEvent 允许在源头进行过滤,因此与 Get-EventLog 不同,我们不需要将结果通过管道传输到 >Where-Object cmdlet,效率较低,尤其是在通过网络从远程设备提取日志时。要创建一个简单的过滤器,我们可以使用-FilterHashtable参数:
Get-WinEvent –FilterHashtable @{logname='system'} –MaxEvents 50上面的命令与第一个命令没有什么不同,只是我们使用 -FilterHashtable 而不是 -LogName 参数来指定日志名称。我们可以添加到哈希表并创建一个更复杂的过滤器以仅显示最后 50 个错误事件:
Get-WinEvent –FilterHashtable @{logname='system'; level=2} –MaxEvents 50请注意,事件级别必须指定为整数,其中 2 对应于 Error 事件级别。
什么是哈希表?
从上面的命令可以看出,哈希表允许我们将键映射到值。 IE。 logname 键映射到“system”,level 映射到 2。在 PowerShell 中,哈希表通常用作在命令中指定值的一种方式,以更加简洁和直观。可读形式,无需编写一长串参数。
-FilterHashtable 参数接受以下键/值对:
只有 LogName 和 ProviderName 键接受通配符输入。您还可以为 Level 键指定一个整数数组:
Get-WinEvent –FilterHashtable @{logname='system'; level=2,3} –MaxEvents 50在这里,我们获得了错误和警告级别的事件。如果要指定开始时间,最好首先使用 Get-Date 和 New-TimeSpan cmdlet 在变量中定义它。下面定义的 $time 变量将显示从昨天开始的所有事件,即今天的日期减去 24 小时。
$time = (Get-Date) - (New-TimeSpan -Day 1)
Get-WinEvent –FilterHashtable @{logname='system'; level=2; starttime=$time}为了进一步扩展查询,我将向哈希表添加更多键/值对。如上表所列,其中大多数都是不言自明的; 关键字除外,如您所见,它不接受字符串输入。我将在以后的文章中解释如何使用此密钥。
Get-WinEvent –FilterHashtable @{logname='system'; level=2; starttime=$time; id=20; providername=’Microsoft-Windows-WindowsUpdateClient’}在上面的查询中,我添加了事件 ID 和 providername 键。为了确定 providername 键的值,我使用 Select-Object cmdlet 输出每个事件的提供程序:
Get-WinEvent –FilterHashtable @{logname='system'; level=2; starttime=$time; id=20} | Select-Object ProviderName在此示例中,所有返回的事件恰好都来自同一提供者,但情况可能不一定如此。
