RDP(远程桌面协议)相关的常见事件 ID 汇总,以及它们通常表示的含义。在 PowerShell 中实现记录远程桌面(RDP)会话数据可以通过以下步骤来实现。这些步骤涵盖了如何捕获会话连接和断开事件,并将相关信息记录到文件中。
RDP(远程桌面协议)相关的常见事件 ID 汇总,以及它们通常表示的含义。这些事件 ID 主要来自 Windows 事件查看器中的 Security、System 和 Application 日志。
Security 日志:
- 4624: 账户成功登录。 这个事件表明一个账户已经成功登录到系统。 对于 RDP 来说,这意味着有人通过远程桌面成功连接到你的计算机。
- 登录类型 (Logon Type) = 10: 表示通过远程桌面服务登录。
- 4625: 账户登录失败。 这个事件表明一个账户尝试登录系统失败。 对于 RDP 来说,这意味着有人尝试通过远程桌面连接到你的计算机,但登录失败。
- 登录类型 (Logon Type) = 10: 表示尝试通过远程桌面服务登录。
- 4634: 账户已注销。 这个事件表明一个账户已经从系统中注销。 对于 RDP 来说,这意味着一个远程桌面会话已经结束。
- 登录类型 (Logon Type) = 10: 表示通过远程桌面服务注销。
- 4776: 域控制器尝试验证账户凭据。 此事件通常与 Kerberos 身份验证相关,可能表明远程桌面连接正在使用 Kerberos 进行身份验证。
- 4648: 使用显式凭据启动登录尝试。 这可能表明使用了保存的凭据或 CredSSP 进行 RDP 连接。
System 日志:
- 7036: 服务已进入运行状态。 如果 Remote Desktop Services 服务启动,会记录此事件。
- 7035: 服务已进入停止状态。 如果 Remote Desktop Services 服务停止,会记录此事件。
Application 日志 (Microsoft-Windows-TerminalServices-LocalSessionManager/Operational):
- 21: 远程桌面服务:用户已成功登录。 提供比 4624 更详细的 RDP 登录信息。
- 22: 远程桌面服务:会话已重新连接。 用户重新连接到现有的远程桌面会话。
- 23: 远程桌面服务:用户已注销会话。 用户已从远程桌面会话注销。
- 24: 远程桌面服务:会话已断开连接。 远程桌面会话已断开连接,但用户可能仍然登录。
- 25: 远程桌面服务:创建会话。 一个新的远程桌面会话已创建。
- 39: 远程桌面服务:会话被限制。 由于资源限制,会话被限制。
- 40: 远程桌面服务:会话已达到最大连接时间。 会话已达到允许的最大连接时间。
Application 日志 (Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational):
- 1149: 远程桌面服务:RDP 监听器正在等待连接。 表明 RDP 服务正在运行并准备好接受连接。
Application 日志 (Microsoft-Windows-TerminalServices-SessionBroker/Operational):
- 这些事件与远程桌面会话经纪人相关,通常在远程桌面服务部署中使用。 它们可以提供有关会话连接、重定向和负载平衡的信息。 具体的事件 ID 取决于配置。
使用 PowerShell 查询事件日志示例:
# 查询 Security 日志中的 RDP 登录成功事件
Get-WinEvent -LogName Security -FilterXPath "//Event[System[EventID=4624 and EventData[Data[@Name='LogonType']=10]]]"
# 查询 Security 日志中的 RDP 登录失败事件
Get-WinEvent -LogName Security -FilterXPath "//Event[System[EventID=4625 and EventData[Data[@Name='LogonType']=10]]]"
# 查询 Application 日志中的远程桌面服务事件 (需要指定正确的日志名称)
Get-WinEvent -LogName "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" -FilterXPath "//Event[System[EventID=21 or EventID=22 or EventID=23 or EventID=24 or EventID=25]]"
解释:
Get-WinEvent是用于查询 Windows 事件日志的 PowerShell 命令。-LogName指定要查询的日志名称。-FilterXPath使用 XPath 表达式来过滤事件。EventID指定要查找的事件 ID。EventData[Data[@Name='LogonType']=10]用于过滤登录类型为 10 (远程桌面服务) 的事件。
重要提示:
- 日志格式: 不同版本的 Windows 和不同的配置可能会导致日志格式略有不同。 你需要根据你的实际情况调整查询语句。
- 事件日志位置: 事件日志的位置可能会因系统配置而异。
- 权限: 你需要具有足够的权限才能查询事件日志。
- 事件查看器: 可以使用 Windows 事件查看器 (eventvwr.msc) 来浏览和分析事件日志。
建议:
- 集中日志管理: 考虑使用集中日志管理解决方案 (例如 Splunk, ELK Stack, Graylog) 来收集、存储和分析来自多台计算机的事件日志。
- 安全监控: 配置安全监控工具来检测和响应可疑的 RDP 活动,例如暴力破解攻击、异常登录模式等。
- 定期审查: 定期审查 RDP 相关的事件日志,以识别潜在的安全问题。
通过监控这些事件 ID,你可以更好地了解谁在连接到你的系统,以及他们是否成功登录。 这对于安全审计和故障排除非常有用。
在 PowerShell 中实现记录远程桌面(RDP)会话数据可以通过以下步骤来实现。这些步骤涵盖了如何捕获会话连接和断开事件,并将相关信息记录到文件中。
1. 监听远程桌面会话事件
首先,我们需要监听远程桌面会话连接和断开的事件。这可以通过注册 Windows 事件日志中的事件提供程序来实现。
# 创建事件订阅
$sessionEvent = @"
<QueryList>
<Query Id="0" Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">
<Select Path="Microsoft-Windows-TerminalServices-LocalSessionManager/Operational">
*[System[Provider[@Name='Microsoft-Windows-TerminalServices-LocalSessionManager'] and (EventID=21 or EventID=24)]]
</Select>
</Query>
</QueryList>
"@
# 注册事件订阅
Register-WinEvent -Query $sessionEvent -SourceIdentifier "RDPSessionEvents" -Action {
$event = $event.Message
# 提取有用信息并记录到文件或其他位置
Add-Content -Path "RDP_Session_Log.txt" -Value $event
}
2. 记录事件信息
在注册事件订阅后,任何远程桌面会话连接(EventID=21)或断开(EventID=24)事件发生时,都会触发指定的动作。上面的脚本将事件信息提取并追加到 RDP_Session_Log.txt 文件中。
3. 开始监听事件
运行上面的 PowerShell 脚本,它将开始监听本地会话管理器事件日志中的 RDP 会话事件。当用户连接或断开 RDP 会话时,相关信息将被记录到指定的文本文件中。
注意事项
- 确保以管理员身份运行 PowerShell 脚本,以便注册事件订阅。
- 事件日志路径和事件 ID 可能会因 Windows 版本而异,需要根据实际情况进行调整。
- 可以根据需要修改记录的信息内容,以适应特定的需求和环境。
这种方法允许你捕获和记录远程桌面会话的连接和断开事件,为追踪和监视 RDP 使用提供了一种简单而有效的方式。
4. 完善记录的信息
在记录事件时,可以通过解析事件对象的详细属性来获得更多有用的信息,例如远程桌面会话的用户、计算机名、时间戳等。下面是如何进一步完善记录的信息:
# 注册事件订阅
Register-WinEvent -Query $sessionEvent -SourceIdentifier "RDPSessionEvents" -Action {
$event = $event.Message | ConvertFrom-Json
$sessionId = $event.SessionId
$userName = $event.User
$computerName = $event.ComputerName
$eventTime = $event.TimeCreated
$eventType = switch ($event.EventID) {
21 { "Session Connected" }
24 { "Session Disconnected" }
default { "Unknown" }
}
$logEntry = "$eventTime - $eventType - User: $userName, Session ID: $sessionId, Computer: $computerName"
Add-Content -Path "RDP_Session_Log.txt" -Value $logEntry
}
解释说明:
$event.Message可能是 JSON 格式的字符串,包含有关事件的详细信息。ConvertFrom-Json将 JSON 字符串转换为 PowerShell 对象,使得我们可以轻松地访问其中的属性。- 提取的属性包括
SessionId(会话ID)、User(用户)、ComputerName(计算机名)、TimeCreated(事件发生时间)等。 - 使用
switch语句根据事件ID(EventID)来确定事件类型,从而记录相应的事件描述。
5. 启动和停止监听事件
要开始监听事件,运行注册事件订阅的 PowerShell 脚本。脚本会持续运行,等待事件发生。
要停止监听事件,可以使用以下命令:
Unregister-Event -SourceIdentifier "RDPSessionEvents"
这将取消注册之前的事件订阅,停止记录远程桌面会话事件。
注意事项:
- 确保你有足够的权限来注册和取消注册事件订阅,通常需要管理员权限。
- 可以根据实际需求调整日志文件的存储路径和格式化方式。
- 建议在测试和生产环境之前先测试脚本,以确保它能正常运行并记录预期的信息。
通过这些步骤,你可以有效地利用 PowerShell 监听和记录远程桌面会话的连接和断开事件,为系统管理和监控提供有用的数据。
使用 PowerShell 脚本自动化实时监测日志文件,查询远程桌面(RDP)相关事件(包括尝试登录、登录成功、退出等)的示例脚本。
脚本功能:
- 实时监测: 脚本会持续监测指定的日志文件,当有新行写入时,会立即进行分析。
- 关键词搜索: 脚本会搜索包含特定关键词(例如 "RDP", "远程桌面", "登录成功", "登录失败", "退出" 等)的日志条目。
- 事件提取: 脚本会尝试提取关键信息,例如时间戳、用户名、来源 IP 地址等。
- 结果输出: 脚本会将匹配的日志条目和提取的信息输出到控制台,也可以选择输出到文件。
- 远程桌面事件过滤: 脚本专门针对远程桌面相关的事件进行过滤和分析。
脚本代码:
# 脚本参数
$LogFilePath = "C:\Path\To\Your\LogFile.log" # 替换为你的日志文件路径
$Keywords = @("RDP", "远程桌面", "登录成功", "登录失败", "退出", "Remote Desktop Services") # 关键词列表
$OutputFile = "C:\Path\To\Output\RDP_Events.log" # 可选:输出文件路径,如果不需要输出到文件,留空即可
# 函数:提取远程桌面事件信息
function Extract-RDPEvents {
param (
[string]$LogEntry
)
# 提取时间戳
$Timestamp = (Get-Date).ToString() # 如果日志本身不包含时间戳,则使用当前时间
# 提取用户名 (根据日志格式调整)
$Username = $null
if ($LogEntry -match "用户: (.*?) ") {
$Username = $Matches[1]
} elseif ($LogEntry -match "Username: (.*?)") {
$Username = $Matches[1]
}
# 提取来源 IP 地址 (根据日志格式调整)
$SourceIP = $null
if ($LogEntry -match "来源 IP 地址: (.*?) ") {
$SourceIP = $Matches[1]
} elseif ($LogEntry -match "Source Network Address: (.*?)") {
$SourceIP = $Matches[1]
}
# 判断事件类型 (登录成功、登录失败、退出等)
$EventType = "Unknown"
if ($LogEntry -match "登录成功") {
$EventType = "Login Success"
} elseif ($LogEntry -match "登录失败") {
$EventType = "Login Failed"
} elseif ($LogEntry -match "退出") {
$EventType = "Logout"
}
# 创建一个哈希表来存储提取的信息
$EventData = @{
Timestamp = $Timestamp
EventType = $EventType
Username = $Username
SourceIP = $SourceIP
LogEntry = $LogEntry
}
return $EventData
}
# 注册事件,实时监测日志文件
Register-ObjectEvent -InputObject (Get-Content -Path $LogFilePath -Wait) -EventName DataAdded -SourceIdentifier LogMonitor -Action {
$NewEntry = $Event.SourceEventArgs.Line
# 检查日志条目是否包含任何关键词
if ($Keywords | Where-Object { $NewEntry -like "*$_*" }) {
# 提取远程桌面事件信息
$EventData = Extract-RDPEvents -LogEntry $NewEntry
# 输出到控制台
Write-Host "--------------------------------------------------"
Write-Host "时间戳: $($EventData.Timestamp)"
Write-Host "事件类型: $($EventData.EventType)"
Write-Host "用户名: $($EventData.Username)"
Write-Host "来源 IP 地址: $($EventData.SourceIP)"
Write-Host "原始日志: $($EventData.LogEntry)"
# 输出到文件 (如果指定了输出文件路径)
if ($OutputFile) {
$EventData | ConvertTo-Json | Out-File -FilePath $OutputFile -Append
}
}
}
Write-Host "脚本正在运行,实时监测日志文件: $LogFilePath"
Write-Host "按 Ctrl+C 停止脚本"
# 保持脚本运行,直到手动停止
while ($true) {
Start-Sleep -Seconds 1
}
# 取消事件注册 (如果脚本被停止)
Unregister-Event -SourceIdentifier LogMonitor
使用方法:
- 修改参数:
- 将
$LogFilePath替换为你要监测的日志文件的实际路径。 - 根据需要修改
$Keywords数组,添加或删除关键词。 - 如果需要将结果输出到文件,请设置
$OutputFile变量。 如果不需要,将其留空。
- 将
- 保存脚本: 将代码保存为
.ps1文件(例如Monitor-RDP-Logs.ps1)。 - 运行脚本:
- 以管理员身份打开 PowerShell。
- 导航到脚本所在的目录。
- 运行脚本:
.\Monitor-RDP-Logs.ps1
- 停止脚本: 按
Ctrl+C停止脚本。
脚本解释:
$LogFilePath: 指定要监测的日志文件的路径。$Keywords: 包含要搜索的关键词的数组。$OutputFile: 指定输出文件的路径(可选)。Extract-RDPEvents函数: 这个函数负责从日志条目中提取关键信息,例如时间戳、用户名、来源 IP 地址和事件类型。 你需要根据你的日志文件的格式来调整这个函数。Register-ObjectEvent: 这个命令注册一个事件,当日志文件有新行写入时,会触发相应的操作。Get-Content -Path $LogFilePath -Wait会持续监测日志文件,当有新内容添加到文件末尾时,会触发DataAdded事件。-Action指定当事件发生时要执行的代码块。
$Event.SourceEventArgs.Line: 这个变量包含新添加的日志条目。Where-Object { $NewEntry -like "*$_*" }: 这个命令会检查日志条目是否包含任何关键词。Write-Host: 将结果输出到控制台。ConvertTo-Json | Out-File: 将结果转换为 JSON 格式并输出到文件(如果指定了输出文件路径)。Unregister-Event: 取消事件注册,在脚本停止时清理资源。
重要注意事项:
- 日志文件格式: 此脚本假设你的日志文件是文本文件,并且每行包含一个日志条目。 你需要根据你的日志文件的实际格式来调整脚本。
- 事件提取:
Extract-RDPEvents函数需要根据你的日志文件的格式进行调整,才能正确提取信息。 你需要仔细分析你的日志文件,找到包含时间戳、用户名、来源 IP 地址等信息的模式,并修改正则表达式来匹配这些模式。 - 权限: 运行此脚本需要读取日志文件的权限。 确保你以具有足够权限的用户身份运行 PowerShell。
- 性能: 如果日志文件非常大,或者写入速度非常快,此脚本可能会消耗大量的 CPU 资源。 你可以考虑使用更高效的日志分析工具,例如 Splunk、ELK Stack 等。
- 安全性: 如果日志文件包含敏感信息(例如密码),请确保采取适当的安全措施来保护日志文件。
- 错误处理: 此脚本没有包含完整的错误处理。 你可以添加错误处理代码来处理可能发生的异常,例如文件不存在、权限不足等。
改进方向:
- 更灵活的关键词配置: 可以将关键词存储在配置文件中,方便修改。
- 更丰富的事件类型: 可以添加更多的事件类型,例如会话连接、会话断开等。
- 更详细的事件信息: 可以提取更多的事件信息,例如客户端版本、操作系统版本等。
- 报警功能: 可以添加报警功能,当检测到特定事件时,发送邮件或短信通知。
- 集成到监控系统: 可以将此脚本集成到现有的监控系统中,例如 Zabbix、Nagios 等。
这个脚本提供了一个基本的框架,你可以根据你的实际需求进行修改和扩展。 希望这个脚本能帮助你实时监测远程桌面相关的日志事件!

浙公网安备 33010602011771号