如何在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
相关产品推荐
相关产品推荐

