版本信息最后核对:2026-10-25
启用、加固并排查 Windows 远程管理(WinRM)与 PowerShell Remoting。
WinRM 是 Windows 对 WS-Management 的实现。Windows 上的 PowerShell Remoting(Invoke-Command、Enter-PSSession、New-PSSession)默认通过 WinRM 传输;PowerShell 7 也支持 SSH 传输,但两者不是同一套配置。排查远程执行失败时,按“服务是否运行 → 监听器是否存在 → 防火墙是否放行 → 认证是否成功 → 账户是否获授权”的顺序逐层确认,比反复修改 TrustedHosts 有效。
HTTP 监听默认使用 5985/TCP,HTTPS 默认使用 5986/TCP;具体以 winrm enumerate winrm/config/listener 的本机输出为准。Enable-PSRemoting 会启动 WinRM、把启动类型设为自动、创建监听器、启用防火墙规则并开放会话配置;它只需在接收命令的一端执行。Windows Server 通常已启用 Remoting,客户端和工作组机器往往需要手动开启;客户端处于公用网络时默认会被拒绝,除非显式跳过网络配置文件检查。
认证方式决定安全边界。域环境优先 Kerberos;HTTPS 监听使用计算机证书提供服务器身份和传输加密,客户端证书认证需要单独配置,不能只靠监听器;NTLM 常见于工作组,但需要客户端把目标列入 TrustedHosts。TrustedHosts 只是客户端“允许把当前凭据发给哪些非域主机”的名单,它不认证对端、不校验身份。把它设为 * 等于放弃这层限制。生产环境应优先域加 Kerberos 或 HTTPS,不要随意修改 TrustedHosts;确需修改时只写具体主机,记录原值,并在变更窗口内操作。
跨机器再次跳转(double-hop)时,不要为了省事全局启用 CredSSP。CredSSP 会把凭据委派到目标机,扩大凭据暴露面;优先使用资源型约束委派、在目标机安排本地任务,或用 JEA 限制可执行命令和参数。HTTPS 解决传输与对端认证,不自动解决第二跳授权。
WinRM 的授权不只看 Administrators 组。会话配置决定哪些账户可以连接、连接后以什么身份运行、能加载哪些模块;JEA 端点还可以限制可执行命令和参数。排查“能连上但命令失败”时,要同时看会话配置权限、目标端的执行策略和日志。Microsoft-Windows-WinRM/Operational 记录监听器、认证和连接错误,PowerShell 操作日志则能补充会话建立后的活动;日志可能包含主机名、账号和命令参数,外发前要脱敏。
# 1. 只读基线:服务、监听器、客户端配置
C:\> sc query WinRM
C:\> winrm enumerate winrm/config/listener
C:\> winrm get winrm/config/client
# 2. 在实验机或新装机上启用默认 HTTP 监听
# 影响范围:启动 WinRM、创建监听器并放行防火墙;域内生产机应先用 GPO 评估现状
# 备份/回滚:记录原有启动类型和监听器;回滚可 Disable-PSRemoting,必要时删除新建监听器
C:\> winrm quickconfig
# 3. PowerShell 方式启用;公用网络上的客户端默认会被拒绝
PS C:\> Enable-PSRemoting -Force
# 4. 从客户端验证端口、WS-Man 和实际身份,三步缺一不可
PS C:\> Test-NetConnection dc01.contoso.com -Port 5985
PS C:\> Test-WSMan dc01.contoso.com
PS C:\> Invoke-Command -ComputerName dc01.contoso.com -ScriptBlock { hostname; whoami }
# 5. 域内显式使用 Kerberos;跨林或工作组再评估 Negotiate/NTLM
PS C:\> Enter-PSSession -ComputerName dc01.contoso.com -Authentication Kerberos
# 6. 查看 HTTPS 监听与服务配置;5986 是默认 HTTPS 端口
C:\> winrm enumerate winrm/config/listener
C:\> winrm get winrm/config/service
# 7. 新增 HTTPS 监听:证书需匹配主机名且受客户端信任
# 影响范围:新增 5986 监听器,证书错误会导致所有客户端连接失败
# 备份/回滚:记录现有监听器;回滚删除该 HTTPS 监听器并复核 HTTP 入口仍可用
PS C:\> Get-ChildItem Cert:\LocalMachine\My | Select-Object Subject, Thumbprint, NotAfter
PS C:\> New-WSManInstance -ResourceURI winrm/config/Listener -SelectorSet @{Address='*';Transport='HTTPS'} -ValueSet @{Hostname='dc01.contoso.com';CertificateThumbprint='<证书指纹>'}
# 8. 工作组临时放行单台主机(仅实验环境)
# 影响范围:允许向该主机发送当前凭据,仍依赖 NTLM,不提供对端身份保证
# 备份/回滚:先保存原值;回滚恢复原值(原值为空时改用 Clear-Item),不要无条件清空
PS C:\> $old = (Get-Item WSMan:\localhost\Client\TrustedHosts).Value
PS C:\> Set-Item WSMan:\localhost\Client\TrustedHosts -Value 'lab01'
PS C:\> if ($old) { Set-Item WSMan:\localhost\Client\TrustedHosts -Value $old } else { Clear-Item WSMan:\localhost\Client\TrustedHosts }
# 9. 防火墙核对;规则名随系统版本不同,以实际枚举结果为准
PS C:\> Get-NetFirewallRule -Name 'WINRM*' | Select-Object Name, Enabled, Profile
PS C:\> Enable-NetFirewallRule -Name 'WINRM-HTTP-In-TCP'
# 10. 清理实验配置
# 影响范围:关闭远程 PowerShell 会话入口,不影响本机其他服务
# 备份/回滚:确认无自动化依赖后执行;需要时重新启用并验证监听器
PS C:\> Disable-PSRemoting -Force
*。sc query WinRM、winrm enumerate winrm/config/listener、Test-NetConnection 的 5985/5986 和防火墙规则,不要先改认证。-SkipNetworkProfileCheck 只适合隔离实验环境,不能在不可信网络使用。gpresult 确认来源,改 GPO 或申请例外,不要和策略反复对抗。Test-WSMan,再确认 host\user 或 .\user 的格式,以及目标是本地账户还是域账户。*?Test-WSMan 也成功,但 Invoke-Command 返回拒绝访问,应先查什么?* 会让客户端向任意主机发送凭据,扩大中间人攻击和凭据泄露风险。应优先域加 Kerberos 或 HTTPS,必须放行时只写具体主机并记录原值。
小程序版
微信扫码,随时查命令