Фильтр для дат, выводимых из удаленных журналов с помощью 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, потенциально может повлиять на производительность ваших удаленных машин.