Группировка и выбор первых 1 событий из Powershell Get-WinEvent - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь сгруппировать массив объектов, но мне нужно сгруппировать на основе перечислимого свойства Properties, и я не могу его понять.

Краткое объяснение: Windows журнал безопасности, событие с идентификатором 4624, отслеживает вход в систему. Я хочу узнать, когда каждый пользователь в последний раз входил в один и тот же компьютер за последние 30 дней. Я могу получить это через Get-WinEvent на основе последних 30 дней:

$DateAfter = (Get-Date).AddDays(-29)
$DateBefore = (Get-Date)
$WinEvents = Get-WinEvent -FilterHashtable @{ LogName = 'Security'; Id = 4624; StartTime = $DateAfter; EndTime = $DateBefore }

$ WinEvents становится массивом System.Diagnostics.Eventing.Reader.EventRecord (s).

Я хочу для группировки по имени пользователя (например, $WinEvents[0].Properties[5].Value) и получения времени последнего создания (например, $WinEvents[0].TimeCreated)

Здесь ответили на аналогичную проблему: Получить последние даты из массива для каждой группы объектов в Powershell , но я не могу понять, как манипулировать массивом таким же образом, поскольку меня сбивает с толку необходимость получить имя пользователя через перечисление свойств

Я мог бы запустить это (например):

foreach ($evt in $WinEvents) { $evt.Properties[5].Value, $evt.TimeCreated -join " " }

и я получу что-то вроде этого для обзора:

PC1$ 6/11/2020 11:39:54 AM
jjones 6/11/2020 11:39:23 AM
PC2$ 6/11/2020 11:39:10 AM
bsmith 6/11/2020 11:37:53 AM
SYSTEM 6/11/2020 11:37:40 AM
bsmith 6/11/2020 11:37:23 AM
PC1$ 6/11/2020 11:35:52 AM [...]

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

Полное раскрытие информации: Моя конечная цель - очистить локальные профили людей, которые не заходили на локальную машину в течение 30 дней (https://adamtheautomator.com/powershell-delete-user-profile/). Delprof2 отлично работает во многих случаях, но мы наблюдаем несколько систем, в которых ntuser.dat и ntuser.ini неточны, поэтому возникает необходимость просеивать журналы событий. Я использую Powershell 7 только для защиты от будущего.

1 Ответ

3 голосов
/ 19 июня 2020

Как и в ответе, на который вы ссылались, вы хотите начать с группировки по имени пользователя:

$groupedByUser = $WinEvents |Group-Object { $_.Properties[5].Value }

Теперь просто l oop над коллекцией групп, затем отсортируйте отдельные записи в каждой группе по TimeCreated и сохранять только самые свежие:

$groupedByUser |ForEach-Object {
  $_.Group |Sort-Object TimeCreated |Select-Object -Last 1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...