PowerShell批量远程执行命令依赖WinRM会话,需目标机启用PSRemoting、控制端配置TrustedHosts,并用Invoke-Command或PSSession分发脚本块;支持参数传递、错误处理及会话复用。
powershell 向多台远程服务器批量下发并执行命令,核心依赖 powershell remoting(基于 winrm 协议),不是简单地“发个指令”,而是建立安全、可控的远程会话通道后,在目标机上下文里真正运行脚本块。关键在于三件事:目标机已就绪、控制端可信任、命令能结构化分发。
前提:确保远程管理在每台目标服务器上已启用
这步必须在每台被管理服务器上以管理员身份执行一次:
- 运行 Enable-PSRemoting -Force —— 自动启动 WinRM 服务、设为自启、开放防火墙端口(默认 TCP 5985)、注册 HTTP 监听器
- 若目标机网络位置是“公共”,系统可能拦截;-Force 参数可绕过交互提示,内网环境可接受
- 验证监听是否生效:运行 winrm enumerate winrm/config/listener,看到 Transport = HTTP 即表示 OK
控制端配置可信主机(尤其适用于工作组/未加域环境)
非域环境下,PowerShell 默认拒绝连接未知 IP。需在你自己的电脑(控制端)中明确指定信任列表:
- 添加单台:Set-Item WSMan:\localhost\Client\TrustedHosts -Value "192.168.1.100" -Force
- 添加多台(逗号分隔,无空格):Set-Item WSMan:\localhost\Client\TrustedHosts -Value "192.168.1.100,192.168.1.101,server03" -Force
- 查看当前设置:Get-Item WSMan:\localhost\Client\TrustedHosts
- ⚠️ 不建议用 "*"(信任所有),仅限完全隔离的测试内网
批量执行命令:用 Invoke-Command 最直接有效
这是最常用、最轻量的批量执行方式,无需维持长期会话,适合状态查询、服务启停、日志采集等一次性任务:
- 从文本文件读取服务器列表:$servers = Get-Content "C:\servers.txt"(每行一个 IP 或主机名)
- 执行统一命令(例如查 Spooler 服务状态):
Invoke-Command -ComputerName $servers -ScriptBlock { Get-Service -Name Spooler } | Select-Object PSComputerName, Status, Name - 如需传参(比如安装路径、注册表键值),用 -ArgumentList 和 param() 配合,避免硬编码
- 支持错误处理:-ErrorAction SilentlyContinue 或配合 try/catch 捕获单台失败
进阶场景:需要交互调试或多次调用时用 PSSession
当你要在一台目标机上连续执行多条命令、导入模块、或反复读写变量,持久会话更高效:
- 先创建会话:$s = New-PSSession -ComputerName "192.168.1.100" -Credential (Get-Credential)
- 后续命令复用该会话:Invoke-Command -Session $s -ScriptBlock { ipconfig }
- 批量创建多个会话:$sessions = New-PSSession -ComputerName $servers -Credential $cred,再统一操作
- 用完记得清理:Remove-PSSession -Session $sessions


















