#PowerShell 远程处理
#简介
PowerShell Remoting(远程处理)允许你在一台计算机上执行另一台计算机上的命令。它既支持一次执行单条命令,也支持建立持久会话后在会话中连续执行多条命令。
在 Windows 上,PowerShell Remoting 传统上基于 WinRM(WS-Management)。从 PowerShell 7 开始,还可以使用 SSH 作为传输方式,从而在 Windows、Linux 和 macOS 之间互相远程操作。
#基本概念
Invoke-Command:在远程计算机上执行命令或脚本块,适合一次性或批量操作。New-PSSession:创建持久的远程会话,可在会话中执行多条命令。Enter-PSSession:进入交互式远程会话,类似登录到远程计算机。Exit-PSSession:退出交互式远程会话,返回本地会话。
远程命令返回的对象通常会被序列化后传回本地,因此部分方法和实时对象行为可能与本地对象不同。
#WinRM 基础
在 Windows 上,远程处理依赖 WinRM 服务。以管理员身份运行 PowerShell,执行:
> Enable-PSRemoting -Force
该命令会启动 WinRM 服务、创建侦听器并配置防火墙规则。可以使用 Test-WSMan 检查目标计算机的 WinRM 是否可用:
> Test-WSMan -ComputerName server01
WinRM 默认使用 HTTP 5985 端口和 HTTPS 5986 端口。生产环境建议启用 HTTPS 或使用其他安全传输方式。
#创建会话
使用 New-PSSession 建立到远程计算机的持久会话,并在用完后清理:
> $cred = Get-Credential
> $session = New-PSSession -ComputerName server01 -Credential $cred
> Get-PSSession
> Remove-PSSession -Session $session
New-PSSession -ComputerName在 Windows 上使用 WinRM。在 Linux 和 macOS 上远程连接其他主机时,应改用-HostName(SSH 传输)。
#执行远程命令
使用 Invoke-Command 在远程计算机上执行脚本块:
> Invoke-Command -ComputerName server01 -Credential $cred -ScriptBlock { Get-Process | Select-Object -First 3 }
> Invoke-Command -Session $session -ScriptBlock { $PSVersionTable.PSVersion }
> Invoke-Command -ComputerName server01, server02 -ScriptBlock { hostname }
向脚本块传递参数:
> Invoke-Command -Session $session -ScriptBlock { param($Name) "Hello $Name" } -ArgumentList 'PowerShell'
#交互式会话
使用 Enter-PSSession 进入远程计算机的交互式会话:
> Enter-PSSession -ComputerName server01 -Credential $cred
进入后,提示符会包含远程计算机名,后续命令直接在远程计算机上执行。退出交互式会话:
[server01]: PS> Exit-PSSession
Enter-PSSession一次只能连接一台计算机,适合临时排查问题;批量操作应使用Invoke-Command。
#注意事项
- 远程命令返回的是序列化对象,不一定保留原始类型和全部方法。
- 使用完持久会话后应调用
Remove-PSSession释放资源。 - 远程操作通常需要目标计算机上的相应权限,建议使用专用管理账户。
- 在非域环境中配置 WinRM 可能需要额外设置信任关系,务必评估安全风险。