约 2496 字

约 12 分钟

#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

#执行远程命令

使用 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

#注意事项

  • 远程命令返回的是序列化对象,不一定保留原始类型和全部方法。
  • 使用完持久会话后应调用 Remove-PSSession 释放资源。
  • 远程操作通常需要目标计算机上的相应权限,建议使用专用管理账户。
  • 在非域环境中配置 WinRM 可能需要额外设置信任关系,务必评估安全风险。

#推荐阅读

更新: 2026/11/2

作者: planc

创建: 2026/11/2