Назад | Перейти на главную страницу

Список пользователей, использующих RDP

Windows Server 2008 R2

Я пытаюсь использовать PowerShell, чтобы получить список пользователей, которые вошли в службы удаленных рабочих столов (ранее известные как службы терминалов) в течение последнего дня. С небольшим пониманием и большим количеством копий и вставок у меня есть этот небольшой сценарий:

$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")}

Выходные данные по умолчанию говорят мне, что что-то произошло и когда это произошло, что является хорошим началом. Что бы я действительно like - это также отображение пользователя. Проклятый, если я смогу понять, как получить пользователя и / или как его отобразить.

И это мой вопрос: как я могу добавить имя пользователя, связанное с этим событием с идентификатором 4624 / типом входа 10? В идеале я просто хотел бы показать время входа в систему и имя пользователя.

Сначала я бы предложил использовать Get-WinEvent и передавая хэш, чтобы выполнить как можно большую фильтрацию (и, таким образом, избежать создания большого количества объектов Where-Object выкину):

Get-WinEvent -filterHashtable @{LogName='Security'; StartTime=$a; Id=4624; Level=0}

Уровень 0 - проверка успешности. Это можно сделать удаленно с помощью -computer параметр. Затем отфильтруйте результаты, чтобы получить тип входа:

... | Where-Object { $_.Message -match 'Logon Type:\s+10'}

Использование регулярного выражения, чтобы избежать жесткого кодирования пробелов.

Извлечь пользователя и домен из сообщения было бы немного неудобно, поскольку есть два значения «Account Name»: одно для компьютера и одно для пользователя. Но все заменяемые значения, вставляемые в (локализуемый) текст сообщения, находятся в свойство Properties события, поэтому немного проверим, чтобы увидеть индексы с образцом1

... | Select-Object *, @{l='LogonAccount';e={$_.Properties[6].Value + "\" + $_.Properties[5].Value }}

Ясно, что другие детали (например, SID, IP-адрес клиента) следуют тому же шаблону.

Отсюда:

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 С одним событием в $ev Я использовал:

0..($ev.Properties.Count-1) | Select @{l='Idx';e={$_}},@{l='Property';e={$ev.Properties[$_].Value}} |
  ft -auto

дать (с небольшой цензурой и отмечая лучший способ получить тип входа в индексе # 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

Я бы сделал это следующим образом -

$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'
}

РЕДАКТИРОВАТЬ: теперь это возвращает имена людей. Вы можете поиграть с тем, что именно вы хотите извлечь из этого XML-документа.

Примечание: вам нужно будет повозиться со значениями TimeCreated (возможно, сгенерировать их на лету). Я добавил их, чтобы вы могли видеть требуемый формат.

Get-WinEvent будет много быстрее, чем Get-EventLog, поскольку фильтрация будет выполняться на стороне сервера, а не в конвейере. Вы также можете уточнить свои запросы, используя параметр FilterXML. Имена пользователей, связанные с событиями входа в систему, находятся в Message собственность возвращенного EventLogRecord.