Извлечение событий входа / выхода из системы с помощью powershell
Мне нужно извлечь список локальных входов / выходов из системы с Windows 7. У меня есть сохраненная копия журнала событий безопасности в формате evtx, и у меня возникло несколько проблем.
Следующий PowerShell извлекает все события с идентификатором 4624
или же 4634
:
Get-WinEvent -Path 'C:\path\to\securitylog.evtx' | where {$_.Id -eq 4624 -or $_.Id -eq 4634}
Я хочу тогда фильтровать только logon type = 2 (local logon)
, Трубопровод это:
| where {$_.properties[8].value -eq 2}
Однако, кажется, бросить все id=4634
(выход) события.
Даже для мероприятия id = 4624
событий, там нет идентификатора пользователя. Например, трубопровод для:
| select-object -property Timecreated,TaskDisplayName,MachineName,userid
или иным образом Export-Csv
, userid
пусто
Два вопроса:
- Почему события с идентификатором 4634 сбрасываются, когда передаются туда
{$_.properties[8].value -eq 2}
? - Почему
userid
пусто? Как я могу получитьuserid
?
2 ответа
Обратите внимание, что 8 не магическое число. Это 9-е свойство (индекс начинается с 0) в XML, определенном событием 4624. Вы можете увидеть это в средстве просмотра событий, если откроете вкладку Details и переключитесь в представление XML. Глядя на событие 4634, вы видите, что свойство Logon Type теперь 5-е - поэтому вы можете захотеть изменить свой запрос на что-то вроде:
где {{$ .Id -eq 4624 -and $.properties [8] -eq 2} -или {$ .Id -eq 4634 -and $.properties [4] -eq 2}}
ID пользователя просто не определен для этих событий. Возможно, вы захотите взглянуть на свойство TargetUserName, определенное в XML (шестое свойство).
Хорошо, вот что я закончил. Он выводит значения через запятую:
$evts = Get-WinEvent -Path 'C:\path\to\securitylog.evtx' | where {($_.Id -eq 4624 -and $_.properties[8].value -eq 2) -or ($_.Id -eq 4634 -and $_.properties[4].value -eq 2) }
foreach ($e in $evts)
{
# get the attributes
$ds = $e.TimeCreated
$tdn = $e.TaskDisplayName
$mn = $e.MachineName
# userid will vary depending on event type:
if($e.Id -eq 4624) { $userid = $e.properties[5].value }
if($e.Id -eq 4634) { $userid = $e.properties[1].value }
write-host ("{0},{1},{2},{3}" -f [string]$ds,[string]$tdn,[string]$mn,[string]$userid)
}