ในบทความนี้ เราจะอธิบายวิธีรับและตรวจสอบบันทึกการเชื่อมต่อ RDP ใน Windows บันทึกการเชื่อมต่อ RDP ช่วยให้ผู้ดูแลเซิร์ฟเวอร์ทーミนัล RDS ได้รับข้อมูลเกี่ยวกับผู้ใช้คนไหนล็อกอินเข้ เซิร์ฟเวอร์เมื่อไหร่ ผู้ใช้ RDP เฉพาะคนไหนล็อกอินและจบเซสชัน และจากอุปกรณ์ใด (ชื่อ DNS หรือที่อยู่ IP) ผู้ใช้ล็อกอิน
บทความนี้ใช้ได้ทั้งการวิเคราะห์บันทึก RDP สำหรับ Windows Server 2022/2019/2016/2012R2 และรุ่นเดสก์ท็อป (Windows 11, 10 และ 8.1)
เหตุการณ์การเชื่อมต่อ RDP ใน Windows Event Viewer
เมื่อผู้ใช้เชื่อมต่อกับโฮสต์ที่เปิดใช้งาน Remote Desktop หรือ RDS ข้อมูลเกี่ยวกับเหตุการณ์เหล่านี้จะถูกจัดเก็บในบันทึก Event Viewer (eventvwr.msc) พิจารณาขั้นตอนหลักของการเชื่อมต่อ RDP และเหตุการณ์ที่เกี่ยวข้องใน Event Viewer ซึ่งอาจน่าสนใจผู้ดูแลระบบ
- การเชื่อมต่อเครือข่าย (Network Connection)
- การรับรองความถูกต้อง (Authentication)
- การล็อกอิน (Logon)
- การยกเลิก/เชื่อมต่อใหม่เซสชัน (Session Disconnect/Reconnect)
- การล็อกออท (Logoff)
Network Connection — การสร้างการเชื่อมต่อเครือข่ายกับเซิร์ฟเวอร์จากไคลเอ็นต์ RDP ของผู้ใช้ เป็นเหตุการณ์ที่มี EventID 1149 (Remote Desktop Services: User authentication succeeded) หากพบเหตุการณ์นี้ ไม่ได้หมายความว่าการรับรองความถูกต้องของผู้ใช้สำเร็จ บันทึกนี้ตั้งอยู่ใน "Applications and Services Logs → Microsoft → Windows → Terminal-Services-RemoteConnectionManager → Operational" เปิดใช้งานตัวกรองบันทึกสำหรับเหตุการณ์นี้ (คลิกขวาบันทึก → Filter Current Log → 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 ทั้งหมดกับเซิร์ฟเวอร์นี้ บันทึกให้ชื่อผู้ใช้ โดเมน (ในกรณีนี้ใช้ Network Level Authentication; หากปิดใช้งาน NLA คำอธิบายเหตุการณ์จะมีลักษณะแตกต่าง) และที่อยู่ IP ของคอมพิวเตอร์ผู้ใช้
Authentication แสดงว่าผู้ใช้ 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)
คุณสามารถใช้เหตุการณ์การล้มเหลวในการรับรองความถูกต้อง RDP เพื่อป้องกันการโจมตี RDP brute force คุณสามารถบล็อก IP ของผู้โจมตีโดยอัตโนมัติที่ Windows Defender Firewall โดยใช้สคริปต์ PowerShell เรียบง่าย
ในกรณีนี้ ชื่อผู้ใช้อยู่ในคำอธิบายเหตุการณ์ในฟิลด์ Account Name ชื่อคอมพิวเตอร์ใน Workstation Name และ IP ของผู้ใช้ใน Source Network Address
โปรดสังเกตค่าของฟิลด์ 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
Logon หมายถึงการล็อกอิน RDP เข้า Windows EventID 21 — เหตุการณ์นี้ปรากฏหลังจากที่ผู้ใช้ได้รับการรับรองความถูกต้องสำเร็จ (Remote Desktop Services: Session logon succeeded) เหตุการณ์เหล่านี้ตั้งอยู่ใน "Applications and Services Logs → Microsoft → Windows → TerminalServices-LocalSessionManager → Operational" ตามที่คุณเห็น ที่นี่คุณสามารถหา ID ของเซสชัน RDP ของผู้ใช้ — Session ID
EventID – 21 (Remote Desktop Services: Shell start notification received) บ่งชี้ว่าเชลล์ Explorer ถูกเริ่มต้นสำเร็จ (เดสก์ท็อป Windows ปรากฏในเซสชัน RDP ของผู้ใช้)
Session Disconnect/Reconnect — เหตุการณ์การตัดการเชื่อมต่อและเชื่อมต่อใหม่เซสชันมี ID ที่แตกต่างกันขึ้นอยู่กับสาเหตุของการตัดการเชื่อมต่อของผู้ใช้ (การตัดการเชื่อมต่อเนื่องจากเวลาว่างที่ตั้งค่าใน timeout สำหรับเซสชัน RDP, ตัวเลือก Disconnect ถูกเลือกโดยผู้ใช้ในเซสชัน, เซสชัน RDP ถูกจบโดยผู้ใช้อื่นหรือผู้ดูแลระบบ ฯลฯ) คุณสามารถค้นหาเหตุการณ์เหล่านี้ใน Event Viewer ภายใต้ "Applications and Services Logs → Microsoft → Windows → TerminalServices-LocalSessionManager → Operational" มาพิจารณา RDP Event IDs ที่อาจมีประโยชน์:
- 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) หาก Session IDs แตกต่างกัน ผู้ใช้ถูกตัดการเชื่อมต่อโดยผู้ใช้อื่น (หรือผู้ดูแลระบบ) - EventID – 40 (
Session <A> has been disconnected, reason code <B>) ที่นี่คุณต้องตรวจสอบรหัสเหตุผลการตัดการเชื่อมต่อในคำอธิบายเหตุการณ์ เช่น:- reason code 0 (
No additional information is available) หมายความว่าผู้ใช้เพียงปิดหน้าต่างไคลเอ็นต์ RDP - reason code 5 (
The client's connection was replaced by another connection) หมายความว่าผู้ใช้เชื่อมต่อเซสชัน RDP ก่อนหน้าใหม่ - reason code 11 (
User activity has initiated the disconnect) ผู้ใช้คลิกปุ่ม Disconnect ในเมนูเริ่มต้น
- reason code 0 (
EventID 4778 ใน Windows → Security log (A session was reconnected to a Window Station) ผู้ใช้เชื่อมต่อเซสชัน RDP ใหม่ (ผู้ใช้ได้รับ LogonID ใหม่)
EventID 4779 ใน "Windows → Security" log (A session was disconnected from a Window Station) ผู้ใช้ถูกตัดการเชื่อมต่อจากเซสชัน RDP
Logoff หมายถึงการสิ้นสุดเซสชันของผู้ใช้ ถูกบันทึกเป็นเหตุการณ์ที่มี EventID 23 (Remote Desktop Services: Session logoff succeeded) ภายใต้ "Applications and Services Logs → Microsoft → Windows → TerminalServices-LocalSessionManager → Operational"
ในเวลาเดียวกัน EventID 4634 (An account was logged off) จะปรากฏในบันทึก Security
EventID 9009 (The Desktop Window Manager has exited with code <X>) ในบันทึก System หมายความว่าผู้ใช้เริ่มต้นล็อกออทจากเซสชัน RDP พร้อมกับหน้าต่างและเชลล์กราฟิกของผู้ใช้ถูกยกเลิก
EventID 4647 — การล็อกออทที่ผู้ใช้เริ่มต้น
การรับประวัติการล็อกอิน Remote Desktop ด้วย 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 คุณสามารถสืบค้นแต่ละตัวด้วยสคริปต์นี้ หรือรับบันทึกจากเซิร์ฟเวอร์จัดการที่มีบทบาท Remote Desktop Connection Broker
คุณสามารถส่งออกบันทึกการเชื่อมต่อ RDP จาก Event Viewer ไปยังไฟล์ CSV (สำหรับการวิเคราะห์ต่อไปในสเปรดชีต Excel) คุณสามารถส่งออกบันทึกจาก Event Viewer GUI (สมมติว่าบันทึก Event Viewer ไม่ถูกล้าง) หรือผ่าน command prompt:
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 ขององค์กรผ่าน Remote Desktop Gateway คุณสามารถตรวจสอบบันทึกการเชื่อมต่อของผู้ใช้ในบันทึก Microsoft-Windows-TerminalServices-Gateway โดย EventID 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
คุณสามารถตรวจสอบเหตุการณ์การเชื่อมต่อผู้ใช้ RD Gateway ต่อไปนี้ในบันทึกเหตุการณ์ Microsoft-Windows-TerminalServices-Gateway:
- 300 — ผู้ใช้ NAME, บนคอมพิวเตอร์ไคลเอ็นต์ DEVICE, ตรงตามข้อกำหนดนโยบายการให้สิทธิ์ทรัพยากร และได้รับอนุญาตให้เชื่อมต่อกับทรัพยากร RDPHOST
- 302 — ผู้ใช้ NAME, บนคอมพิวเตอร์ไคลเอ็นต์ DEVICE, เชื่อมต่อกับทรัพยากร RDPHOST
- 303 — ผู้ใช้ NAME, บนคอมพิวเตอร์ไคลเอ็นต์ DEVICE, ตัดการเชื่อมต่อจากทรัพยากรเครือข่ายต่อไปนี้: RDPHOST ก่อนที่ผู้ใช้จะตัดการเชื่อมต่อ ไคลเอ็นต์ส่ง X ไบต์และรับ X ไบต์ ระยะเวลาเซสชันไคลเอ็นต์คือ X วินาที
คุณสามารถแสดงรายการเซสชันระยะไกลปัจจุบันบนโฮสต์ RDS ของคุณด้วยคำสั่ง:
qwinsta
คำสั่งส่งคืน ID เซสชัน, USERNAME, และสถานะเซสชัน (Active/Disconnect) คำสั่งนี้มีประโยชน์เมื่อคุณต้องการรับ ID เซสชัน RDP ของผู้ใช้เมื่อใช้การเชื่อมต่อ Remote Desktop แบบ shadow
คุณสามารถแสดงรายการกระบวนการที่กำลังทำงานในเซสชัน RDP เฉพาะ (ระบุ ID เซสชัน):
qprocess /id:5
บันทึกการเชื่อมต่อ RDP ออก (Outgoing) ใน Windows
คุณยังสามารถดูบันทึกการเชื่อมต่อ RDP ออกได้จากฝั่งไคลเอ็นต์ พวกเขาพร้อมใช้งานในบันทึกเหตุการณ์ต่อไปนี้: Application and Services Logs → Microsoft → Windows → TerminalServices-ClientActiveXCore → Microsoft-Windows-TerminalServices-RDPClient → Operational
เช่น EventID 1102 เกิดขึ้นเมื่อผู้ใช้เชื่อมต่อกับโฮสต์ RDS Windows Server ระยะไกลหรือคอมพิวเตอร์ 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 เป็นชื่อผู้ใช้ได้ดังนี้
นอกจากนี้ คุณสามารถตรวจสอบประวัติการเชื่อมต่อ RDP ในรีจิสทรีของผู้ใช้ได้