
В этой статье мы расскажем о том, как получить и проанализировать журналы соединений RDP в Windows. Журналы соединений RDP позволяют администраторам терминальных серверов RDS получать информацию о том, какие пользователи входили на сервер, когда определенный пользователь RDP входил и завершал сессию, а также с какого устройства (DNS-имя или IP-адрес) пользователь входил в систему.
События RDP-соединений в средстве просмотра событий Windows
Когда пользователь подключается к хосту с поддержкой Remote Desktop или RDS, информация об этих событиях сохраняется в журналах Event Viewer (eventvwr.msc
). Рассмотрим основные этапы подключения к RDP и связанные с ними события в Event Viewer, которые могут быть интересны администратору
- Сетевое подключение;
- Аутентификация;
- Вход в систему;
- Отключение/возобновление сеанса;
- Выход из системы.
Сетевое подключение — установление сетевого соединения с сервером с помощью RDP-клиента пользователя. Это событие с идентификатором EventID 1149 (Remote Desktop Services: User authentication succeeded
). Если это событие обнаружено, это не означает, что аутентификация пользователя прошла успешно. Этот журнал находится в разделе «Журналы приложений и служб -> Microsoft -> Windows -> Terminal-Services-RemoteConnectionManager > Operational». Включите фильтр журнала для этого события (щелкните правой кнопкой мыши журнал -> Фильтр текущего журнала -> EventId 1149).
С помощью PowerShell можно составить список всех попыток подключения по RDP:
$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 -> Security. Итак, вас могут заинтересовать события с идентификатором EventID 4624 (An account was successfully logged on
) или 4625 (An account failed to log on
).
Пожалуйста, обратите внимание на LogonType значение в описании события.
- LogonType = 10 или 3 — если служба Remote Desktop использовалась для создания нового сеанса при входе в систему;
- LogonType = 7, означает, что пользователь повторно подключился к существующему сеансу RDP;
- LogonType = 5 — RDP-соединение с консолью сервера (в режиме mstsc.exe /admin).
В этом случае имя пользователя содержится в описании события в файле Имя учетной записи поле, имя компьютера в поле Имя рабочей станции, и IP-адрес пользователя в Адрес сети источника.
Вы можете получить список событий успешной аутентификации 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. Идентификатор события 21 — это событие появляется после успешной аутентификации пользователя (Remote Desktop Services: Session logon succeeded
). Эти события находятся в разделе «Журналы приложений и служб -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational». Как видите, здесь можно найти идентификатор пользовательской RDP-сессии — ID сеанса.
EventID — 21 (Remote Desktop Services: Shell start notification received
) указывает на то, что оболочка Explorer успешно запущена (рабочий стол Windows появляется в RDP-сессии пользователя).
Отключение/возобновление сеанса — События отключения и повторного подключения сеанса имеют разные идентификаторы в зависимости от того, что стало причиной отключения пользователя (отключение из-за неактивности, установленной в таймаутах для сеансов RDP, опция Disconnect была выбрана пользователем в сеансе, сеанс RDP завершен другим пользователем или администратором и т.д.). Вы можете найти эти события в Event Viewer в разделе «Applications and Services Logs -> 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
) пользователь нажал кнопку «Отключить» в стартовом меню.
- код причины 0 (
EventID 4778 в Windows -> Журнал безопасности (сеанс был повторно подключен к Window Station). Пользователь повторно подключился к сеансу RDP (пользователю назначен новый идентификатор входа).
EventID 4779 в журнале «Windows -> Security» (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
) появляется в журнале безопасности.
Идентификатор события 9009 (The Desktop Window Manager has exited with code <X>
) в системном журнале означает, что пользователь инициировал выход из сеанса RDP, при этом как окно, так и графическая оболочка пользователя были завершены.
EventID 4647 — Выход из системы по инициативе пользователя
Получение истории входа в систему удаленного рабочего стола с помощью PowerShell
Вот короткий сценарий PowerShell, который выводит историю всех RDP-соединений за текущий день из журналов событий терминального RDS-сервера. В итоговой таблице отображается время соединения, IP-адрес клиента (DNS computername) и имя удаленного пользователя (при необходимости в отчет можно включить и другие 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 из Event Viewer в CSV-файл (для дальнейшего анализа в электронной таблице Excel). Журнал можно экспортировать из графического интерфейса Event Viewer (при условии, что журналы Event Viewer не очищены) или через командную строку:
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 журнал по идентификатору события 302. Например, следующий сценарий PowerShell отобразит историю подключений указанного пользователя через RD Gateway:
$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
- 300 — Пользователь NAME на клиентском компьютере DEVICE удовлетворяет требованиям политики авторизации ресурсов и поэтому получил разрешение на подключение к ресурсу RDPHOST;
- 302 — Пользователь NAME, на клиентском компьютере DEVICE, подключился к ресурсу RDPHOST;
- 303 — Пользователь NAME на клиентском компьютере DEVICE отключился от следующего сетевого ресурса: RDPHOST. Перед тем как пользователь отключился, клиент передал X байт и принял X байт. Длительность клиентского сеанса составила X секунд.
Список текущих удаленных сессий на хосте RDS можно отобразить с помощью команды:
qwinsta
Команда возвращает ID сеанса, USERNAME и состояние сеанса (Active/Disconnect). Эта команда полезна, когда вам нужно получить идентификатор RDP-сессии пользователя при использовании теневых подключений Remote Desktop.
Вы можете отобразить список запущенных процессов в конкретном сеансе RDP (указан идентификатор сеанса):
qprocess /id:5
Журналы исходящих соединений RDP в Windows
Вы также можете просмотреть журналы исходящих RDP-соединений на стороне клиента. Они доступны в следующем журнале событий: Application and Services Logs -> 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-адреса узлов Remote Desktop, к которым подключались пользователи. Вы можете преобразовать SID в имена пользователей следующим образом.