系统学习 学习路径总入口:先选领域,再建立模型,最后用故障演练验证

版本信息最后核对:2026-10-25

用 WinRM 或 SSH 在远程主机上运行 PowerShell,批量管理而不必逐台登录

适用场景

需要在多台 Windows 主机上批量查询状态、收集日志、启停服务或做配置变更时使用。典型场景是域内巡检、把本地脚本推到远程执行、在跳板机上复用会话做多步操作。只操作本机时不需要 remoting,直接本地执行更简单,也少一层认证和序列化。

不适合的场景:目标机只开放 SSH 且没有 WinRM;需要跨不可信网络直接暴露 WinRM;工作组环境既没有域信任也没有证书。此时优先用 PowerShell 7.x 的 SSH 远程、堡垒机或配置管理工具,不要把 5985 端口直接开到公网。

核心概念

5.1 与 7.x 差异

常用操作

# 1. 在目标机启用 WinRM(管理员)。会改服务、监听器和防火墙规则
PS C:\> Enable-PSRemoting -Force
PS C:\> Test-WSMan -ComputerName SRV01

# 2. 单机执行;凭据交互输入,不要写进脚本
PS C:\> Invoke-Command -ComputerName SRV01 -Credential (Get-Credential) -ScriptBlock { Get-Service Spooler }

# 3. 批量执行,主机列表来自文件,限制并发
PS C:\> $hosts = Get-Content .\hosts.txt
PS C:\> Invoke-Command -ComputerName $hosts -ThrottleLimit 16 -ScriptBlock { Get-CimInstance Win32_OperatingSystem | Select-Object PSComputerName, LastBootUpTime }

# 4. 建立可复用会话,进入交互后再退出,会话仍保留
PS C:\> $s = New-PSSession -ComputerName SRV01
PS C:\> Enter-PSSession -Session $s
PS C:\> Exit-PSSession

# 5. 在复用会话里传本地变量,必须用 $using:
PS C:\> $svc = 'Spooler'
PS C:\> Invoke-Command -Session $s -ScriptBlock { Get-Service -Name $using:svc }

# 6. 通过会话复制文件,不必另外开放 SMB 共享
PS C:\> Copy-Item .\deploy.ps1 -Destination C:\Temp\deploy.ps1 -ToSession $s

# 7. PowerShell 7.x 用 SSH 连 Linux 或 Windows,不依赖 WinRM
PS C:\> Invoke-Command -HostName linux01 -UserName ops -SSHTransport -ScriptBlock { uname -a }

# 8. 断开后远程会话和作业可保留,稍后重连
PS C:\> Disconnect-PSSession -Session $s
PS C:\> Connect-PSSession -Session $s

易错点

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 目标机只开放 SSH,应该用 -ComputerName 还是 -HostName?5.1 能做吗?
  2. Invoke-Command 返回的对象为什么调用不了原来的方法?
  3. 工作组环境连接 WinRM 报拒绝访问,你会先查哪三件事?
答案
  1. 用 -HostName 配合 -SSHTransport;5.1 没有 SSH 传输,只能走 WinRM 或改用 ssh 命令和远程 shell。
  2. 跨会话结果被序列化成带 Deserialized. 前缀的对象,只保留属性和部分类型信息,方法不会传输;操作要在远程 ScriptBlock 内完成。
  3. 账号是否在 Remote Management Users、WinRM 和防火墙是否放行、工作组远程 UAC 限制是否导致本地管理员令牌被过滤;必要时再检查 TrustedHosts 或 HTTPS 证书。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令