第13章《远程处理:一对一及一对多》——PowerShell Remoting 学习笔记
第13章《远程处理:一对一及一对多》——PowerShell Remoting 学习笔记(高分版)
目标:把远程处理(Remoting)的底层原理、常见命令、最佳实践与坑点一次讲透,能在真实环境里稳妥落地。
文章目录
- 第13章《远程处理:一对一及一对多》——PowerShell Remoting 学习笔记(高分版)
- 1. 概念速览
- 2. 准备与启用
- 2.1 远端机上启用 Remoting(以管理员运行)
- 2.2 环境前提
- 3. 1:1 远程:登录一台机子像本地敲命令
- 4. 1\:n 远程:同一命令同时分发多台
- 4.1 基本用法
- 4.2 从文件/AD 批量取主机名
- 4.3 远端执行 vs 本地执行:**大括号位置决定效率与正确性**
- 4.4 传脚本文件
- 5. `-ComputerName` 参数 与 Remoting 的区别
- 6. 常见坑 & 排错清单
- 7. 常用脚本模板(抄走即用)
- 7.1 一次性启用远程(管理员)
- 7.2 1:1 快速诊断
- 7.3 多机:查询停止的服务(本地再格式化)
- 7.4 多机:Top10 虚拟内存进程(远端排序/截取)
- 7.5 多机:抓取应用日志 100 条
- 7.6 多机:注册表读取(项属性)
- 8. 进阶与安全
- 9. 记忆卡(一句话原则)
1. 概念速览
-
远程处理(Remoting):让命令在远端执行,只把结果回传本机。
-
协议/组件:WS-MAN(HTTP/HTTPS) ←→ WinRM 服务(Listener + Endpoint)。
-
对象传输:远端对象会序列化为 XML 传回,本机再反序列化成“去方法的快照对象”(Deserialized…);所以操作类指令要在远端完成。
-
两种模式:
- 1:1 交互会话:
Enter-PSSession
/Exit-PSSession
- 1:n 分布式执行:
Invoke-Command -ComputerName A,B,C -ScriptBlock { … }
(默认并发 32)
- 1:1 交互会话:
2. 准备与启用
2.1 远端机上启用 Remoting(以管理员运行)
Enable-PSRemoting
# 做了什么:启动/设为自动 WinRM、创建 Listener、打通防火墙(5985 HTTP,5986 HTTPS)
提示
- 服务器版系统默认更友好;客户端若网卡是“公用网络”会阻止防火墙规则,需改为“专用/工作网络”。
- 统一开通推荐用 GPO(WinRM / Windows Remote Shell 模板)。
- 保持默认端口最省心;改端口就要处处显式指定。
2.2 环境前提
- 本机/远端 PowerShell ≥ v2;域内或可信域最佳。非域环境可行但要额外配置(详见
about_Remote_Troubleshooting
)。 - 首次连接用主机名,默认不接受 IP / DNS 别名(SPN/信任问题,后续可通过配置放开)。
3. 1:1 远程:登录一台机子像本地敲命令
Enter-PSSession -ComputerName Server01
# [Server01] PS C:\> ← 提示符变了,表示在远端执行
Exit-PSSession
注意
- 会话内执行就像站在远端主机的控制台;Profile 脚本默认不自动执行。
- 不要链式远程(远程里再
Enter-PSSession
到第三台)——难追踪且开销大。 - 需要自定义超时/证书检查等细节,可用:
Enter-PSSession -ComputerName Server01 -SessionOption (New-PSSessionOption -SkipCNCheck)
4. 1:n 远程:同一命令同时分发多台
4.1 基本用法
Invoke-Command -ComputerName Server01,Server02 `-ScriptBlock { Get-EventLog -LogName Security -Newest 200 | Where-Object EventID -eq 1212 }
- 并发执行(默认 32,可用
-ThrottleLimit
调整)。 - 结果带
PSComputerName
字段,可一眼看出来源主机。 - 把筛选放在远端,减少网络回传量。
4.2 从文件/AD 批量取主机名
# 从文本文件逐行读取主机名
Invoke-Command -ComputerName (Get-Content .\servers.txt) -ScriptBlock { hostname }# 从 AD OU 获取主机名(关键:只传“名字”而不是对象)
Invoke-Command -ComputerName (Get-ADComputer -Filter * -SearchBase "OU=Sales,DC=company,DC=pri" |Select-Object -ExpandProperty Name
) -ScriptBlock { Get-Process }
4.3 远端执行 vs 本地执行:大括号位置决定效率与正确性
- ✅ 正确(在远端完成“取+改”):
Invoke-Command -ComputerName Server01 -ScriptBlock {Get-Process -Name notepad | Stop-Process
}
- ❌ 错误(把对象拿回本地再改):
反序列化对象没有方法,且可能错杀本地进程:
Invoke-Command -ComputerName Server01 -ScriptBlock { Get-Process -Name notepad } | Stop-Process
原则:能在远端完成的计算/筛选/操作,都放远端;本地只做显示/导出。
4.4 传脚本文件
Invoke-Command -ComputerName Server01,Server02 -FilePath .\Do-Something.ps1
5. -ComputerName
参数 与 Remoting 的区别
以事件日志查询为例:
-
Get-EventLog -ComputerName A,B,C | Where-Object …
- 串行连接;不一定走 WinRM;结果可能不带来源字段;可能被防火墙拦。
-
Invoke-Command -ComputerName A,B,C -ScriptBlock { Get-EventLog … | Where-Object … }
- 并发;走 WinRM 5985/5986;带 PSComputerName;先远端筛选再回传,更高效。
6. 常见坑 & 排错清单
- 对象被“去方法”:远端回来的对象是 Deserialized,没有方法。操作类命令要在远端 ScriptBlock 内完成。
- 把
Format-*
放进 ScriptBlock:No!格式化只影响显示,放本地末端即可。 - IP/别名连接失败:默认需用主机名;别名/IP 要额外信任配置(见
about_Remote_Troubleshooting
)。 - UAC/权限:最好用管理员 PowerShell;或在命令上加
-Credential
。 - 第三方防火墙:
Enable-PSRemoting
只会改 Windows 防火墙;第三方需要手工放行 5985/5986。 - GPO 覆盖:组策略可能改写你的本地 WinRM 设置,先查 GPO。
- 网络类型“公用”:客户端“公用网络”会挡规则,改“专用/工作网络”。
- 链式远程:尽量避免。
- 性能:大量主机时调
-ThrottleLimit
;优先远端过滤,减少回传。
7. 常用脚本模板(抄走即用)
7.1 一次性启用远程(管理员)
Enable-PSRemoting -Force
7.2 1:1 快速诊断
Enter-PSSession -ComputerName Server01
hostname
Exit-PSSession
7.3 多机:查询停止的服务(本地再格式化)
Invoke-Command -ComputerName (Get-Content .\servers.txt) -ScriptBlock {Get-Service | Where-Object Status -eq 'Stopped'
} | Format-Wide -Column 4
7.4 多机:Top10 虚拟内存进程(远端排序/截取)
Invoke-Command -ComputerName Server01,Server02 -ScriptBlock {Get-Process | Sort-Object VM -Descending | Select-Object -First 10
}
7.5 多机:抓取应用日志 100 条
Invoke-Command -ComputerName (Get-Content .\computers.txt) -ScriptBlock {Get-EventLog -LogName Application -Newest 100
}
7.6 多机:注册表读取(项属性)
Invoke-Command -ComputerName Server01,Server02 -ScriptBlock {Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\' |Select-Object ProductName, EditionID, CurrentVersion
}
8. 进阶与安全
- 会话细节:
New-PSSessionOption
(超时、压缩、证书检查等);-SessionOption
。 - 持久会话池、跨命令复用:见后续章节(
New-PSSession
/Invoke-Command -Session
)。 - 严格安全环境:和安全团队沟通 WinRM 风险等级≈RDP、可审计、占用更小。
- 了解 SSH Remoting(新路径,命令习惯相同,底层协议不同)。
9. 记忆卡(一句话原则)
- 能在远端做的,都放远端(获取→过滤→操作→回传最少数据)。
- 序列化对象无方法,操作务必在 ScriptBlock 内完成。
- 格式化永远放最右(在本地显示层做)。
- 用主机名、开 WinRM、看 GPO、管理员身份、先试 -WhatIf/小范围。
- 并发默认 32,
-ThrottleLimit
可调。