1.6 启用WinRM

分类: 365bet现金网 时间: 2025-10-04 17:06:37 作者: admin 阅读: 1771
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 :测试目标主机 WinRM 服务是否可达并查看返回信息。

Enter-PSSession -ComputerName -Credential :交互式远程会话(像 SSH 的 shell)。

Invoke-Command -ComputerName -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

io.cloudsoft.windows

winrm4j

0.12.3

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());

}

}

}

提示

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

相关推荐