Фильтр для дат, выводимых из удаленных журналов с помощью Powershell

Пожалуйста, смотрите мой текущий код ниже, код будет продолжать работать, пока не будет остановлен пользователем. Конечной целью является запуск сценария для поиска определенного дня и успешной остановки или поиска результатов между двумя датами.

Я попытался использовать флаги -before -after с комбинациями (get-date). IE .date .datetime .addday(+/-1), но при их использовании он находит правильную дату и останавливается, но занимает 2/3 минуты, прежде чем снова запустить сценарий или перейти к следующему компьютеру в списке. Я также пытался { $_.TimeGenerated -lt "00/00/000" }

Есть идеи, как это можно сделать? Я пробовал несколько других вещей, но без радости.

$ComputerName = 'CSV File'
$UserProperty = @{n="User";e={(New-Object System.Security.Principal.SecurityIdentifier $_.ReplacementStrings[1]).Translate([System.Security.Principal.NTAccount])}}
$TypeProperty = @{n="Action";e={if($_.EventID -eq 7001) {"Logon"} else {"Logoff"}}}
$TimeProperty = @{n="Time";e={$_.TimeGenerated}}
$MachineNameProperty = @{n="MachineName";e={$_.MachineName}}

foreach ($computer in $ComputerName) {
Get-EventLog System -Source Microsoft-Windows-Winlogon -ComputerName $computer | select $UserProperty,$TypeProperty,$TimeProperty ,$MachineNameProperty 
}

1 ответ

Решение

Я не уверен, что именно у вас возникли проблемы, но это работало хорошо для меня:

Get-EventLog System -Source Microsoft-Windows-Winlogon -ComputerName $computer -before '2017-11-09' -after '2017-10-27' -InstanceId @(7001, 7002) | select $UserProperty,$TypeProperty,$TimeProperty ,$MachineNameProperty

Как я отмечал в комментарии, получение удаленных журналов событий, как правило, довольно медленный процесс.

Вот небольшая информация о времени:

Сначала я запустил запрос снова на сервере без временного фильтра:

measure-Command -Expression {$noTimeFilter = Get-EventLog System -Source Microsoft-Windows-Winlogon -ComputerName $computer -InstanceId @(7001, 7002)}

Это заняло 292,85 секунды и вернуло 79 событий. Затем я запустил его для того же фильтра сервера за последние 24 часа:

measure-Command -Expression {$withTimeFilter = Get-EventLog System -Source Microsoft-Windows-Winlogon -ComputerName $computer -after (Get-Date).AddDays(-1) -InstanceId @(7001, 7002)}

Это заняло 243 секунды и вернуло 2 события.

Так что для этого общеизвестно ограниченного теста фильтрация была на самом деле быстрее. В моем собственном анекдотическом опыте фильтрация не имеет большого значения, так или иначе. Я уверен, что запрос получает все события, а затем фильтрует их. Если вы на самом деле постоянно видите более быстрый возврат без фильтра, вы, безусловно, можете просто получать все каждый раз, а затем передавать это в блок Where-Object, чтобы получить только те события, которые вы хотели. Это противоречило бы моему опыту, и, как указал FoxDeploy, потенциально может повлиять на производительность ваших удаленных машин.

Другие вопросы по тегам