我想找到多个服务器的特定事件id列表的最近一次出现。我看不出有什么好办法。如果我使用-newest
开关,我必须根据每个服务器事件日志的相对大小和我感兴趣的事件在该数量的条目中发生的几率来处理这个数字。在下面的示例中,服务器F6WINMSSTEST3
没有我在前10,000个条目中寻找的内容。有人知道怎么做吗?
我想要的是为每个服务器列出我正在查找的事件的每个ID的最新条目的单个实例,以便我可以看到它们何时发生。在理想情况下,每个服务器都会列出最近的3个ID。
$Servers = "F6WINMSSTEST","F6WINMSSTEST2","F6WINMSSTEST3","F6WINMSSTEST4","F6WINMSSTEST5"
Foreach ($server in $Servers) {
$server
get-eventlog -computer $server -logname system -newest 10000 | where-object { $_.eventid - eq 6005 -or $_.eventid -eq 6009 -or $_.eventid -eq 6006} }
样本输出:F6WINMSSTEST
Index Time EntryType Source InstanceID Message
----- ---- --------- ------ ---------- -------
108265 Feb 08 08:33 Information EventLog 2147489653 The Event log service was started.
108264 Feb 08 08:33 Information EventLog 2147489657 Microsoft (R) Windows (R) 6.01. 7601 Service Pack 1 Multiprocessor Free.
108247 Feb 08 08:31 Information EventLog 2147489654 The Event log service was stopped.
104703 Nov 16 08:41 Information EventLog 2147489653 The Event log service was started.
104702 Nov 16 08:41 Information EventLog 2147489657 Microsoft (R) Windows (R) 6.01. 7601 Service Pack 1 Multiprocessor Free.
104688 Nov 16 08:39 Information EventLog 2147489654 The Event log service was stopped.
F6WINMSSTEST2
39265 Jul 06 08:01 Information EventLog 2147489653 The Event log service was started.
39264 Jul 06 08:01 Information EventLog 2147489657 Microsoft (R) Windows (R) 6.00. 6002 Service Pack 2 Multiprocessor Free.
39249 Jul 06 08:00 Information EventLog 2147489654 The Event log service was stopped.
39060 Jul 06 02:03 Information EventLog 2147489653 The Event log service was started.
39059 Jul 06 02:03 Information EventLog 2147489657 Microsoft (R) Windows (R) 6.00. 6002 Service Pack 2 Multiprocessor Free.
39044 Jul 06 02:02 Information EventLog 2147489654 The Event log service was stopped.
F6WINMSSTEST3
F6WINMSSTEST4
6591 Jul 06 08:01 Information EventLog 2147489653 The Event log service was started.
6590 Jul 06 08:01 Information EventLog 2147489657 Microsoft (R) Windows (R) 5.02. 3790 Service Pack 2 Uniprocessor Free.
6589 Jul 06 08:00 Information EventLog 2147489654 The Event log service was stopped.
6531 Jul 05 11:52 Information EventLog 2147489653 The Event log service was started.
6530 Jul 05 11:52 Information EventLog 2147489657 Microsoft (R) Windows (R) 5.02. 3790 Service Pack 2 Uniprocessor Free.
6529 Jul 05 11:51 Information EventLog 2147489654 The Event log service was stopped.
F6WINMSSTEST5
55124 Nov 06 19:11 Information EventLog 2147489653 The Event log service was started.
55123 Nov 06 19:11 Information EventLog 2147489657 Microsoft (R) Windows (R) 5.02. 3790 Service Pack 2 Uniprocessor Free.
55122 Nov 06 19:10 Information EventLog 2147489654 The Event log service was stopped.
这篇文章我写了几次又删除了几次,现在我想我知道是怎么回事了。
- 任何写入事件日志条目的程序都会写入一个名为'EventID'的字段
- 这并不包含EventID,它实际上包含了一些额外的数据在值 的高位
- EventViewer/PowerShell/等剥离高位并将结果显示为EventId
- 它们将原始值显示为InstanceId,它可以匹配EventID,也可以不匹配。
这会导致以下情况:
- 两个完全不同的事件可能有相同的EventID,它可能会冲突。你还必须检查"源"是你想要的。
- 通过PowerShell获得EventID是缓慢的,获得InstanceId是快速的,因为它是索引的。
所以对于你的问题,如果你能得到这些事件中的一个,然后得到InstanceID,然后你可以问Get-EventLog
你关心的事件的InstanceID,然后使用-newest 1
。
试题:
$Servers = "F6WINMSSTEST","F6WINMSSTEST2","F6WINMSSTEST3","F6WINMSSTEST4","F6WINMSSTEST5"
ForEach ($server in $Servers) {
Write-Output $server
Get-EventLog -computer $server -LogName System -InstanceId ?,?,? -Newest 1
}
当你找到instanceIDs.
指定-Source
可能也是一个好主意。
否则这个讨论:http://social.technet.microsoft.com/Forums/scriptcenter/en-US/616b67ee-9e71-4f23-abb8-5c88e8890b9e/event-logs-relationship-between-instanceid-and-eventid?forum=ITCG是我从哪里得到上面的,是和你有同样问题的人,他们评论:
Get-WinEvent cmdlet接受一个-FilterXML参数,在这个参数中你可以指定EventID。这就为上层解决了问题但是对于底层机器(我希望有更好的方法)说"2000-XP-2K3"/"Vista-7-2008"),我们仍然需要过滤在事实之后,如果你明白我的意思。
如果你可以去InstanceId应该快得多,但我希望看到一个权威的参考,说它是稳定可靠的,或者不能冲突,或类似的。
在我的查询中,返回总是从最新到最旧的。这使得该命令只返回最新的:
get-eventlog -logname system | where ((eventid -eq 6005) -or (eventid -eq 6006) -or (eventid -eq 6009)) | select -first 1