当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 跟踪和分析 Windows 中的远程桌面连接日志

作者:精品下载站 日期:2024-12-14 23:21:23 浏览:15 分类:玩电脑

跟踪和分析 Windows 中的远程桌面连接日志


在本文中,我们将介绍如何在 Windows 中获取和审核 RDP 连接日志。 RDP 连接日志允许 RDS 终端服务器管理员获取有关当特定 RDP 用户登录并结束会话时哪些用户登录到服务器以及用户从哪个设备(DNS 名称或 IP 地址)登录的信息。

Windows 事件查看器中的 RDP 连接事件

当用户连接到启用远程桌面或 RDS 主机时,有关这些事件的信息将存储在事件查看器日志中 (

eventvwr.msc

)。考虑管理员可能感兴趣的事件查看器中 RDP 连接的主要阶段和相关事件

  1. 网络连接;

  2. 验证;

  3. 登录;

  4. 会话断开/重新连接;

  5. 注销。

网络连接 - 从用户的 RDP 客户端建立到服务器的网络连接。这是事件 ID 1149 (

Remote Desktop Services: User authentication succeeded

)。如果发现该事件,并不意味着用户认证成功。此日志位于“应用程序和服务日志 -> Microsoft -> Windows -> Terminal-Services-RemoteConnectionManager > 操作”。为此事件启用日志过滤器(右键单击日志 -> 过滤当前日志 -> EventId 1149)。

[玩转系统] 跟踪和分析 Windows 中的远程桌面连接日志

您可以使用 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

[玩转系统] 跟踪和分析 Windows 中的远程桌面连接日志

然后您将获得一个事件列表,其中包含与该服务器的所有 RDP 连接的历史记录。日志提供用户名、域(在本例中使用网络级身份验证;如果禁用 NLA,事件描述看起来会有所不同)以及用户计算机的 IP 地址。

[玩转系统] 跟踪和分析 Windows 中的远程桌面连接日志

身份验证 显示 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 模式下)。

您可以使用 RDP 身份验证失败事件来防止 RDP 暴力攻击。您可以使用简单的 PowerShell 脚本在 Windows Defender 防火墙上自动阻止攻击者 IP。

[玩转系统] 跟踪和分析 Windows 中的远程桌面连接日志

在这种情况下,用户名包含在事件描述的帐户名称字段中,计算机名称包含在工作站名称字段中,用户IP包含在源网络地址字段中。

请记下 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

[玩转系统] 跟踪和分析 Windows 中的远程桌面连接日志

登录是指通过 RDP 登录 Windows。 EventID 21 - 此事件在用户成功通过身份验证后出现(

Remote Desktop Services: Session logon succeeded

)。此事件位于“应用程序和服务日志 -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> 操作”中。如您所见,您可以在此处找到用户 RDP 会话的 ID - 会话 ID

[玩转系统] 跟踪和分析 Windows 中的远程桌面连接日志

事件ID - 21

Remote Desktop Services: Shell start notification received

)表示 Explorer shell 已成功启动(Windows 桌面出现在用户的 RDP 会话中)。

会话断开/重新连接 - 会话断开和重新连接事件具有不同的 ID,具体取决于导致用户断开连接的原因(由于 RDP 会话超时中设置的不活动而断开连接、用户在会话中选择了“断开连接”选项、其他用户或管理员结束了 RDP 会话等)。您可以在事件查看器中的“应用程序和服务日志 -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> 操作”下找到这些事件。让我们考虑一下可能有用的 RDP 事件 ID:

  • 事件 ID - 24 (

    Remote Desktop Services: Session has been disconnected

    ) - 用户已从 RDP 会话断开连接;

  • 事件 ID - 25 (

    Remote Desktop Services: Session reconnection succeeded

    ) - 用户已重新连接到服务器上现有的 RDP 会话;

  • 事件 ID - 39 (

    Session <A> has been disconnected by session <B>

    ) - 用户通过选择相应的菜单选项(而不是仅关闭 RDP 客户端窗口)从 RDP 会话断开连接。如果会话 ID 不同,则表明某个用户已被另一个用户(或管理员)断开连接;

  • 事件 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

    ) 用户单击了开始菜单中的“断开连接”按钮。

Windows -> 安全日志中的事件 ID 4778(会话已重新连接到 Window Station)。用户已重新连接到 RDP 会话(为用户分配了新的 LogonID)。

“Windows -> 安全”日志中的事件 ID 4779 (

A session was disconnected from a Window Station

)。用户已从 RDP 会话断开连接。

注销是指用户会话的结束。它被记录为具有 EventID 23 的事件(

Remote Desktop Services: Session logoff succeeded

)在“应用程序和服务日志 -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> 操作”下。

[玩转系统] 跟踪和分析 Windows 中的远程桌面连接日志

同时,EventID 4634

An account was logged off

)出现在安全日志中。

事件ID 9009

The Desktop Window Manager has exited with code <X>

)在系统日志中表示用户已从 RDP 会话中发起注销,并且该用户的窗口和图形 shell 均已终止。

EventID 4647 - 用户发起的注销

使用 PowerShell 获取远程桌面登录历史记录

以下是一个简短的 PowerShell 脚本,其中列出了终端 RDS 服务器事件日志中当天所有 RDP 连接的历史记录。生成的表显示连接时间、客户端的 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)"}
}
}}

[玩转系统] 跟踪和分析 Windows 中的远程桌面连接日志

此方法允许您在独立的 RDSH 服务器上收集和解析 RDP 连接日志。如果 RDS 场中有多个服务器,您可以使用此脚本查询每台服务器,或者从具有远程桌面连接代理角色的管理服务器获取日志。

您可以将 RDP 连接日志从事件查看器导出到 CSV 文件(以便在 Excel 电子表格中进一步分析)。您可以从事件查看器 GUI 导出日志(假设事件查看器日志未清除)或通过命令提示符导出:

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 主机,您可以通过 EventID 302Microsoft-Windows-TerminalServices-Gateway 日志中检查用户连接日志。例如,以下 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

[玩转系统] 跟踪和分析 Windows 中的远程桌面连接日志

您可以在 Microsoft-Windows-TerminalServices-Gateway 事件日志中检查以下 RD 网关用户连接事件:

  • 300 — 客户端计算机 DEVICE 上的用户 NAME 满足资源授权策略要求,因此被授权连接到资源 RDPHOST;

  • 302 — 客户端计算机 DEVICE 上连接到资源 RDPHOST 的用户名称;

  • 303 — 客户端计算机 DEVICE 上的用户 NAME 与以下网络资源断开连接:RDPHOST。在用户断开连接之前,客户端传输了 X 字节并接收了 X 字节。客户端会话持续时间为 X 秒。

您可以使用以下命令显示 RDS 主机上当前远程会话的列表:

qwinsta

该命令返回会话 ID、用户名和会话状态(活动/断开连接)。当您需要在使用影子远程桌面连接时获取用户的 RDP 会话 ID 时,此命令非常有用。

[玩转系统] 跟踪和分析 Windows 中的远程桌面连接日志

您可以显示特定 RDP 会话中正在运行的进程列表(指定会话 ID):

qprocess /id:5

[玩转系统] 跟踪和分析 Windows 中的远程桌面连接日志

Windows 中的传出 RDP 连接日志

您还可以在客户端查看传出 RDP 连接日志。它们可在以下事件日志中找到:应用程序和服务日志 -> Microsoft -> Windows -> TerminalServices-ClientActiveXCore -> Microsoft-Windows-TerminalServices-RDPClient -> 操作。

例如,当用户连接到远程 Windows Server RDS 主机或启用了 RDP 的 Windows 10/11 计算机(桌面 Windows 版本还支持多个同时 RDP 连接)时,会发生 EventID 1102

The client has initiated a multi-transport connection to the server 192.168.13.201.

[玩转系统] 跟踪和分析 Windows 中的远程桌面连接日志

以下 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

[玩转系统] 跟踪和分析 Windows 中的远程桌面连接日志

该脚本返回在此计算机上发起 RDP 连接的用户的 SID,以及用户连接到的远程桌面主机的 DNS 名称/IP 地址。您可以将 SID 转换为用户名,如下所示。

此外,您还可以在用户注册表中检查 RDP 连接历史记录。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯