远程多服务器执行PowerShell脚本遇Invoke-Command报错求助
修复远程ADSync运行历史收集脚本并实现邮件发送
脚本核心问题修正
- Invoke-Command语法错误:原脚本中
-ScriptBlock与后续代码块分离,导致命令无法识别远程执行逻辑,正确写法需将远程代码完整包裹在-ScriptBlock { ... }中。 - 缺少凭据支持:远程服务器执行命令需指定权限凭据,需添加
-Credential参数。 - 数据汇总逻辑:确保远程返回的数据集被正确收集后统一导出,避免局部导出导致的数据覆盖。
修正后完整脚本
# 读取目标服务器列表 $servers = Get-Content "c:\serverlist\servers.txt" # 获取远程访问凭据(交互式输入,也可提前加密存储) $remoteCredential = Get-Credential -Message "输入远程服务器访问凭据" # 批量收集各服务器ADSync运行历史 $Report = foreach ($server in $servers) { Invoke-Command -ComputerName $server -Credential $remoteCredential -ScriptBlock { # 定义输出属性映射 $props = @( @{N='ServerName'; E={ $env:COMPUTERNAME }} 'StartDate' 'EndDate' 'ConnectorName' 'RunProfileName' 'StepResult' ) # 定义要筛选的运行配置文件 $targetProfiles = @( 'Delta Import' 'Delta Synchronization' 'Full Import' 'Full Synchronization' ) -join '|' # 获取并筛选指定配置的最新2条运行记录 Get-ADSyncToolsRunstepHistory | Group-Object RunProfileName | Where-Object Name -Match $targetProfiles | ForEach-Object { $_.Group | Select-Object -First 2 } | Select-Object $props } } # 将汇总数据导出为CSV文件 $Report | Export-Csv "c:\serverlist\export.csv" -NoTypeInformation -Encoding UTF8 # 发送带附件的邮件(需根据实际SMTP配置修改参数) $mailSettings = @{ SmtpServer = "your-smtp-server.domain.com" From = "report-sender@domain.com" To = "report-recipient@domain.com" Subject = "ADSync运行历史汇总报告" Body = "附件为各服务器ADSync指定配置的运行历史数据,请查收。" Attachments = "c:\serverlist\export.csv" UseSsl = $true Port = 587 Credential = (Get-Credential -Message "输入邮件服务器发送凭据") } Send-MailMessage @mailSettings
关键注意事项
- 确保所有远程服务器已安装
ADSyncTools模块,否则远程执行Get-ADSyncToolsRunstepHistory会报错。 - 凭据存储:若需自动化执行,可使用
ConvertTo-SecureString将凭据加密存储到文件,避免交互式输入,但需注意文件权限安全。 - SMTP配置:需根据企业邮件服务器的实际要求调整
SmtpServer、Port、UseSsl等参数。
内容的提问来源于stack exchange,提问作者hacrks
相关产品推荐
相关产品推荐

