Primeiro, sugiro usar o Get-WinEvent
e passar um hash para fazer o máximo de filtragem possível (e, assim, evitar a criação de muitos objetos que Where-Object
descartará):
Get-WinEvent -filterHashtable @{LogName='Security'; StartTime=$a; Id=4624; Level=0}
O nível 0 é uma auditoria de sucesso. Isso pode ser executado remotamente com o parâmetro -computer
. Em seguida, filtre os resultados para obter o tipo de login:
... | Where-Object { $_.Message -match 'Logon Type:\s+10'}
Usando um regex para evitar codificar o espaço em branco.
Para extrair o usuário e o domínio da mensagem seria um pouco complicado, pois há dois valores de "Nome da conta": um para o computador e outro para o usuário. Mas todos os valores substituíveis são inseridos no texto da mensagem (localisable) estão na propriedade Properties do evento, portanto, um pouco de verificação para ver os índices com um exemplo 1
... | Select-Object *, @{l='LogonAccount';e={$_.Properties[6].Value + "\" + $_.Properties[5].Value }}
A captura clara de outros detalhes (por exemplo, SID, IP do cliente) segue o mesmo padrão.
Por isso:
Get-WinEvent -filterHashtable @{LogName='Security'; StartTime=$a; Id=4624; Level=0} |
Where-Object { $_.Properties[8].Value -eq 10} |
Select-Object *, @{l='LogonAccount';e={$_.Properties[6].Value + "\" + $_.Properties[5].Value }}
1 Com um único evento em $ev
usei:
0..($ev.Properties.Count-1) | Select @{l='Idx';e={$_}},@{l='Property';e={$ev.Properties[$_].Value}} |
ft -auto
para dar (com um pouco de censura e anotando uma maneira melhor de obter o tipo de logon no índice # 8):
Idx Property --- -------- 0 S-1-5-18 1 *Computer's account* 2 *Computer's Domain* 3 999 4 *User's SID* 5 *User's user name* 6 *User's Domain* 7 151556 8 10 9 User32 10 Negotiate 11 *Computer's Name* 12 00000000-0000-0000-0000-000000000000 13 - 14 - 15 0 16 2964 17 C:\Windows\System32\winlogon.exe 18 *Client IP* 19 15532