2025-09-15
杂谈
00

目录

第一部分概述
1.1 WinRM 是什么?能干什么?
1.2 基本概念与术语
1.3 工作原理
1.4 常见的交互方式与工具
1.4.1 Windows 自带工具
1.4.2 命令行 WinRM 客户端
1.4.3 编程库与第三方(常用于自动化/集成)
1.5 WinRM 支持的认证方式
1.5.1 详细说明
1.5.2 总结推荐
1.6 启用WinRM
第二部分 操作示例
2.1 引入winrm4j库
2.2 测试代码

第一部分概述

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/HTTPSSOAP 请求(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 <host>:测试目标主机 WinRM 服务是否可达并查看返回信息。
  • Enter-PSSession -ComputerName <host> -Credential <cred>:交互式远程会话(像 SSH 的 shell)。
  • Invoke-Command -ComputerName <host> -ScriptBlock { ... }:在远程主机执行命令或脚本(可在多主机上并行)。
  • 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
<!-- https://mvnrepository.com/artifact/io.cloudsoft.windows/winrm4j --> <dependency> <groupId>io.cloudsoft.windows</groupId> <artifactId>winrm4j</artifactId> <version>0.12.3</version> </dependency>

2.2 测试代码

java
import 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()); } } }

提示

实际使用中若涉及到中文需要注意中文乱码

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:蒋固金

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!