第20章|轻松实现远程控制
第20章|轻松实现远程控制——学习笔记 & 高分实战博客
目标:把“会用”变成“用得省心”。本章把一次性远程调用升级为可复用会话、隐式远程(Import-PSSession)与断开/重连会话的体系化玩法,显著降低输入成本、提升并发与稳定性。
一、为什么要用可复用会话(PSSession)
传统的一次性远程调用(Invoke-Command -ComputerName ...
/ Enter-PSSession -ComputerName ...
)每次都要重新指定计算机名、凭据、端口/认证方式,重复且易错。会话(PSSession)是你与远端 PowerShell 之间的持久连接,建好一次,多次复用:
- 省输入:连接参数只写一次
- 省时间:握手与认证复用
- 省心智:与多机批量执行天然配合
一句话:把“目标环境”先装进变量,再把“命令”发给变量。
二、快速上手(10分钟通关)
1)创建与查看会话
# 建多个会话
$sessions = New-PSSession -ComputerName SERVER-R2, localhost# 查看所有已开会话
Get-PSSession
2)进入/退出一对一交互
# 按索引进入
Enter-PSSession -Session $sessions[0]
# 做事...
Exit-PSSession
记不住索引?用属性筛选:
Enter-PSSession -Session ($sessions | Where-Object ComputerName -eq 'SERVER-R2')
# 或者直接管道
Get-PSSession -ComputerName SERVER-R2 | Enter-PSSession
3)一对多并发执行
# 把命令发给会话集合(默认并发上限 32 台)
Invoke-Command -Session $sessions -ScriptBlock { Get-Process }
与
-ComputerName
相比,用-Session
的优势:
- 固定端口(WinRM)对防火墙更友好
- 并发执行更快
- 复用连接与凭据
- 能与 CIM 新式命令一起用(v3+ 倡导通过
Invoke-Command
在远端执行)
4)清理会话
# 关指定
$sessions | Remove-PSSession
# 或一键清空
Get-PSSession | Remove-PSSession
三、隐式远程(Import-PSSession):像本地一样用远端模块
场景:本机没有某管理模块(如 AD 模块),但远端服务器有。隐式远程把远端命令“映射成本地临时命令”,使用手感几乎一致。
# 1. 对有模块的服务器建会话
$ad = New-PSSession -ComputerName SERVER-R2# 2.(可选)确保远端加载模块
Invoke-Command -Session $ad -ScriptBlock { Import-Module ActiveDirectory }# 3. 把远端命令“导入”到本机(加前缀避免冲突)
Import-PSSession -Session $ad -Module ActiveDirectory -Prefix rem
现在可用 Get-remADUser
、New-remADUser
等命令了。
注意事项
- 返回的是反序列化对象(属性快照、无方法)。适合“查/筛/导出”等命令式用法,不适合必须调用对象方法的场景。
- 是临时映射,关闭会话/关闭 Shell 即失效。
v3+ 还有一步到位方式:
Import-Module -PSSession $ad -Name ActiveDirectory -Prefix rem
四、断开与重连(Disconnected Sessions,v3+)
弱网或跨机接力操作时,会话可“断开保留”,之后再接回:
# 建会话
$s = New-PSSession -ComputerName COMPUTER2# 断开(远端 PowerShell 仍驻留)
Disconnect-PSSession -Session $s# 换另一台电脑或稍后,再把会话接回来
Get-PSSession -ComputerName COMPUTER2 | Connect-PSSession
生命周期与配额(WSMan 驱动器关键设置)
WSMan:\localhost\Shell\IdleTimeout
:空闲多久回收(默认超长,建议调整)WSMan:\localhost\Shell\MaxShellsPerUser
、MaxConcurrentUsers
WSMan:\localhost\Service\MaxConnections
:服务端总连接上限
建议用组策略集中管理,避免“僵尸会话”。
五、常见陷阱与排障清单
- 没启用远程
- 本地/远端都要:
Enable-PSRemoting -Force
- 确保 WinRM 服务自动且已启动,HTTP/HTTPS 监听开启
- 双跳(Double-Hop)问题
- 需要二次访问(如远端再去 SMB/SQL)会因凭据委派失败
- 方案:使用
CredSSP
、Kerberos 委派、或把后续访问放到同一台远端执行
- 认证与端口
- 域内优先 Kerberos;工作组/跨域可能退回 NTLM
- 生产建议启用 HTTPS WinRM(证书绑定 5986)
- 对象被“去方法”(隐式远程)
- 反序列化对象无法
.Method()
,改为在远端完成逻辑后只回传最终数据
- 并发/性能
Invoke-Command -ThrottleLimit N
控制风暴- 批量大量输出建议在远端先聚合/筛选再返回
- 会话泄露
- 规范
Remove-PSSession
,并收紧IdleTimeout
六、实战模板(拿去即用)
1)会话池管理
function New-SessionPool {param([string[]]$Computers,[pscredential]$Cred)New-PSSession -ComputerName $Computers -Credential $Cred
}function Invoke-Against {param([System.Management.Automation.Runspaces.PSSession[]]$Sessions,[scriptblock]$Script)Invoke-Command -Session $Sessions -ScriptBlock $Script
}# 示例
$pool = New-SessionPool -Computers @('web1','web2','web3')
Invoke-Against -Sessions $pool -Script { Get-Service | Where Status -eq 'Running' }
$pool | Remove-PSSession
2)隐式远程一键导入模块
function Import-RemoteModule {param([string]$Computer,[string]$Module,[string]$Prefix = 'rem')$s = New-PSSession -ComputerName $ComputerImport-PSSession -Session $s -Module $Module -Prefix $Prefix | Out-Null$s # 返回会话以便后续统一清理
}$adSession = Import-RemoteModule -Computer SERVER-R2 -Module ActiveDirectory -Prefix rem
Get-remADDomain
Remove-PSSession $adSession
七、动手演练(对照打卡 ✅)
- 关闭所有会话:
Get-PSSession | Remove-PSSession
- 建
$session
:$session = New-PSSession -ComputerName localhost
- 一对一交互:
Enter-PSSession $session
➜Get-Process
➜Exit
- 多机执行:
Invoke-Command -Session $session -ScriptBlock { Get-Service }
- 结合
Get-PSSession
:
Invoke-Command -Session (Get-PSSession) -ScriptBlock { Get-EventLog -LogName System -Newest 20 }
- 远端加载模块:
Invoke-Command -Session $session -ScriptBlock { Import-Module ServerManager }
- 导入带前缀:
Import-PSSession -Session $session -Module ServerManager -Prefix rem
- 调新命令:
Get-remWindowsFeature
- 清理:
Remove-PSSession -Session $session
八、最佳实践速记
- 默认用会话池:一次建、多次用、统一关
- 能在远端筛选就不把海量数据拉回本地
- 用隐式远程补齐本地缺模块,记得加
-Prefix
- 生产启用 WinRM HTTPS,并设合理
IdleTimeout
- 留意双跳:提前设计认证与数据路径
- 批量并发控制
-ThrottleLimit
,循序分批更稳