Trong bài viết này, chúng tôi sẽ mô tả cách lấy và kiểm tra nhật ký kết nối RDP trong Windows. Nhật ký kết nối RDP cho phép quản trị viên máy chủ đầu cuối RDS lấy thông tin về người dùng nào đã đăng nhập vào máy chủ khi một người dùng RDP cụ thể đăng nhập và kết thúc phiên và từ thiết bị nào (tên DNS hoặc địa chỉ IP) mà người dùng đã đăng nhập.
Bài viết có thể áp dụng khi phân tích nhật ký RDP cho cả Windows Server 2022/2019/2016 / 2012R2 và các phiên bản dành cho máy tính để bàn (Windows 11, 10 và 8.1).
Sự kiện kết nối RDP trong Trình xem sự kiện của Windows
Khi người dùng kết nối với máy chủ lưu trữ RDS hoặc hỗ trợ Máy tính Từ xa, thông tin về các sự kiện này được lưu trữ trong nhật ký của Trình xem sự kiện (eventvwr.msc
). Xem xét các giai đoạn chính của kết nối RDP và các sự kiện liên quan trong Trình xem sự kiện, có thể được quản trị viên quan tâm
- Kết nối mạng;
- Xác thực;
- Đăng nhập;
- Ngắt kết nối / Kết nối lại phiên;
- Đăng xuất.
Kết nối mạng - thiết lập kết nối mạng với máy chủ từ máy khách RDP của người dùng. Đó là sự kiện có EventID 1149 (Remote Desktop Services: User authentication succeeded
). Nếu sự kiện này được tìm thấy, điều đó không có nghĩa là xác thực người dùng đã thành công. Nhật ký này nằm trong “Nhật ký ứng dụng và dịch vụ -> Microsoft -> Windows -> Terminal-Services-RemoteConnectionManager > Hoạt động ”. Bật bộ lọc nhật ký cho sự kiện này (nhấp chuột phải vào nhật ký -> Lọc nhật ký hiện tại -> EventId 1149 ).
Bạn có thể liệt kê tất cả các lần thử kết nối RDP với 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
Sau đó, bạn sẽ nhận được một danh sách sự kiện với lịch sử của tất cả các kết nối RDP đến máy chủ này. Nhật ký cung cấp tên người dùng, miền (trong trường hợp này là Xác thực cấp độ mạng; nếu NLA bị tắt, mô tả sự kiện sẽ khác) và địa chỉ IP của máy tính của người dùng.
Xác thực cho biết người dùng RDP đã được xác thực thành công trên máy chủ hay chưa. Nhật ký nằm trong Windows -> Bảo mật. Vì vậy, bạn có thể quan tâm đến các sự kiện với EventID 4624 (An account was successfully logged on
) hoặc 4625 (An account failed to log on
).
Vui lòng chú ý đến LogonType giá trị trong mô tả sự kiện.
- LogonType =10 hoặc 3 - nếu dịch vụ Máy tính Từ xa đã được sử dụng để tạo phiên mới trong khi đăng nhập;
- LogonType =7 , nghĩa là người dùng đã kết nối lại với phiên RDP hiện có;
- LogonType =5 - Kết nối RDP với bảng điều khiển máy chủ (ở chế độ mstsc.exe / admin).
Trong trường hợp này, tên người dùng có trong mô tả sự kiện trong Tên tài khoản , tên máy tính trong Tên máy trạm và IP của người dùng trong Địa chỉ mạng nguồn .
Vui lòng lưu ý giá trị của LogonID đồng ruộng. Đây là số nhận dạng phiên RDP của người dùng duy nhất giúp theo dõi hoạt động thêm của người dùng. Tuy nhiên, nếu một phiên RDP bị ngắt kết nối và người dùng kết nối lại với nó, người dùng sẽ được gán một LogonID mới (mặc dù phiên RDP vẫn giữ nguyên).Bạn có thể nhận được danh sách các sự kiện xác thực RDP thành công (EventID 4624) bằng cách sử dụng lệnh PowerShell này:
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
Đăng nhập đề cập đến thông tin đăng nhập RDP vào Windows. EventID 21 - sự kiện này xuất hiện sau khi người dùng đã được xác thực thành công (Remote Desktop Services: Session logon succeeded
). Sự kiện này nằm trong “Nhật ký ứng dụng và dịch vụ -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Hoạt động ”. Như bạn có thể thấy, tại đây bạn có thể tìm thấy ID của phiên RDP của người dùng - ID phiên .
EventID - 21 (Remote Desktop Services: Shell start notification received
) cho biết rằng trình bao Explorer đã được khởi động thành công (màn hình Windows xuất hiện trong phiên RDP của người dùng).
Ngắt kết nối / kết nối lại phiên - các sự kiện ngắt kết nối và kết nối lại phiên có các ID khác nhau tùy thuộc vào nguyên nhân gây ra ngắt kết nối của người dùng (ngắt kết nối do không hoạt động được đặt trong thời gian chờ cho các phiên RDP, tùy chọn Ngắt kết nối đã được người dùng chọn trong phiên, phiên RDP do người dùng khác hoặc quản trị viên kết thúc, Vân vân.). Bạn có thể tìm thấy những sự kiện này trong Trình xem sự kiện trong “Nhật ký ứng dụng và dịch vụ -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational”. Hãy xem xét các ID sự kiện RDP có thể hữu ích:
- EventID - 24 (
Remote Desktop Services: Session has been disconnected
) – Một người dùng đã ngắt kết nối khỏi phiên RDP; - EventID - 25 (
Remote Desktop Services: Session reconnection succeeded
) - người dùng đã kết nối lại với phiên RDP hiện có trên máy chủ; - EventID - 39 (
Session <A> has been disconnected by session <B>
) - người dùng đã ngắt kết nối khỏi phiên RDP bằng cách chọn tùy chọn menu tương ứng (thay vì chỉ đóng cửa sổ máy khách RDP). Nếu các ID phiên khác nhau, một người dùng đã bị người dùng (hoặc quản trị viên) khác ngắt kết nối; - EventID - 40 (
Session <A> has been disconnected, reason code <B>
). Tại đây bạn phải kiểm tra mã lý do ngắt kết nối trong phần mô tả sự kiện. Ví dụ:- mã lý do 0 (
No additional information is available
) nghĩa là người dùng vừa đóng cửa sổ máy khách RDP; - mã lý do 5 (
The client’s connection was replaced by another connection
) nghĩa là người dùng đã kết nối lại với phiên RDP trước đó; - mã lý do 11 (
User activity has initiated the disconnect
) người dùng đã nhấp vào nút Ngắt kết nối trong menu bắt đầu.
- mã lý do 0 (
EventID 4778 trong Windows -> Nhật ký bảo mật (Một phiên đã được kết nối lại với Trạm cửa sổ). Người dùng đã kết nối lại với phiên RDP (người dùng được chỉ định LogonID mới).
EventID 4779 trong nhật ký “Windows -> Security” (A session was disconnected from a Window Station
). Người dùng đã bị ngắt kết nối khỏi phiên RDP.
Logoff đề cập đến sự kết thúc của một phiên người dùng. Nó được ghi lại dưới dạng sự kiện với EventID 23 (Remote Desktop Services: Session logoff succeeded
) trong “Nhật ký ứng dụng và dịch vụ -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational”.
Đồng thời EventID 4634 (An account was logged off
) xuất hiện trong Nhật ký bảo mật.
EventID 9009 (The Desktop Window Manager has exited with code <X>
) trong Nhật ký hệ thống có nghĩa là người dùng đã bắt đầu đăng xuất khỏi phiên RDP với cả cửa sổ và khung đồ họa của người dùng đã bị chấm dứt.
EventID 4647 - Đăng xuất do người dùng khởi tạo
Lấy Lịch sử Đăng nhập Máy tính Từ xa với PowerShell
Đây là một tập lệnh PowerShell ngắn liệt kê lịch sử của tất cả các kết nối RDP cho ngày hiện tại từ các bản ghi sự kiện máy chủ RDS đầu cuối. Bảng kết quả hiển thị thời gian kết nối, địa chỉ IP của máy khách (tên máy tính DNS) và tên người dùng từ xa (nếu cần, bạn có thể bao gồm các Loại LogonT khác trong báo cáo).
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)"}
}
}}
Phương pháp này cho phép bạn thu thập và phân tích cú pháp nhật ký kết nối RDP trên một máy chủ RDSH độc lập. Nếu bạn có nhiều máy chủ trong trang trại RDS, bạn có thể truy vấn từng máy chủ bằng tập lệnh này hoặc lấy nhật ký từ máy chủ quản lý với vai trò Người môi giới kết nối máy tính từ xa.
Bạn có thể xuất nhật ký kết nối RDP từ Trình xem sự kiện sang tệp CSV (để phân tích thêm trong bảng tính Excel). Bạn có thể xuất nhật ký từ GUI của Trình xem sự kiện (giả sử nhật ký của Trình xem sự kiện không bị xóa) hoặc qua dấu nhắc lệnh:
WEVTUtil query-events Security > c:\ps\rdp_security_log.txt
Hoặc với PowerShell:
get-winevent -logname "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" | Export-Csv c:\ps\rdp_connection_log.txt -Encoding UTF8
Nếu người dùng của bạn kết nối với máy chủ RDS của công ty thông qua Cổng máy tính từ xa, bạn có thể kiểm tra nhật ký kết nối của người dùng trong Microsoft-Windows-TerminalServices-Gateway ghi nhật ký bằng EventID 302 . Ví dụ:tập lệnh PowerShell sau sẽ hiển thị lịch sử kết nối của người dùng được chỉ định thông qua 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
Bạn có thể kiểm tra các sự kiện kết nối người dùng RD Gateway sau trong nhật ký sự kiện Microsoft-Windows-TerminalServices-Gateway:
- 300 - Người dùng NAME, trên máy tính khách DEVICE, đáp ứng các yêu cầu về chính sách cấp quyền tài nguyên và do đó được phép kết nối với tài nguyên RDPHOST;
- 302 - Người dùng NAME, trên máy tính khách DEVICE, được kết nối với tài nguyên RDPHOST;
- 303 - Người dùng NAME, trên máy khách DEVICE, đã ngắt kết nối khỏi tài nguyên mạng sau:RDPHOST. Trước khi người dùng ngắt kết nối, máy khách đã chuyển X byte và nhận X byte. Thời lượng phiên khách hàng là X giây.
Bạn có thể hiển thị danh sách các phiên từ xa hiện tại trên máy chủ RDS của mình bằng lệnh:
qwinsta
Lệnh trả về ID phiên, USERNAME và trạng thái phiên (Hoạt động / Ngắt kết nối). Lệnh này hữu ích khi bạn cần lấy ID phiên RDP của người dùng khi sử dụng kết nối Máy tính từ xa bóng tối.
Bạn có thể hiển thị danh sách các quy trình đang chạy trong phiên RDP cụ thể (ID phiên được chỉ định):
qprocess /id:5
Nhật ký kết nối RDP đi trong Windows
Bạn cũng có thể xem nhật ký kết nối RDP gửi đi ở phía máy khách. Chúng có sẵn trong nhật ký sự kiện sau:Nhật ký Ứng dụng và Dịch vụ -> Microsoft -> Windows -> TerminalServices-ClientActiveXCore -> Microsoft-Windows-TerminalServices-RDPClient -> Hoạt động.
Ví dụ:EventID 1102 xảy ra khi người dùng kết nối với máy chủ Windows Server RDS từ xa hoặc máy tính Windows 10/11 có bật RDP (các phiên bản Windows dành cho máy tính để bàn cũng hỗ trợ nhiều kết nối RDP đồng thời).
The client has initiated a multi-transport connection to the server 192.168.13.201.
Tập lệnh RDP sau sẽ hiển thị lịch sử kết nối máy khách RDP trên máy tính hiện tại:
$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
Tập lệnh trả về SID của những người dùng đã khởi tạo kết nối RDP trên máy tính này, cũng như tên DNS / địa chỉ IP của máy chủ Remote Desktop mà người dùng đã kết nối. Bạn có thể chuyển đổi SID thành tên người dùng như sau.
Ngoài ra, bạn có thể kiểm tra lịch sử kết nối RDP trong sổ đăng ký của người dùng.