第13章《远程处理:一对一及一对多》——PowerShell Remoting 学习笔记

发布于:2025-08-18 ⋅ 阅读:(14) ⋅ 点赞:(0)

第13章《远程处理:一对一及一对多》——PowerShell Remoting 学习笔记(高分版)

目标:把远程处理(Remoting)的底层原理、常见命令、最佳实践与坑点一次讲透,能在真实环境里稳妥落地。


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)

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 可调


网站公告

今日签到

点亮在社区的每一天
去签到