이 글에서는 Windows에서 RDP(원격 데스크톱 프로토콜) 연결 로그를 조회하고 감사하는 방법을 자세히 설명합니다. RDP 연결 로그를 활용하면 RDS 터미널 서버 관리자가 다음과 같은 정보를 파악할 수 있습니다.
- 어떤 사용자가 서버에 로그온했는지
- 특정 RDP 사용자가 언제 세션을 시작하고 종료했는지
- 사용자가 어떤 장치(DNS 이름 또는 IP 주소)에서 접속했는지
이 문서의 내용은 Windows Server 2022, 2019, 2016, 2012R2는 물론 데스크톱 버전인 Windows 11, 10, 8.1에서도 동일하게 적용할 수 있습니다.
이벤트 뷰어에서 확인하는 RDP 연결 이벤트
사용자가 원격 데스크톱이 활성화된 서버 또는 RDS 호스트에 접속하면, 해당 이벤트 정보는 이벤트 뷰어(eventvwr.msc) 로그에 저장됩니다. RDP 연결은 여러 단계로 진행되며, 각 단계마다 관리자가 주목해야 할 이벤트가 기록됩니다.
- 네트워크 연결(Network Connection)
- 인증(Authentication)
- 로그온(Logon)
- 세션 연결 해제/재연결(Session Disconnect/Reconnect)
- 로그오프(Logoff)
1. 네트워크 연결 (EventID 1149)
네트워크 연결은 사용자의 RDP 클라이언트에서 서버로 네트워크 연결이 설정되는 단계입니다. 이때 EventID 1149(Remote Desktop Services: User authentication succeeded) 이벤트가 발생합니다. 다만 이 이벤트가 있다고 해서 반드시 사용자 인증이 성공한 것은 아니라는 점에 유의해야 합니다.
해당 로그는 다음 경로에서 확인할 수 있습니다.
“응용 프로그램 및 서비스 로그 → Microsoft → Windows → Terminal-Services-RemoteConnectionManager → Operational”
로그 필터를 사용하면 특정 이벤트만 빠르게 찾을 수 있습니다. 로그를 마우스 오른쪽 버튼으로 클릭한 후 “현재 로그 필터링(Filter Current Log)”을 선택하고 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 연결 기록 목록이 출력됩니다. 로그에는 사용자 이름, 도메인, 그리고 사용자 컴퓨터의 IP 주소가 포함됩니다. 참고로 NLA(네트워크 수준 인증)를 사용하는 경우와 비활성화된 경우에는 이벤트 설명 형식이 조금 다르게 표시됩니다.

2. 인증 (EventID 4624 / 4625)
인증 단계에서는 RDP 사용자가 서버에서 성공적으로 인증되었는지 여부를 확인할 수 있습니다. 관련 로그는 “Windows 로그 → Security”에 위치하며, EventID 4624(An account was successfully logged on, 계정 로그온 성공) 또는 EventID 4625(An account failed to log on, 계정 로그온 실패) 이벤트를 살펴보아야 합니다.
특히 이벤트 설명의 LogonType(로그온 유형) 값에 주목할 필요가 있습니다.
- LogonType = 10 또는 3: 원격 데스크톱 서비스를 통해 새 세션이 생성된 경우
- LogonType = 7: 사용자가 기존 RDP 세션에 재연결한 경우
- LogonType = 5: mstsc.exe /admin 모드 등 서버 콘솔로의 RDP 연결
RDP 인증 실패 이벤트는 무차별 대입(Brute Force) 공격으로부터 서버를 보호하는 데 활용할 수 있습니다. 간단한 PowerShell 스크립트를 작성하면 공격자의 IP를 Windows Defender 방화벽에서 자동으로 차단하는 것도 가능합니다.

이 경우 사용자 이름은 이벤트 설명의 Account Name 필드에, 컴퓨터 이름은 Workstation Name 필드에, 사용자 IP는 Source Network Address 필드에 기록됩니다.
또한 LogonID 필드 값을 확인하세요. LogonID는 사용자 RDP 세션의 고유 식별자로, 이후 사용자의 추가 활동을 추적하는 데 유용합니다. 다만 RDP 세션 연결이 끊긴 후 사용자가 같은 세션에 다시 접속하면 새로운 LogonID가 할당된다는 점에 유의해야 합니다(RDP 세션 자체는 동일하게 유지됩니다).
다음 PowerShell 명령으로 오늘 하루 동안의 성공적인 RDP 인증 이벤트(EventID 4624) 목록을 조회할 수 있습니다.
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
3. 로그온 (EventID 21)
로그온은 실제로 Windows에 RDP로 로그인하는 단계를 의미합니다. EventID 21(Remote Desktop Services: Session logon succeeded)은 사용자가 성공적으로 인증된 후 발생합니다. 해당 이벤트는 “응용 프로그램 및 서비스 로그 → Microsoft → Windows → TerminalServices-LocalSessionManager → Operational”에서 확인할 수 있으며, 여기서 사용자 RDP 세션 ID(Session ID)도 함께 확인할 수 있습니다.

같은 위치에서 EventID 21(Remote Desktop Services: Shell start notification received)은 탐색기(Explorer) 셸이 정상적으로 시작되었음을 의미합니다. 즉, 사용자의 RDP 세션에 Windows 바탕화면이 나타난 상태입니다.
4. 세션 연결 해제/재연결 (EventID 24, 25, 39, 40, 4778, 4779)
세션 연결 해제/재연결 이벤트의 ID는 연결이 끊긴 원인에 따라 달라집니다. 예를 들어 RDP 세션 제한 시간(비활동 타임아웃)으로 인한 연결 해제, 사용자가 직접 ‘연결 끊기’를 선택한 경우, 다른 사용자나 관리자가 세션을 종료한 경우 등이 있습니다. 이러한 이벤트 역시 “TerminalServices-LocalSessionManager → Operational” 로그에서 확인할 수 있으며, 주요 이벤트 ID는 다음과 같습니다.
- 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 클라이언트 창을 닫는 것과 구분됨). 두 세션 ID가 다른 경우, 다른 사용자 또는 관리자가 해당 사용자를 강제로 연결 해제한 것입니다. - EventID 40(
Session <A> has been disconnected, reason code <B>): 이벤트 설명의 연결 해제 사유 코드(reason code)를 확인해야 합니다.- 사유 코드 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(
보안(Security) 로그에서도 관련 이벤트를 확인할 수 있습니다.
- EventID 4778(
A session was reconnected to a Window Station): 사용자가 RDP 세션에 재접속한 경우이며, 새로운 LogonID가 할당됩니다. - EventID 4779(
A session was disconnected from a Window Station): 사용자가 RDP 세션에서 연결 해제된 경우입니다.
5. 로그오프 (EventID 23, 4634, 9009, 4647)
로그오프는 사용자 세션이 완전히 종료되는 단계입니다. “TerminalServices-LocalSessionManager → Operational” 로그에 EventID 23(Remote Desktop Services: Session logoff succeeded)으로 기록됩니다.

동시에 보안 로그에는 EventID 4634(An account was logged off)가 나타납니다.
또한 시스템(System) 로그의 EventID 9009(The Desktop Window Manager has exited with code <X>)는 사용자가 RDP 세션에서 로그오프를 시작했으며, 사용자 세션의 창과 그래픽 셸이 모두 종료되었음을 의미합니다.
EventID 4647은 사용자가 직접 로그오프를 요청한 경우(User-initiated logoff)에 기록됩니다.
PowerShell로 원격 데스크톱 로그인 기록 조회하기
다음은 터미널 RDS 서버의 이벤트 로그에서 오늘 하루 동안의 전체 RDP 연결 기록을 출력하는 짧은 PowerShell 스크립트입니다. 결과 표에는 연결 시간, 클라이언트 IP 주소(DNS 컴퓨터 이름), 원격 사용자 이름이 표시됩니다. 필요하다면 보고서에 다른 LogonType도 추가할 수 있습니다.
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)"}
}
}}
이 방식은 단일 RDSH 서버에서 RDP 연결 로그를 수집하고 분석하는 데 적합합니다. RDS 팜에 여러 대의 서버가 있다면 각 서버에 대해 이 스크립트를 실행하거나, Remote Desktop Connection Broker 역할이 설치된 관리 서버에서 로그를 가져올 수 있습니다.
로그를 CSV 파일로 내보내기
이벤트 뷰어의 RDP 연결 로그를 CSV 파일로 내보내면 Excel에서 추가 분석하기 편리합니다. 이벤트 뷰어 GUI에서 내보내거나(단, 로그가 삭제되지 않았어야 함), 명령 프롬프트에서 다음 명령을 사용할 수 있습니다.
WEVTUtil query-events Security > c:\ps\rdp_security_log.txtPowerShell을 사용하는 방법은 다음과 같습니다.
get-winevent -logname "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" | Export-Csv c:\ps\rdp_connection_log.txt -Encoding UTF8RD Gateway를 통한 접속 로그 확인
사용자들이 Remote Desktop Gateway(RD 게이트웨이)를 통해 회사의 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: 사용자 NAME이 클라이언트 컴퓨터 DEVICE에서 RDPHOST 리소스에 연결됨
- 303: 사용자 NAME이 클라이언트 컴퓨터 DEVICE에서 네트워크 리소스 RDPHOST와의 연결을 해제함. 연결 해제 전까지 클라이언트가 X바이트를 전송하고 X바이트를 수신했으며, 클라이언트 세션 지속 시간은 X초였음
현재 세션 및 프로세스 확인 (qwinsta, qprocess)
RDS 호스트에서 현재 활성화된 원격 세션 목록은 다음 명령으로 확인할 수 있습니다.
qwinsta이 명령은 세션 ID, USERNAME, 세션 상태(Active/Disconnect)를 반환합니다. 섀도우(Shadow) 원격 데스크톱 연결을 사용할 때 사용자의 RDP 세션 ID를 알아내야 하는 경우 특히 유용합니다.

특정 RDP 세션(세션 ID 지정)에서 실행 중인 프로세스 목록도 확인할 수 있습니다.
qprocess /id:5
Windows에서 나가는(Outgoing) RDP 연결 로그 확인
클라이언트 쪽에서도 나가는(outgoing) RDP 연결 로그를 확인할 수 있습니다. 해당 로그는 다음 경로에 있습니다.
“응용 프로그램 및 서비스 로그 → Microsoft → Windows → TerminalServices-ClientActiveXCore → Microsoft-Windows-TerminalServices-RDPClient → Operational”
예를 들어 EventID 1102는 사용자가 원격 Windows Server RDS 호스트 또는 RDP가 활성화된 Windows 10/11 컴퓨터에 접속할 때 발생합니다(데스크톱 Windows 버전도 동시 복수 RDP 연결을 지원합니다).
The client has initiated a multi-transport connection to the server 192.168.13.201.

다음 PowerShell 스크립트는 현재 컴퓨터에서 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
이 스크립트는 해당 컴퓨터에서 RDP 연결을 시작한 사용자들의 SID와, 사용자가 접속한 원격 데스크톱 호스트의 DNS 이름/IP 주소를 반환합니다. SID는 아래와 같은 방법으로 사용자 이름으로 변환할 수 있습니다.
또한 사용자의 레지스트리에서도 RDP 연결 기록을 확인할 수 있습니다.