ในบทความนี้ เราจะอธิบายวิธีรับและตรวจสอบบันทึกการเชื่อมต่อ RDP ใน Windows บันทึกการเชื่อมต่อ RDP ช่วยให้ผู้ดูแลระบบเทอร์มินัลเซิร์ฟเวอร์ RDS ได้รับข้อมูลเกี่ยวกับผู้ใช้ที่เข้าสู่ระบบเซิร์ฟเวอร์เมื่อผู้ใช้ RDP เฉพาะเข้าสู่ระบบและสิ้นสุดเซสชัน และอุปกรณ์ (ชื่อ DNS หรือที่อยู่ IP) ที่ผู้ใช้เข้าสู่ระบบ
บทความนี้ใช้ได้เมื่อวิเคราะห์บันทึก RDP สำหรับทั้ง Windows Server 2022/2019/2016/2012R2 และรุ่นเดสก์ท็อป (Windows 11, 10 และ 8.1)
เหตุการณ์การเชื่อมต่อ RDP ใน Windows Event Viewer
เมื่อผู้ใช้เชื่อมต่อกับโฮสต์ RDS ที่เปิดใช้งานเดสก์ท็อประยะไกลหรือ RDS ข้อมูลเกี่ยวกับเหตุการณ์เหล่านี้จะถูกเก็บไว้ในบันทึกของตัวแสดงเหตุการณ์ (eventvwr.msc
). พิจารณาขั้นตอนหลักของการเชื่อมต่อ RDP และเหตุการณ์ที่เกี่ยวข้องใน Event Viewer ซึ่งผู้ดูแลระบบอาจสนใจ
- การเชื่อมต่อเครือข่าย
- รับรองความถูกต้อง;
- เข้าสู่ระบบ;
- เซสชันยกเลิกการเชื่อมต่อ/เชื่อมต่อใหม่
- ออกจากระบบ
การเชื่อมต่อเครือข่าย – การสร้างการเชื่อมต่อเครือข่ายไปยังเซิร์ฟเวอร์จากไคลเอนต์ RDP ของผู้ใช้ เป็นกิจกรรมที่มี EventID 1149 (Remote Desktop Services: User authentication succeeded
). หากพบเหตุการณ์นี้ ไม่ได้หมายความว่าการตรวจสอบสิทธิ์ผู้ใช้สำเร็จ บันทึกนี้อยู่ใน “บันทึกการใช้งานและบริการ -> Microsoft -> Windows -> Terminal-Services-RemoteConnectionManager> การดำเนินงาน”. เปิดใช้งานตัวกรองบันทึกสำหรับเหตุการณ์นี้ (คลิกขวาที่บันทึก -> กรองบันทึกปัจจุบัน -> 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)
ในกรณีนี้ ชื่อผู้ใช้จะอยู่ในคำอธิบายเหตุการณ์ใน ชื่อบัญชี ฟิลด์ ชื่อคอมพิวเตอร์ใน ชื่อเวิร์กสเตชัน และ 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
เข้าสู่ระบบ หมายถึงการเข้าสู่ระบบ RDP ไปยัง Windows รหัสเหตุการณ์ 21 – เหตุการณ์นี้ปรากฏขึ้นหลังจากตรวจสอบผู้ใช้สำเร็จแล้ว (Remote Desktop Services: Session logon succeeded
). เหตุการณ์นี้จะอยู่ใน “บันทึกการใช้งานและบริการ -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> การดำเนินงาน”. อย่างที่คุณเห็น คุณจะพบ ID ของเซสชัน RDP ของผู้ใช้ได้ที่นี่ — Session ID .
รหัสเหตุการณ์ – 21 (Remote Desktop Services: Shell start notification received
) แสดงว่าเชลล์ของ Explorer เริ่มต้นสำเร็จแล้ว (เดสก์ท็อป Windows ปรากฏในเซสชัน RDP ของผู้ใช้)
เซสชันยกเลิกการเชื่อมต่อ/เชื่อมต่อใหม่ – เหตุการณ์การยกเลิกการเชื่อมต่อและการเชื่อมต่อใหม่มี ID ที่แตกต่างกันขึ้นอยู่กับสิ่งที่ทำให้ผู้ใช้ขาดการเชื่อมต่อ (การตัดการเชื่อมต่อเนื่องจากการไม่ใช้งานที่กำหนดไว้ในการหมดเวลาสำหรับเซสชัน RDP ผู้ใช้เลือกตัวเลือก Disconnect ในเซสชัน เซสชัน RDP สิ้นสุดโดยผู้ใช้รายอื่นหรือผู้ดูแลระบบ เป็นต้น) คุณสามารถค้นหาเหตุการณ์เหล่านี้ได้ใน Event Viewer ภายใต้ “Applications and Services Logs -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational” ลองพิจารณารหัสเหตุการณ์ RDP ที่อาจเป็นประโยชน์:
- รหัสเหตุการณ์ – 24 (
Remote Desktop Services: Session has been disconnected
) – ผู้ใช้ยกเลิกการเชื่อมต่อจากเซสชัน RDP; - รหัสเหตุการณ์ – 25 (
Remote Desktop Services: Session reconnection succeeded
) – ผู้ใช้เชื่อมต่อกับเซสชัน RDP ที่มีอยู่บนเซิร์ฟเวอร์อีกครั้ง - รหัสเหตุการณ์ – 39 (
Session <A> has been disconnected by session <B>
) – ผู้ใช้ยกเลิกการเชื่อมต่อจากเซสชัน RDP โดยเลือกตัวเลือกเมนูที่เกี่ยวข้อง (แทนที่จะปิดหน้าต่างไคลเอ็นต์ RDP) หาก ID เซสชันต่างกัน แสดงว่าผู้ใช้ถูกตัดการเชื่อมต่อโดยผู้ใช้อื่น (หรือผู้ดูแลระบบ) - รหัสเหตุการณ์ – 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 (
รหัสเหตุการณ์ 4778 ใน Windows -> บันทึกความปลอดภัย (เซสชันเชื่อมต่อกับ Window Station อีกครั้ง) ผู้ใช้เชื่อมต่อกับเซสชัน RDP อีกครั้ง (ผู้ใช้ได้รับ LogonID ใหม่)
รหัสเหตุการณ์ 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 โดยที่ทั้งหน้าต่างและเปลือกกราฟิกของผู้ใช้ถูกยกเลิก
รหัสเหตุการณ์ 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 จาก Event Viewer เป็นไฟล์ CSV (สำหรับการวิเคราะห์เพิ่มเติมในสเปรดชีต Excel) คุณสามารถส่งออกบันทึกจาก Event Viewer GUI (สมมติว่าบันทึก 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 บันทึกโดย 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
คุณสามารถตรวจสอบเหตุการณ์การเชื่อมต่อผู้ใช้ 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 และสถานะเซสชัน (ใช้งานอยู่/ยกเลิกการเชื่อมต่อ) คำสั่งนี้มีประโยชน์เมื่อคุณต้องการรับ ID เซสชัน RDP ของผู้ใช้เมื่อใช้การเชื่อมต่อ Shadow Remote Desktop
คุณสามารถแสดงรายการของกระบวนการที่ทำงานอยู่ในเซสชัน RDP เฉพาะ (ระบุ ID เซสชัน):
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 ได้ในรีจิสทรีของผู้ใช้