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 事件日志中的事件提供程序来实现。

powershellCopy Code
# 创建事件订阅
$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. 完善记录的信息

在记录事件时,可以通过解析事件对象的详细属性来获得更多有用的信息,例如远程桌面会话的用户、计算机名、时间戳等。下面是如何进一步完善记录的信息:

powershellCopy Code
# 注册事件订阅
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 脚本。脚本会持续运行,等待事件发生。

要停止监听事件,可以使用以下命令:

powershellCopy Code
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

使用方法:

  1. 修改参数:
    • 将 $LogFilePath 替换为你要监测的日志文件的实际路径。
    • 根据需要修改 $Keywords 数组,添加或删除关键词。
    • 如果需要将结果输出到文件,请设置 $OutputFile 变量。 如果不需要,将其留空。
  2. 保存脚本: 将代码保存为 .ps1 文件(例如 Monitor-RDP-Logs.ps1)。
  3. 运行脚本:
    • 以管理员身份打开 PowerShell。
    • 导航到脚本所在的目录。
    • 运行脚本:.\Monitor-RDP-Logs.ps1
  4. 停止脚本: 按 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 等。

这个脚本提供了一个基本的框架,你可以根据你的实际需求进行修改和扩展。 希望这个脚本能帮助你实时监测远程桌面相关的日志事件!


 

posted @ 2024-07-16 08:42  suv789  阅读(316)  评论(0)    收藏  举报