Powershell Get-EventLog зависает на удаленном компьютере
Следующее работает нормально на локальном компьютере, но когда я ставлю -ComputerName "myRemoteName", оно зависает и ничего не возвращает даже примерно через 5 минут; но программа все еще работает.
Он пытается вернуть большой пакет данных через "провод"? Теоретически у меня должно быть до 10 ошибок на удаленном компьютере за последние 2 часа.
$getEventLog = Get-EventLog -log application -ComputerName "myRemoteName" -after ((get-date).addMinutes($minutes*-1)) -EntryType Error
Write-Host Get-Eventlog completed
# list of events to exclude (based on text found in the message)
$getEventLogFiltered = $getEventLog | Where-Object {$_.Message -notlike 'Monitis*' -and $_.Message -notlike '*MQQueueDepthMonitor.exe*' -and $_.Message -notlike '*The local computer may not have the necessary registry*' }
#to only select certain columns, use Select-Object -Property and list the property/columns
$getEventLogColumns = $getEventLogFiltered | Select-Object -Property TimeGenerated,Source,Message,EntryType,MachineName,EventID
$tableFragment = $getEventLogColumns | ConvertTo-Html -fragment
Write-Host "HTML-Table Built"
Код после этого создает письмо и отправляет его...
Я видел другие посты, в которых предлагалось перейти на Get-WinEvents, но я думаю, что переписать мне потребовался бы час или два (из-за отсутствия у меня опыта работы с Powershell); то, что я имею выше, работает нормально на локальных компьютерах.
Updates 03/04/2014 13:40 CT:
Running with $minutes = 120 ran 14.5 minutes.
Running with $minutes = 1 ran 12.5 minutes.
Вывод: изменение диапазона $ минут не влияет на время отклика; оба медленные.
2 ответа
Кажется, что я ошибался, даже с фильтром Where-Object он все еще сканирует, как в случае параметра -after (я только что тестировал на другой, только что собранной машине, и поэтому он так быстро закончил).
Однако дополнительные исследования показали, что функция разрыва может быть полезна, поэтому я сделал следующее:
Get-EventLog -ComputerName $ServerName -LogName Security | WHERE { ($_.EventID -eq '528')} | ForEach-Object {
$_
if ($_.TimeGenerated.CompareTo($YDate) -lt 1) { Break}
}
Он печатает все журналы событий, и когда он попадает в журнал событий старше, чем (в моем случае 24 часа), срабатывает перерыв и останавливается командлет get-eventlog.
Это не самое симпатичное решение, но пока оно работает нормально.
После того, как параметр не очень хорошо спроектирован, он печатает все записи, на которые он рассчитывает, но когда он достигает установленной даты, он все еще сканирует до конца четного файла журнала, несмотря на то, что печатать нечего (по крайней мере, это выглядит так). Я использовал фильтр Где-объекта и .CompareTo()
метод для печати журналов, которые после установленной даты (в моем случае за день до текущей даты).
#Sets yesterday date (script will get all records after that date)
$YDate = (Get-Date).AddDays(-1)
#Gets all event logs from Security log where event id represents successful logon and records where generated after prepared date (current date - 24 hours)
$YestardayLogons = Get-EventLog -ComputerName $ServerName -LogName Security |
WHERE { ($_.EventId -eq '528') -and ($_.TimeGenerated.CompareTo($YDate) -eq '1') }