[Powershell 入门教程]】第5天内容:远程管理(WinRM、SSH)、PSSession 与 CIM/WMI
本教程专为已有编程基础的学习者设计,强调实战、安全与底层原理,并结合官方文档(Microsoft Learn)进行中文整合。
📅 第5天:远程管理 —— WinRM、SSH、PSSession 与 CIM/WMI
🎯 学习目标
- 理解 PowerShell 远程管理的两种核心协议:WinRM(Windows 原生)与 SSH(跨平台)
- 掌握
Enter-PSSession(交互式)与Invoke-Command(批量执行)的使用 - 学会创建和管理持久化远程会话(
New-PSSession) - 理解 CIM/WMI 的作用,并能通过远程方式查询系统信息
- 能在混合环境(Windows/Linux)中统一管理
一、PowerShell 远程管理基础
PowerShell 支持两种远程通信协议:
| 协议 | 适用系统 | 默认端口 | 特点 |
|---|---|---|---|
| WinRM(Windows Remote Management) | Windows(需启用) | HTTP: 5985 HTTPS: 5986 | 基于 WS-Management,集成 AD,企业级首选 |
| SSH | Windows(需安装 OpenSSH) Linux/macOS(原生支持) | 22 | 跨平台、加密强、防火墙友好 |
💡 从 PowerShell 6.0+(即 PowerShell Core)开始,SSH 成为跨平台远程标准。
二、使用 WinRM 进行远程管理(Windows)
1. 在目标机器上启用 WinRM(以管理员身份运行)
# 快速配置(开发/测试环境)
Enable-PSRemoting -Force# 或手动配置
winrm quickconfig✅ 此命令会:
- 启动 WinRM 服务
- 设置启动类型为自动
- 创建防火墙规则
- 允许本地和远程连接
2. 从本地连接远程 Windows 主机
方式A:交互式会话(类似 SSH 登录)
Enter-PSSession -ComputerName SRV01 -Credential (Get-Credential)- 输入后进入
[SRV01]: PS C:\>提示符 - 所有命令在远程执行
- 输入
exit退出
方式B:单次命令执行(适合自动化)
Invoke-Command -ComputerName SRV01 -ScriptBlock {Get-Service Spooler | Select-Object Name, Status
} -Credential (Get-Credential)方式C:批量操作多台主机
$servers = "SRV01", "SRV02", "SRV03"
Invoke-Command -ComputerName $servers -ScriptBlock {[PSCustomObject]@{Computer = $env:COMPUTERNAMEUptime = (Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime}
} -Credential (Get-Credential)🔍 注意:
$env:COMPUTERNAME在远程上下文中返回的是远程主机名。
三、使用 SSH 进行跨平台远程管理
1. 在 Windows 上安装 OpenSSH(Windows 10/11 或 Server 2019+)
# 安装 SSH 客户端和服务器(可选)
Add-WindowsCapability -Online -Name OpenSSH.Client
Add-WindowsCapability -Online -Name OpenSSH.Server# 启动 SSH 服务
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'✅ Linux/macOS 通常已预装 SSH 服务。
2. 使用 SSH 连接远程主机(PowerShell 6+)
# 连接到 Linux
Enter-PSSession -HostName ubuntu01 -UserName XXX-SSHTransport# 连接到 Windows(需已安装 PowerShell + SSH Server)
Enter-PSSession -HostName XXXX.com -UserName XXXX -SSHTransport⚠️ 要求:
- 远程主机必须运行 PowerShell Core(pwsh)
- SSH 服务已配置允许 PowerShell 作为 shell(通过
sshd_config设置Subsystem powershell pwsh -sshs)
四、持久化远程会话(PSSession)
对于频繁操作同一台主机,建议使用 持久化会话,避免重复认证开销。
# 创建会话
$session = New-PSSession -ComputerName SRV01 -Credential (Get-Credential)# 在会话中执行多个命令
Invoke-Command -Session $session -ScriptBlock { Get-Process }
Invoke-Command -Session $session -ScriptBlock { Get-Service }# 复制文件到远程(PowerShell 5.0+)
Copy-Item -Path .\config.txt -Destination C:\Temp\ -ToSession $session# 最后清理
Remove-PSSession -Session $session✅ 优势:会话复用、支持文件传输、适合长时间任务。
五、CIM 与 WMI:深入系统底层
1. WMI vs CIM
| WMI(旧) | CIM(新) | |
|---|---|---|
| 协议 | DCOM | WS-Man(WinRM)或 DCOM |
| 跨平台 | ❌ 仅 Windows | ✅(通过 WinRM) |
| PowerShell cmdlet | Get-WmiObject(已弃用) | Get-CimInstance(推荐) |
📌 微软官方建议:新脚本一律使用 CIM。
2. 本地查询硬件信息(CIM 示例)
# 获取操作系统信息
Get-CimInstance -ClassName Win32_OperatingSystem# 获取磁盘信息
Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3"# 获取 BIOS 信息
Get-CimInstance -ClassName Win32_BIOS3. 远程查询 CIM 数据
# 通过 WinRM 远程获取内存信息
Get-CimInstance -ClassName Win32_PhysicalMemory -ComputerName SRV01 -Credential (Get-Credential)💡 底层原理:CIM 使用 WS-Management 协议,与 PowerShell 远程共享同一基础设施(WinRM)。
六、动手实践:综合远程管理任务
场景:检查多台服务器的服务状态并生成报告
$servers = "web01", "db01", "app01"
$cred = Get-Credential "CONTOSO\admin"$results = Invoke-Command -ComputerName $servers -Credential $cred -ScriptBlock {$svc = Get-Service -Name Spooler[PSCustomObject]@{Host = $env:COMPUTERNAMEService = $svc.NameStatus = $svc.StatusStartType = $svc.StartTypeTimestamp = Get-Date}
}# 本地格式化输出
$results | Sort-Object Host | Format-Table -AutoSize扩展:将结果导出为 CSV
$results | Export-Csv -Path ".\ServiceReport.csv" -NoTypeInformation七、安全与故障排查
常见问题与解决:
| 问题 | 解决方案 |
|---|---|
| “访问被拒绝” | 检查凭据、目标机是否启用 WinRM、防火墙是否放行 5985 |
| “RPC 服务器不可用” | 目标机 WinRM 未启动,运行 winrm quickconfig |
| SSH 连接失败 | 确保远程主机运行 pwsh,且 sshd 配置了 PowerShell 子系统 |
| 双跳(Double-hop)问题 | 使用 CredSSP 或 Kerberos 委派(高级主题) |
安全建议:
- 生产环境优先使用 HTTPS(5986) 或 SSH
- 避免在脚本中硬编码密码,使用
$PSCredential或 Azure Key Vault - 限制远程用户权限(最小权限原则)
八、今日重点总结
- ✅ WinRM 是 Windows 企业远程管理的标准,SSH 是跨平台未来。
- ✅
Enter-PSSession用于交互,Invoke-Command用于自动化。 - ✅ 持久化 PSSession 提升效率,支持文件传输。
- ✅ CIM(
Get-CimInstance) 是查询系统信息的现代方式,支持远程。 - ✅ PowerShell 远程本质是 对象在跨网络流动,保持本地体验。
📚 参考资料(Microsoft Learn)
- About PowerShell Remoting
- Using SSH Transport in PowerShell
- CIM Cmdlets
- WinRM Security
🏁 课后作业
- 在你的本地 Windows 机器上启用 WinRM,并尝试用
Enter-PSSession连接到localhost。 - 编写一个脚本:使用
Invoke-Command远程获取两台(或模拟两台)主机的磁盘使用率(C 盘),结果包含主机名和剩余空间(GB)。 - 使用
Get-CimInstance查询本地计算机的主板型号(Win32_BaseBoard类),并思考:如果目标机是 Linux,能否用 CIM 查询?为什么?
