Извлечение событий входа / выхода из системы с помощью 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 пусто

Два вопроса:

  1. Почему события с идентификатором 4634 сбрасываются, когда передаются туда {$_.properties[8].value -eq 2}?
  2. Почему userid пусто? Как я могу получить userid?

2 ответа

Решение
  1. Обратите внимание, что 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}}

  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)
}
Другие вопросы по тегам