说明:为什么使用winrm?
在Linux /UNIX/WINDOWS系统中,一般通过远程连接的方式在远端执行脚本命令或者其他,是通过SSH或者Telnet。笔者之前写过几遍运用JAVA使用SSH或者TELNET连接操作系统执行命令的博客。但这些协议之间存在的差别的。
在LINUX、UNIX系统中一般通过SSH协议来登录、执行命令;
而在Windows操作系统中,由于没有自带SSH协议,一般通过Telnet协议去登录、执行命令;但是Telnet服务默认是不开启的。所以在大规模环境中,操作比较麻烦。另外Telnet协议存在安全问题。
如果不需要执行命令,而是通过远程桌面的形式来操作windows,可以使用RDP协议,java有一个开源的项目properJavaRDP,可以在web页面或者GUI形式提供实现方案。
接回本题:
Windows远程管理(WinRM)
Server2008R2中默认开启该服务,从Server2012开始,该服务便集成在系统中默认开启,Win7默认安装此服务,但是默认为禁用状态,Win8,Win10默认开启。
所以可以通过这种winrm来实现。
winrm4j
maven导入
io.cloudsoft.windows
winrm4j
0.5.0
测试代码:
package com.test;
import org.apache.http.client.config.AuthSchemes;
import io.cloudsoft.winrm4j.client.WinRmClientContext;
import io.cloudsoft.winrm4j.winrm.WinRmTool;
import io.cloudsoft.winrm4j.winrm.WinRmToolResponse;
public class RemoteWinrm4JTest {
public static void main(String[] args) {
WinRmClientContext context = WinRmClientContext.newInstance();
WinRmTool.Builder builder = WinRmTool.Builder.builder("ip", "username", "password");
builder.setAuthenticationScheme(AuthSchemes.NTLM);
builder.port(5985);
builder.useHttps(false);
builder.context(context);
WinRmTool tool = builder.build();
tool.setOperationTimeout(5000L);
System.out.println("========");
String command = "dir";
WinRmToolResponse resp = tool.executeCommand(command);
System.out.println(resp.getStatusCode());
String out = resp.getStdOut();
System.out.println(out);
context.shutdown();
}
}
遇到问题及解决:
服务端winrm修改设置:
winrm set winrm/config/service '@{AllowUnencrypted="true"}'