PowerShell脚本本地运行正常但SolarWinds SAM组件执行失败问题
PowerShell脚本在SolarWinds SAM中执行异常问题排查
问题根因定位
1. 脚本本身存在的逻辑缺陷
- 路径拼接错误:代码中硬编码拼接路径时未补全路径分隔符,例如
"path1" + $_.Name会生成C:\test文件名.doc这类错误路径,若本地测试时path1末尾刚好带反斜杠可正常运行,但SAM执行时路径参数不带反斜杠就会失效,建议统一用Join-Path命令拼接路径避免该问题。 - 功能逻辑不符:需求为文件复制后移动到Path2,但代码中所有目标路径均写死为path1,未用到目标路径变量,属于硬编码错误。
- 无错误捕获逻辑:代码未添加异常捕获,就算
Copy-Item因权限问题执行失败也不会抛出提示,仅会让count计数为0,容易误判为未找到匹配文件。
2. Local Host模式返回0文件的原因
- 权限不足:SolarWinds SAM本地执行模式默认使用SolarWinds Agent服务的运行账号,不是本地登录的用户账号,该账号如果没有path1路径的读取权限,
Get-ChildItem会直接返回空结果,不会抛出权限报错,表现为找不到文件。 - 相对路径解析错误:如果代码中的path1使用相对路径,SAM执行脚本的工作目录是Agent的安装目录,不是本地测试时的脚本目录,相对路径会解析到错误位置,找不到对应文件夹。
- 位阶环境差异:如果SolarWinds Agent是32位版本,调用的是32位PowerShell,访问
C:\Program Files会自动重定向到C:\Program Files (x86),若path1在64位Program Files目录下就会无法匹配到路径。
3. Remote模式返回Down状态的原因
- WinRM配置异常:SAM远程执行模式依赖目标机器的WinRM服务,目标机器未开启WinRM、未配置允许SolarWinds服务器IP访问、防火墙未开放5985(HTTP)/5986(HTTPS)端口,都会导致远程调用直接失败。
- 远程认证失败:配置的远程执行账号没有目标机器的本地管理员权限,或账号密码错误、域信任异常,都会导致认证不通过,无有效返回。
- 执行策略限制:目标机器的PowerShell执行策略设置为Restricted,不允许运行未签名脚本,远程调用时会直接被拦截。
修复方案
优化后脚本
# 填写绝对路径,禁止使用相对路径 $sourcePath = 'C:\替换为实际的path1绝对路径' $targetPath = 'C:\替换为实际的path2绝对路径' $filter = '*.doc' $msg = '' $count = 0 $stamp = Get-Date -Format 'yyyy-MM-dd_HH-mm' # 前置校验路径有效性和权限 if (-not (Test-Path -Path $sourcePath -PathType Container)) { Write-Host "Statistic.FileMonitor: 0" Write-Host "Message.FileMonitor: 源路径不存在或无权限访问: $sourcePath" exit 0 } Get-ChildItem -Path $sourcePath -Filter $filter -File | ForEach-Object { $count++ $msg += ",$($_.FullName)" $newFileName = "$($_.BaseName)_$stamp$($_.Extension)" $fullTargetPath = Join-Path -Path $targetPath -ChildPath $newFileName # 添加异常捕获,暴露执行错误 try { Copy-Item -Path $_.FullName -Destination $fullTargetPath -Force -ErrorAction Stop } catch { $msg += " [复制失败: $($_.Exception.Message)]" } } if($count -gt 0) { Write-Host "Statistic.FileMonitor: $count" Write-Host "Message.FileMonitor: $count 个文件已处理,文件列表: $msg" exit 0 } else { Write-Host "Statistic.FileMonitor: 0" Write-Host "Message.FileMonitor: 未找到匹配的doc文件" exit 0 }
配套配置调整
- 给SolarWinds Agent服务账号/远程执行账号授予源路径的读取权限、目标路径的写入权限
- 远程模式使用前先在SolarWinds服务器上执行
Test-WSMan 目标机器IP,确认WinRM连通性正常 - 目标机器执行
Set-ExecutionPolicy RemoteSigned -Force,调整PowerShell执行策略允许运行本地脚本
内容的提问来源于stack exchange,提问作者user15949319
相关产品推荐
相关产品推荐

