You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Invoke-Command外部获取PowerShell的RDP日志变量$EventData?

解决Invoke-Command内部变量无法在外部调用的问题

核心思路是利用Invoke-Command会返回远程执行的输出结果这一特性,将远程生成的$EventData对象传回本地,再汇总所有服务器的结果用于发送邮件。

修改后的完整代码

# 初始化汇总变量,用于存储所有服务器的RDP日志
$AllRDPEvents = @()

$ServersToCheck = Get-Content "C:\Temp\Servers-RDP2.txt"
foreach ($server in $ServersToCheck) {
    # 将Invoke-Command的返回结果(远程的事件对象)赋值给本地变量
    $serverEvents = Invoke-Command -ComputerName $server -ErrorAction SilentlyContinue {
        $username = "user"
        $FilterPath = "<QueryList><Query Id='0'><Select Path='Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational'>*[System[(EventID=1149) and TimeCreated[timediff(@SystemTime) <= 604800000]]] and *[UserData[EventXML[@xmlns='Event_NS'][Param1='{0}']]]</Select></Query></QueryList>" -f $username
        $RDPAuths = Get-WinEvent -ErrorAction SilentlyContinue -LogName 'Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational' -FilterXPath $FilterPath
        
        if ($RDPAuths) {
            [xml[]]$xml = $RDPAuths | ForEach-Object { $_.ToXml() }
            # 生成事件对象并直接输出(避免用FT格式化,否则会转为字符串丢失对象属性)
            foreach ($event in $xml.Event) {
                [PSCustomObject]@{
                    TimeCreated = (Get-Date $event.System.TimeCreated.SystemTime -Format 'dd-MM-yyyy hh:mm:ss')
                    User        = $event.UserData.EventXML.Param1
                    Domain      = $event.UserData.EventXML.Param2
                    Client      = $event.UserData.EventXML.Param3
                    Server      = $env:COMPUTERNAME  # 用环境变量获取服务器名,更可靠
                }
            }
        }
    }

    # 将当前服务器的结果添加到汇总变量中
    if ($serverEvents) {
        $AllRDPEvents += $serverEvents
    }
}

# 检查是否有汇总结果,再发送邮件
if ($AllRDPEvents) {
    # 将结果转为HTML表格,作为邮件正文
    $mailBody = $AllRDPEvents | ConvertTo-Html -Title "RDP登录日志核查结果" -Property TimeCreated, User, Domain, Client, Server | Out-String

    # 发送邮件示例(根据你的实际环境调整参数)
    Send-MailMessage -From "rdp-audit@yourdomain.com" `
                     -To "audit-team@yourdomain.com" `
                     -Subject "RDP登录日志核查报告" `
                     -Body $mailBody `
                     -BodyAsHtml `
                     -SmtpServer "smtp.yourdomain.com"
} else {
    Write-Host "未找到符合条件的RDP登录日志"
}

关键修改点说明

  • 获取远程输出对象:把Invoke-Command的执行结果赋值给本地变量$serverEvents,远程脚本块最后直接输出事件对象(而非用FT格式化),这样本地能拿到完整的对象集合,方便后续汇总和处理。
  • 汇总多服务器结果:初始化数组$AllRDPEvents,在循环中逐个添加每台服务器的事件结果。
  • 优化服务器名获取:用$env:COMPUTERNAME环境变量替代hostname命令,更符合PowerShell的规范用法。
  • 邮件内容格式化:用ConvertTo-Html把汇总的事件对象转成HTML表格,让邮件正文结构更清晰易读。

内容的提问来源于stack exchange,提问作者user3302129

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:45:37