Просмотр логов Windows на удаленном компьютере с помощью Powershell
Для просмотра логов Windows можно использовать команды Get-WinEvent и Get-EventLog
Get-EventLog получает список журналов или событий в заданном журнале на локальном или удалённом компьютере. Указывая нужные параметры для Get-EventLog, можно с лёгкостью искать искомые события по значениям их свойств. Get-EventLog возвращает события, соответствующие всем указанным значениям свойств. Командлет Get-EventLog работает только со стандартными классическими журналами событий Windows. Если нужно искать по остальным событиям из журналов Windows, используйте командлет Get-WinEvent.
Представим, что вам нужна основная информация о журналах событий на вашем компьютере. В этом случае убедитесь, что вы включили параметр list при вызове Get-EventLog:
Get-EventLog -list
Если вам нужна только информация о конкретном журнале событий, используйте командлет Where-Object, чтобы ограничить извлечение данных конкретным журналом событий:
Get-EventLog -list | Where-Object {$_.logdisplayname -eq "Application"}
Эта команда извлекает все события в журнале событий системы:
Get-EventLog system
После выполнения команды выше на экран будет выведено слишком много данных. Используйте параметр -Newest и верните только нужное количество последних событий, записанных в журнале. Например, эта команда извлекает последние 10 событий, записанные в журнал событий системы:
Get-EventLog System -newest 10
Вот данные, которые вы получите:
Чтобы получить более подробную информацию, просто добавьте командлет Format-List:
Get-EventLog System -newest 10 | Format-List
Полученная информация будет уже такой:
Вы также можете передавать данные через командлет Where-Object для возврата подмножества событий. Например, эта команда извлекает только те события в журнале событий Windows PowerShell, у которых значение EventID равно 403:
Get-EventLog "Windows PowerShell" | Where-Object {$_.EventID -eq 403}
Вот небольшая команда, которая извлекает все события в журнале событий Windows PowerShell, а затем использует командлет Group-Object для группировки этих событий с помощью EventID. Другими словами, команда подсчитывает общее количество событий для каждого идентификатора (например, произошло два события с EventID 300, произошло шесть событий с событием EventID 400 и т. Д.). Затем эти данные передаются через командлет Sort-Object для предоставления результатов, отсортированных по EventID. Вот команда:
Get-EventLog "Windows PowerShell" | Group-Object eventid | Sort-Object Name
Примеры использования Get-Eventlog:
Поиск событий по ID после 3 июля:
Get-EventLog -ComputerName compname -After 03/07/2017 -LogName System | Where-Object {$_.EventID -eq "6005"}
Поиск в логах нескольких серверов:
$servers = "compname1", "compname2", "compname3" ForEach ($Server in $servers) {$Server; Get-EventLog -LogName System -Computername $Server | Where-Object {$_.EventID -eq "6005"}}
Возвращает все события журнала Windows PowerShell, в сообщениях которых содержится слово «failed»:
Get-Eventlog -logname "Windows PowerShell" -message "*failed*"
Поиск событий, статус которых «Ошибка»:
Get-Eventlog -logname System -EntryType Error
Командлет Get-WinEvent берёт данные из журналов событий, а именно — стандартные журналы событий, события приложений и системы. Если вызвать команду Get-WinEvent без параметров, то будут показаны все события из журналов событий компьютера. Для прерывания выполнения команды нажмите сочетание клавиш CTRL+C. Стоит отметить то, что Get-WinEvent работает только в Windows Vista, Windows Server 2008 R2 и старше. Также потребуется установленная платформа Microsoft .NET Framework 3.5 или новее.
Примеры использования Get-Winevent:
Поиск в логе System по ID 6005:
Get-WinEvent -ComputerName compname -LogName system | where {$_.id -eq "6005"}
Поиск событий за последние 40 дней:
$yesterday = (get-date) - (new-timespan -day 40) Get-WinEvent -FilterHashTable @{LogName='system';StartTime=$yesterday; id='6005'}
Поиск событий за последние 5 дней для Outlook:
$starttime = (get-date).adddays(-5) Get-WinEvent -ComputerName compname -FilterHashtable @{logname="application"; ProviderName="outlook"; StartTime= $starttime}
Поиск в логах нескольких серверов:
$servers = "compname1", "compname2", "compname3" ForEach ($Server in $Servers) {$Server; Get-WinEvent -LogName System -MaxEvents "2" -Computername $Server}