Listando usuários usando o RDP

3

Windows Server 2008 R2

Estou tentando usar o PowerShell para obter uma lista de usuários que fizeram logon nos Serviços de Área de Trabalho Remota (anteriormente conhecidos como Serviços de Terminal) durante o último dia. Com pouco entendimento e muita cópia e colagem, eu tenho este pequeno script:

$a = (Get-Date).AddDays(-1)
Get-EventLog -LogName Security -after $a | Where-Object {($_.EventID -eq '4624') -and  $_.EntryType -eq 'SuccessAudit') -and ($_.Message | Select-String "Logon Type:\t\t\t10")}

A saída padrão me diz que as coisas aconteceram e quando aconteceram, o que é um bom começo. O que eu gostaria realmente é também exibir o usuário. Darned se eu puder descobrir como obter o usuário e / ou como exibi-lo.

E essa é a minha pergunta: como posso adicionar o nome de usuário associado ao evento ID 4624 / Logon tipo 10? Idealmente, gostaria apenas de mostrar o tempo de login e o nome de usuário.

    
por Chris_K 22.09.2011 / 16:15

2 respostas

6

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
    
por 22.09.2011 / 17:08
3

Eu faria da seguinte forma -

$filter = "<QueryList>" + '
               "<Query Id='"0'" Path='"Security'">" + '
                    "<Select Path='"Security'">" + '
                        "*[System[(EventID=4624) and " + '
                        "TimeCreated[@SystemTime&gt;='2011-09-21T06:00:00Z' and @SystemTime&lt;'2011-09-22T06:00:00Z']]] and " + '
                        "*[EventData[Data[@Name=''LogonType'']=10]]" + '
                    "</Select>" + '
                    "<Suppress Path='"Security'">" + '
                        "*[EventData[Data[@Name=''LogonGuid'']=''{00000000-0000-0000-0000-000000000000}'']]" + '
                    "</Suppress>" + '
               "</Query>" + '
          "</QueryList>"

Get-WinEvent -FilterXML $filter | 
%{ [xml]$xml = $_.ToXml()
   $xml.getElementsByTagName("Data") | where{$_.name -eq "TargetUserName"} | 
   select '#text'
}

EDIT: Isso agora retorna os nomes dos indivíduos. Você pode brincar com o que exatamente gostaria de extrair desse documento XML.

Nota: você precisará colocar os valores TimeCreated (provavelmente gerando-os na hora). Eu incluí estes para que você pudesse ver o formato que eles exigiam.

Get-WinEvent será muito mais rápido que Get-EventLog, pois a filtragem será feita no lado do servidor, e não no pipeline. Você também pode obter um pouco mais específico em suas consultas usando o parâmetro FilterXML. Os nomes de usuários associados aos eventos de logon estão na propriedade Message do EventLogRecord retornado.

    
por 22.09.2011 / 16:45