Запрос Powershell Get-eventlog. Как вернуть Х количество записей, соответствующих критериям
Я хотел бы найти самое последнее появление списка определенных идентификаторов событий для нескольких серверов. Я не вижу хорошего способа сделать это. Если я использую -newest
Переключатель Я должен поиграть с числом, основанным на относительном размере журнала событий каждого сервера и шансах событий, в которых я заинтересован, происходить в этом числе записей. В моем примере ниже, сервер F6WINMSSTEST3
не имеет то, что я ищу в первых 10000 записей. Кто-нибудь знает хороший способ сделать это?
Я хотел бы перечислить отдельные экземпляры последней записи для каждого идентификатора событий, которые я ищу, для каждого сервера, чтобы я мог видеть, когда они произошли. В идеальном мире каждый сервер перечисляет самые последние 3 идентификатора.
$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.
2 ответа
Я написал, а затем удалил этот пост пару раз, и теперь я думаю, что узнал, что происходит.
- Все, что записывает запись в журнал событий, записывает поле с именем "EventID"
- Это на самом деле не содержит EventID, он на самом деле содержит некоторые дополнительные данные в старших битах значения
- EventViewer / PowerShell / и т. Д. Убирают старшие биты и представляют результат как EventId
- Они отображают исходное значение как InstanceId, которое может соответствовать EventID, но не может.
Это приводит к следующей ситуации:
- Два совершенно разных события могут иметь один и тот же EventID, это может конфликтовать. Вы также должны проверить, что "Источник" - это тот, который вам нужен.
- Получение EventID через PowerShell происходит медленно, получение InstanceId происходит быстро, потому что он проиндексирован.
Итак, на ваш вопрос, если вы можете получить одно из этих событий, а затем получить InstanceID, то вы можете спросить Get-EventLog
для InstanceIds событий, которые вас интересуют, а затем использовать -newest 1
,
Пытаться:
$Servers = "F6WINMSSTEST","F6WINMSSTEST2","F6WINMSSTEST3","F6WINMSSTEST4","F6WINMSSTEST5"
ForEach ($server in $Servers) {
Write-Output $server
Get-EventLog -computer $server -LogName System -InstanceId ?,?,? -Newest 1
}
Когда вы найдете instanceID.
Определение -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 принимает параметр -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