WinRM 是什么
WinRM 是 Windows 上的 WS-Management 实现:一个基于 SOAP over HTTP 的远程管理协议,PowerShell Remoting、Ansible 的 winrm 连接插件、SCVMM 都靠它把命令送到远端主机。5985 是它的默认 HTTP 监听端口,HTTPS 形态走 5986。执行 Enable-PSRemoting 会同时启动服务、配置侦听器并创建防火墙入站规则。
基本信息
| 服务 | WinRM / WS-Management(HTTP) |
|---|---|
| 协议 | TCP(5985 HTTP;5986 HTTPS) |
| 默认认证 | 域内 Kerberos,工作组 NTLM |
| 适用平台 | Windows Server 2012 及以上、Windows 10/11 |
| 安全等级 | 仅管理网段,禁止公网暴露 |
典型使用场景
- 批量执行:Invoke-Command 对多台主机同时跑脚本并收集结果
- 跨系统自动化:Ansible、Jenkins、CI/CD 用 WinRM 连接 Windows 节点
- 域内运维:Enter-PSSession 建立交互式远程会话排障
- 配置管理:DSC、SCVMM 通过 WS-Management 下发配置与采集状态
- 排查连通性:Test-WSMan 快速判断服务与协议栈是否正常应答
连通与会话测试
连通与会话测试
Test-NetConnection server01 -Port 5985 # 先确认 TCP 可达
Test-WSMan -ComputerName server01 # 再看协议栈是否应答
Enter-PSSession server01
Invoke-Command -ComputerName srv01,srv02 -ScriptBlock { $env:COMPUTERNAME }
netsh winhttp show proxy # 排除代理干扰5985 没有传输层加密:使用 Basic 认证时凭据几乎等同明文,即便 Kerberos/NTLM 在报文层做了保护,跨不可信网段也应启用 5986 或改用 SSH。
信任主机与侦听检查
信任主机与侦听检查
Set-Item WSMan:\localhost\Client\TrustedHosts -Value '10.0.0.21,10.0.0.22' -Force
Get-ChildItem WSMan:\localhost\Client\TrustedHosts
winrm enumerate winrm/config/listener
Get-Service WinRM | Select-Object Status,StartType
Enable-PSRemoting -Force -SkipNetworkProfileCheck常见故障排查对照
| 现象 | 常见原因 | 处置方向 |
|---|---|---|
| Test-WSMan 超时 | 防火墙未放行或 WinRM 服务未启动 | Get-Service WinRM;Test-NetConnection 5985;核对入站规则 |
| Access is denied | 凭据未显式传递或 TrustedHosts 缺失 | Enter-PSSession -Credential;工作组配 TrustedHosts 或改用 5986 |
| 脚本报 proxy 相关错误 | WinHTTP 代理拦截内网目标 | netsh winhttp show proxy 检查,必要时 reset |
| Ansible 连接失败 | 端口与 scheme 配置不一致 | ansible_port 与 ansible_winrm_scheme 成对匹配 |
排查次序:TCP 可达(Test-NetConnection)→ WS-Management 应答(Test-WSMan)→ 会话建立(Enter-PSSession)→ 凭据与授权,逐层定位比直接读报错文本更快收敛;域环境优先用 Kerberos,避免为省事关掉认证。
批量运维环境建议用组策略统一下发侦听器与客户端信任设置(WinRM 服务与 WinRM 客户端两个策略节点),比逐台执行命令更容易审计,也避免遗留手工配置。
加固与运维建议
- 用组策略统一配置侦听器、认证方式与客户端信任,减少逐台操作
- 能走 Kerberos 就不用 NTLM,能上 5986 就不用明文 5985
- 把访问限制在管理网段,由跳板机发起,而不是从办公终端直连
- 定期核对侦听器与防火墙规则,确认没有为了临时排障遗留的放宽项