当前位置: 首页 > news >正文

第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-remADUserNew-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\MaxShellsPerUserMaxConcurrentUsers
  • WSMan:\localhost\Service\MaxConnections:服务端总连接上限

建议用组策略集中管理,避免“僵尸会话”。


五、常见陷阱与排障清单

  1. 没启用远程
  • 本地/远端都要:Enable-PSRemoting -Force
  • 确保 WinRM 服务自动且已启动,HTTP/HTTPS 监听开启
  1. 双跳(Double-Hop)问题
  • 需要二次访问(如远端再去 SMB/SQL)会因凭据委派失败
  • 方案:使用 CredSSP、Kerberos 委派、或把后续访问放到同一台远端执行
  1. 认证与端口
  • 域内优先 Kerberos;工作组/跨域可能退回 NTLM
  • 生产建议启用 HTTPS WinRM(证书绑定 5986)
  1. 对象被“去方法”(隐式远程)
  • 反序列化对象无法 .Method(),改为在远端完成逻辑后只回传最终数据
  1. 并发/性能
  • Invoke-Command -ThrottleLimit N 控制风暴
  • 批量大量输出建议在远端先聚合/筛选再返回
  1. 会话泄露
  • 规范 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

七、动手演练(对照打卡 ✅)

  1. 关闭所有会话:Get-PSSession | Remove-PSSession
  2. $session$session = New-PSSession -ComputerName localhost
  3. 一对一交互:Enter-PSSession $sessionGet-ProcessExit
  4. 多机执行:Invoke-Command -Session $session -ScriptBlock { Get-Service }
  5. 结合 Get-PSSession
    Invoke-Command -Session (Get-PSSession) -ScriptBlock { Get-EventLog -LogName System -Newest 20 }
  6. 远端加载模块:Invoke-Command -Session $session -ScriptBlock { Import-Module ServerManager }
  7. 导入带前缀:Import-PSSession -Session $session -Module ServerManager -Prefix rem
  8. 调新命令:Get-remWindowsFeature
  9. 清理:Remove-PSSession -Session $session

八、最佳实践速记

  • 默认用会话池:一次建、多次用、统一关
  • 能在远端筛选就不把海量数据拉回本地
  • 用隐式远程补齐本地缺模块,记得加 -Prefix
  • 生产启用 WinRM HTTPS,并设合理 IdleTimeout
  • 留意双跳:提前设计认证与数据路径
  • 批量并发控制 -ThrottleLimit,循序分批更稳

http://www.dtcms.com/a/356060.html

相关文章:

  • NumPy 2.x 完全指南【三十二】通用函数(ufunc)之数学运算函数
  • 面试tips--JVM(1)--对象分配内存的方式TLAB
  • CTFshow系列——命令执行web61-68
  • C++之多态篇
  • 君正T31学习(四)- MT7682+VLC出图
  • 【python】python进阶——as关键字
  • 程序代码篇---类
  • SpringCloud Alibaba Nacos 注册中心/配置中心
  • SpringBoot 配置文件在运维开发中的应用
  • 基于springboot的商业店铺租赁系统
  • 在 Vue 前端(Vue2/Vue3 通用)载入 JSON 格式的动图
  • 校园文化活动管理系统设计与实现(代码+数据库+LW)
  • web前端知识——第一阶段
  • 【buildroot】【1. Buildroot版本与Linux内核调试对应关系】
  • 基于SpringBoot的旅游景点推荐系统【2026最新】
  • 域名所有权变更,需要重新备案吗
  • Day16_【机器学习分类】
  • 软磁材料与硬磁材料
  • MTK Linux DRM分析(十九)- KMS drm_framebuffer.c
  • LeetCode 141.环形链表
  • 软考中级【网络工程师】第6版教材 第4章 无线通信网 (上)
  • 8.28 JS移动端事件
  • HTTP 范围请求:为什么你的下载可以“断点续传”?
  • 现在购买PCIe 5.0 SSD是否是最好的时机?
  • 嵌入式学习笔记--LINUX系统编程阶段--DAY02系统编程
  • 嵌入式学习日志————实验:串口发送串口发送+接收
  • 亚远景-ISO/PAS 8800:如何通过认证提升企业技术管理能力?
  • 入职体检空腹血糖 6.15mmol/L合格吗?
  • amis上传组件导入文件接口参数为base64格式的使用示例
  • NumPy 2.x 完全指南【三十一】布尔数组索引