1.6 启用WinRM

第一部分 概述
1.1 WinRM 是什么?能干什么?
WinRM(Windows Remote Management) 是微软实现的一套远程管理协议,基于 WS-Management(WS-MAN) 标准,采用 SOAP/HTTP(S) 作为传输载体。
主要用途:在远程 Windows 主机上执行命令、运行脚本、收集信息、管理配置、以及作为 PowerShell Remoting(PowerShell 远程) 的底层传输通道。
优点:与 Windows 生态深度集成、支持多种认证(Kerberos/NTLM/证书/Basic 等)、可以用于脚本化与编程调用。
常见场景:自动化运维、批量执行命令、远程故障诊断、配置管理与监控集成。
1.2 基本概念与术语
WS-Management / WS-MAN:一个基于 Web 服务(SOAP/XML)的标准,定义了发现、枚举、读取/写入资源、执行远程命令等操作。
Listener(监听器):服务器端绑定的端点,常见有 HTTP(默认端口 5985)和 HTTPS(默认端口 5986)两类监听器。
Shell / Session:WinRM 提供“远程 Shell”模型,客户端可以创建一个 shell/session 在服务器上,后续在该 session 中执行多个命令(避免每次建立握手)。
Resource URI:通过 URI 指定要操作的资源(例如 shell、操作系统信息等),WS-MAN 操作通常对资源 URI 发起 SOAP 请求。
操作类型:Identify、Enumerate、Pull、Create(如创建 shell)、Invoke(执行操作/命令)等。
认证/委派:Kerberos(域内最佳)、NTLM(常见本地认证)、证书(HTTPS)、Basic(仅在 HTTPS 下使用或测试)。
1.3 工作原理
建立连接:客户端向目标主机的 WinRM 监听器发送 HTTP/HTTPS 的 SOAP 请求(Identify/Authenticate)。
认证与授权:服务器根据请求的认证信息(Kerberos/NTLM/证书等)进行验证,决定是否允许后续操作。
创建 Session/Shell:若需要执行多个命令,可先 Create 一个 shell/session(持久化上下文),随后通过该 session Invoke 命令。
执行与返回:服务器在 shell 中执行命令,将标准输出/错误通过 SOAP 消息分片返回(可能会有流式或分块)。
结束/清理:执行完成后可以 Delete shell,释放资源。
1.4 常见的交互方式与工具
1.4.1 Windows 自带工具
Enable-PSRemoting -Force(PowerShell):启用 PowerShell 远程和 WinRM 的常用配置(创建 listener、打开防火墙规则等)。
winrm quickconfig:快速配置 WinRM 服务(创建 listener、启用服务、打开防火墙规则)。
Test-WSMan -ComputerName
Enter-PSSession -ComputerName
Invoke-Command -ComputerName
New-PSSession / Invoke-Command -Session:创建持久会话并复用,提高性能。
1.4.2 命令行 WinRM 客户端
winrs:Windows 的 WinRM 命令行工具(可执行远程命令;功能相对简单)。
winrm:配置与查询 WinRM 服务的命令行工具(例如 winrm e winrm/config/listener 列出监听器)。
1.4.3 编程库与第三方(常用于自动化/集成)
这些库一般封装了 WS-MAN 的 SOAP 细节,使用更方便。
Python:pywinrm。
Java:winrm4j 等开源库(用于在 Java 应用中远程执行命令)。
.NET / PowerShell SDK:用于深度集成与管理
1.5 WinRM 支持的认证方式
认证方式特点安全性使用场景Basic用户名和密码以明文 Base64 发送低(必须配合 HTTPS,否则等于明文传输)简单快速,测试环境、自签名证书场景Digest使用质询-响应机制,密码不会明文传输中(比 Basic 安全,但已过时)很少使用,兼容性差NTLMWindows 内置的挑战/响应协议,不需要明文密码中(比 Basic 强,但存在中继攻击风险)域外或工作组环境常用Kerberos基于票据的认证(需 KDC/AD 域环境),无需发送密码高(企业常用,强安全性)企业域环境,大规模管理CredSSP支持凭据委派(客户端凭据转发到远端执行)高(可做二次跳转),但存在凭据泄露风险需要跨跳远程执行时NegotiateWindows 自动选择 Kerberos 或 NTLM取决于底层选择一般推荐(兼容性好)
1.5.1 详细说明
Basic
优点:实现简单,跨平台容易(Linux/Java/非域环境也能用)。
缺点:在 HTTP 下几乎等于明文传输,必须配合 HTTPS 才安全。
适用:临时、测试、非域环境。
Digest
优点:不会直接传输密码。
缺点:协议复杂、很少启用,微软也不再推荐。
适用:基本淘汰。
NTLM
优点:不需明文密码,支持挑战-响应。
缺点:存在安全漏洞(如 NTLM Relay 攻击),且只适合单跳访问。
适用:非域环境(工作组)常用。
Kerberos
优点:最安全(不传输密码,基于票据机制),可防止中间人攻击。
缺点:需要域控制器(AD/KDC),配置较复杂。
适用:企业 AD 域环境。
CredSSP
优点:支持“凭据委派”,即在远程主机上再远程(第二跳)。
缺点:凭据会传到远端内存,存在泄露风险。
适用:需要跳板机的场景(例如 Win → Win → SQL)。
Negotiate
优点:自动选择 Kerberos(优先)或 NTLM(备用),对用户透明。
缺点:如果 Kerberos 环境没配置好,可能会回退到 NTLM。
适用:推荐默认选择,适合企业和普通环境。
1.5.2 总结推荐
测试/快速接入:Basic + HTTPS(最简单,跨平台无脑可用)。
工作组环境:NTLM(不用配置域)。
企业域环境:Negotiate(自动 Kerberos/NTLM,推荐)。
1.6 启用WinRM
以 管理员身份 打开 PowerShell,执行:
bash# 1. 启用 WinRM 服务
winrm quickconfig -force
# 2. 启用 Basic 认证(方便跨平台调用,例如 Java、Python 客户端)
winrm set winrm/config/service/auth '@{Basic="true"}'
# 3. 允许未加密会话(仅测试用,生产环境建议配置 HTTPS)
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
# 4. 放行防火墙 5985 端口(HTTP)
netsh advfirewall firewall add rule name="WinRM HTTP" dir=in action=allow protocol=TCP localport=5985
第二部分 操作示例
2.1 引入winrm4j库
xml
2.2 测试代码
javaimport io.cloudsoft.winrm4j.winrm.WinRmTool;
import io.cloudsoft.winrm4j.winrm.WinRmToolResponse;
import org.apache.http.client.config.AuthSchemes;
import org.junit.jupiter.api.Test;
public class WinRMTest {
private String host = "xxx"; // 目标主机名或IP
private String user = "Administrator";
private String password = "xxx";
@Test
public void testWinRM() throws Exception {
WinRmTool tool = WinRmTool.Builder.builder(host, user, password)
.port(5985) // WinRM 默认端口: HTTP 5985 / HTTPS 5986
.useHttps(false).authenticationScheme(AuthSchemes.NTLM).disableCertificateChecks(true).build();
// 获取系统信息
String[] commands = { "wmic os get Caption,OSArchitecture",
"wmic cpu get Name,NumberOfCores,NumberOfLogicalProcessors",
"wmic memorychip get Capacity,Manufacturer" };
for (String cmd : commands) {
WinRmToolResponse response = tool.executeCommand(cmd);
System.out.println("命令: " + cmd);
System.out.println(response.getStdOut());
}
}
}
提示
实际使用中若涉及到中文需要注意中文乱码