Отслеживание и анализ журналов подключений к удаленному рабочему столу в Windows
В этой статье мы опишем, как получить и проверить журналы подключений RDP в Windows. Журналы подключений RDP позволяют администраторам терминальных серверов RDS получать информацию о том, какие пользователи вошли на сервер, когда конкретный пользователь RDP вошел в систему и завершил сеанс, и с какого устройства (DNS-имя или IP-адрес) пользователь вошел в систему.
События подключения RDP в средстве просмотра событий Windows
Когда пользователь подключается к хосту с поддержкой удаленного рабочего стола или RDS, информация об этих событиях сохраняется в журналах средства просмотра событий (
eventvwr.msc). Рассмотрим основные этапы RDP-подключения и связанные с ними события в Просмотре событий, которые могут быть интересны администратору.
Сетевое подключение;
Аутентификация;
-
вход в систему;
Отключение/повторное подключение сеанса;
Выйти.
Сетевое подключение - установление сетевого подключения к серверу от RDP-клиента пользователя. Это событие с EventID 1149 (
Remote Desktop Services: User authentication succeeded). Если это событие обнаружено, это не означает, что аутентификация пользователя прошла успешно. Этот журнал находится в «Журналы приложений и служб -> Microsoft -> Windows -> Terminal-Services-RemoteConnectionManager > Operational». Включите фильтр журнала для этого события (щелкните журнал правой кнопкой мыши -> Фильтровать текущий журнал -> EventId 1149).
Вы можете перечислить все попытки подключения RDP с помощью PowerShell:
$RDPAuths = Get-WinEvent -LogName 'Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational' -FilterXPath '<QueryList><Query Id="0"><Select>*[System[EventID=1149]]</Select></Query></QueryList>'
[xml[]]$xml=$RDPAuths|Foreach{$_.ToXml()}
$EventData = Foreach ($event in $xml.Event)
{ New-Object PSObject -Property @{
TimeCreated = (Get-Date ($event.System.TimeCreated.SystemTime) -Format 'yyyy-MM-dd hh:mm:ss K')
User = $event.UserData.EventXML.Param1
Domain = $event.UserData.EventXML.Param2
Client = $event.UserData.EventXML.Param3
}
} $EventData | FTПосле этого вы получите список событий с историей всех RDP-подключений к этому серверу. В журналах указывается имя пользователя, домен (в этом случае используется проверка подлинности на уровне сети; если NLA отключен, описание события выглядит иначе) и IP-адрес компьютера пользователя.
Аутентификация показывает, прошел ли пользователь RDP успешную аутентификацию на сервере или нет. Журнал находится в разделе Windows -> Безопасность. Итак, вас могут заинтересовать события с EventID 4624 (
An account was successfully logged on) или 4625 (
An account failed to log on).
Обратите внимание на значение LogonType в описании события.
LogonType=10 или 3 — если служба удаленного рабочего стола использовалась для создания нового сеанса во время входа в систему;
LogonType=7 означает, что пользователь повторно подключился к существующему сеансу RDP;
LogonType=5 - RDP-подключение к консоли сервера (в режиме mstsc.exe/admin).
Вы можете использовать события сбоя аутентификации RDP для защиты от атак грубой силы RDP. Вы можете автоматически заблокировать IP-адреса злоумышленников в брандмауэре Защитника Windows с помощью простого сценария PowerShell.
В этом случае имя пользователя содержится в описании события в поле Имя учетной записи , имя компьютера в поле Имя рабочей станции и IP-адрес пользователя в поле . Исходный сетевой адрес.
Обратите внимание на значение поля LogonID . Это уникальный идентификатор RDP-сессии пользователя, который помогает отслеживать дальнейшую активность пользователя. Однако если сеанс RDP отключен и пользователь повторно подключается к нему, пользователю будет назначен новый LogonID (хотя сеанс RDP останется прежним).
Вы можете получить список успешных событий аутентификации RDP (EventID 4624) с помощью этой команды PowerShell:
Get-EventLog security -after (Get-date -hour 0 -minute 0 -second 0) | ?{$_.eventid -eq 4624 -and $_.Message -match 'logon type:\s+(10)\s'} | Out-GridViewВход относится к входу в Windows по протоколу RDP. EventID 21 - это событие появляется после успешной аутентификации пользователя (
Remote Desktop Services: Session logon succeeded). Эти события расположены в «Журналы приложений и служб -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational». Как видите, здесь находится идентификатор RDP-сессии пользователя — Session ID.
EventID - 21 (
Remote Desktop Services: Shell start notification received) означает, что оболочка Explorer успешно запущена (в сеансе RDP пользователя появляется рабочий стол Windows).
Отключение/повторное подключение сеанса - события отключения и повторного подключения сеанса имеют разные идентификаторы в зависимости от того, что вызвало отключение пользователя (отключение из-за неактивности, установленное в таймауты для сеансов RDP, опция отключения была выбрана пользователем в сеансе, сеанс RDP завершен другим пользователем или администратором и т. д.). Эти события можно найти в средстве просмотра событий в разделе «Журналы приложений и служб -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational». Давайте рассмотрим идентификаторы событий RDP, которые могут быть полезны:
EventID - 24 (
Remote Desktop Services: Session has been disconnected) - пользователь отключился от сеанса RDP;
EventID - 25 (
Remote Desktop Services: Session reconnection succeeded) - пользователь повторно подключился к существующей RDP-сессии на сервере;
EventID - 39 (
Session <A> has been disconnected by session <B>) - пользователь отключился от сеанса RDP, выбрав соответствующий пункт меню (вместо простого закрытия окна RDP-клиента). Если идентификаторы сеансов различаются, значит, пользователь был отключен другим пользователем (или администратором);
EventID - 40 (
Session <A> has been disconnected, reason code <B>). Здесь необходимо проверить код причины отключения в описании события. Например:
код причины 0 (
No additional information is available) означает, что пользователь только что закрыл окно клиента RDP;
код причины 5 (
The client’s connection was replaced by another connection) означает, что пользователь повторно подключился к предыдущему сеансу RDP;
код причины 11 (
User activity has initiated the disconnect) пользователь нажал кнопку «Отключить» в меню «Пуск».
EventID 4778 в Windows -> Журнал безопасности (сеанс был переподключен к Window Station). Пользователь повторно подключился к сеансу RDP (пользователю присвоен новый LogonID).
EventID 4779 в журнале «Windows -> Безопасность» (
A session was disconnected from a Window Station). Пользователь был отключен от сеанса RDP.
Выход означает конец сеанса пользователя. Оно регистрируется как событие с EventID 23 (
Remote Desktop Services: Session logoff succeeded) в разделе «Журналы приложений и служб -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational».
В то же время EventID 4634 (
An account was logged off) появится в журнале безопасности.
EventID 9009 (
The Desktop Window Manager has exited with code <X>) в системном журнале означает, что пользователь инициировал выход из сеанса RDP, при этом окно и графическая оболочка пользователя были закрыты.
EventID 4647 — выход из системы по инициативе пользователя.
Получение истории входа в удаленный рабочий стол с помощью PowerShell
Вот короткий сценарий PowerShell, в котором перечислена история всех RDP-соединений за текущий день из журналов событий терминального сервера RDS. В результирующей таблице показано время подключения, IP-адрес клиента (DNS-имя компьютера) и имя удаленного пользователя (при необходимости в отчет можно включить другие LogonTypes).
Get-EventLog -LogName Security -after (Get-date -hour 0 -minute 0 -second 0)| ?{(4624,4778) -contains $_.EventID -and $_.Message -match 'logon type:\s+(10)\s'}| %{
(new-object -Type PSObject -Property @{
TimeGenerated = $_.TimeGenerated
ClientIP = $_.Message -replace '(?smi).*Source Network Address:\s+([^\s]+)\s+.*','$1'
UserName = $_.Message -replace '(?smi).*\s\sAccount Name:\s+([^\s]+)\s+.*','$1'
UserDomain = $_.Message -replace '(?smi).*\s\sAccount Domain:\s+([^\s]+)\s+.*','$1'
LogonType = $_.Message -replace '(?smi).*Logon Type:\s+([^\s]+)\s+.*','$1'
})
} | sort TimeGenerated -Descending | Select TimeGenerated, ClientIP `
, @{N='Username';E={'{0}\{1}' -f $_.UserDomain,$_.UserName}} `
, @{N='LogType';E={
switch ($_.LogonType) {
2 {'Interactive - local logon'}
3 {'Network connection to shared folder)'}
4 {'Batch'}
5 {'Service'}
7 {'Unlock (after screensaver)'}
8 {'NetworkCleartext'}
9 {'NewCredentials (local impersonation process under existing connection)'}
10 {'RDP'}
11 {'CachedInteractive'}
default {"LogType Not Recognised: $($_.LogonType)"}
}
}}Этот метод позволяет собирать и анализировать журналы подключений RDP на автономном сервере RDSH. Если у вас есть несколько серверов в ферме RDS, вы можете запросить каждый из них с помощью этого сценария или получить журналы с сервера управления с ролью посредника подключений к удаленному рабочему столу.
Вы можете экспортировать журналы подключений RDP из средства просмотра событий в файл CSV (для дальнейшего анализа в электронной таблице Excel). Вы можете экспортировать журнал из графического интерфейса средства просмотра событий (при условии, что журналы просмотра событий не очищены) или через командную строку:
WEVTUtil query-events Security > c:\ps\rdp_security_log.txtИли с помощью PowerShell:
get-winevent -logname "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" | Export-Csv c:\ps\rdp_connection_log.txt -Encoding UTF8Если ваши пользователи подключаются к корпоративным узлам RDS через шлюз удаленных рабочих столов, вы можете проверить журналы подключений пользователей в журнале Microsoft-Windows-TerminalServices-Gateway по EventID 302. Например, следующий сценарий PowerShell отобразит историю подключений указанного пользователя через шлюз RD:
$rdpusername="b.smith"
$properties = @(
@{n='User';e={$_.Properties[0].Value}},
@{n='Source IP Adress';e={$_.Properties[1].Value}},
@{n='TimeStamp';e={$_.TimeCreated}}
@{n='Target RDP host';e={$_.Properties[3].Value}}
)
(Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-TerminalServices-Gateway/Operational';ID='302'} | Select-Object $properties) -match $rdpusernameВы можете проверить следующие события подключения пользователя шлюза удаленных рабочих столов в журнале событий Microsoft-Windows-TerminalServices-Gateway:
300 — пользователь NAME на клиентском компьютере DEVICE соответствовал требованиям политики авторизации ресурсов и, следовательно, был авторизован для подключения к ресурсу RDPHOST;
302 — ИМЯ пользователя на клиентском компьютере DEVICE, подключенное к ресурсу RDPHOST;
303 — пользователь NAME на клиентском компьютере DEVICE отключился от следующего сетевого ресурса: RDPHOST. Прежде чем пользователь отключился, клиент передал X байт и получил X байт. Продолжительность сеанса клиента составила X секунд.
Вы можете отобразить список текущих удаленных сеансов на вашем хосте RDS с помощью команды:
qwinstaКоманда возвращает идентификатор сеанса, ИМЯ ПОЛЬЗОВАТЕЛЯ и состояние сеанса (активен/отключен). Эта команда полезна, когда вам нужно получить идентификатор сеанса RDP пользователя при использовании теневых подключений к удаленному рабочему столу.
Вы можете отобразить список запущенных процессов в конкретной сессии RDP (указывается идентификатор сессии):
qprocess /id:5Журналы исходящих RDP-соединений в Windows
Вы также можете просмотреть журналы исходящих подключений RDP на стороне клиента. Они доступны в следующем журнале событий: Журналы приложений и служб -> Microsoft -> Windows -> TerminalServices-ClientActiveXCore -> Microsoft-Windows-TerminalServices-RDPClient -> Operational.
Например, EventID 1102 возникает, когда пользователь подключается к удаленному узлу Windows Server RDS или компьютеру с Windows 10/11 с включенным RDP (версии Windows для настольных компьютеров также поддерживают несколько одновременных подключений RDP).
The client has initiated a multi-transport connection to the server 192.168.13.201.Следующий сценарий RDP отобразит историю подключений клиентов RDP на текущем компьютере:
$properties = @(
@{n='TimeStamp';e={$_.TimeCreated}}
@{n='LocalUser';e={$_.UserID}}
@{n='Target RDP host';e={$_.Properties[1].Value}}
)
Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-TerminalServices-RDPClient/Operational';ID='1102'} | Select-Object $propertiesСценарий возвращает идентификаторы SID пользователей, инициировавших RDP-подключения на этом компьютере, а также DNS-имена/IP-адреса узлов удаленного рабочего стола, к которым подключались пользователи. Вы можете преобразовать SID в имена пользователей следующим образом.
Также вы можете проверить историю подключений RDP в реестре пользователя.












