You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中通过SMBClient执行远程服务器上的命令及Bat文件

用SMBClient连接后执行远程服务器上的Bat文件方法

SMBClient(此处指jcifs-ng这类Java SMB客户端库)本身仅用于SMB文件共享操作,无法直接执行远程命令。要运行远程服务器上的Bat文件,需要结合Windows的远程执行机制,以下是两种可行方案:

方案1:SMB上传Bat + WMI远程执行

先通过SMBClient将Bat文件上传至远程服务器的共享目录,再借助WMI调用系统API执行Bat文件。

1.1 上传Bat文件到远程共享

基于你已有的SMB Session对象,添加文件上传逻辑:

// 访问远程服务器的C盘默认共享(需确保账号有权限)
SMBFile remoteTempDir = new SMBFile(session, "smb://SERVERNAME/C$/Temp/");
if (!remoteTempDir.exists()) {
    remoteTempDir.mkdirs(); // 创建临时目录
}

// 上传本地Bat文件到远程目录
SMBFile remoteBatFile = new SMBFile(session, "smb://SERVERNAME/C$/Temp/script.bat");
try (OutputStream outputStream = remoteBatFile.getOutputStream()) {
    // 替换为本地Bat文件的路径
    Files.copy(Paths.get("D:\\local-scripts\\demo.bat"), outputStream);
} catch (IOException e) {
    e.printStackTrace();
}

1.2 用WMI执行远程Bat

引入Java WMI客户端库(如jInterop、wbemclient),调用Win32_Process.Create方法启动Bat:

// 初始化WMI客户端并连接远程服务器
WbemClient wbemClient = WbemClientFactory.createWbemClient();
WbemContext context = new WbemContext();
wbemClient.connect(context, "SERVERNAME", "USERNAME", "PASSWORD", "DOMAIN");

// 获取Win32_Process类对象,调用Create方法执行Bat
WbemObject processClass = wbemClient.getObject("Win32_Process");
// 参数依次为:命令行、工作目录、进程属性、创建标志
Object[] invokeParams = new Object[]{"C:\\Temp\\script.bat", null, null, 0};
Integer resultCode = (Integer) processClass.invokeMethod("Create", invokeParams);

if (resultCode == 0) {
    System.out.println("Bat文件已成功启动");
} else {
    System.out.println("执行失败,错误码:" + resultCode);
}

// 关闭WMI连接
wbemClient.disconnect();

方案2:借助PsExec工具执行

如果允许使用外部工具,可以直接通过本地调用PsExec(Sysinternals工具集的一部分)来执行远程Bat,无需手动上传文件(若Bat已在远程服务器上):

// 调用PsExec执行远程服务器上的Bat文件
ProcessBuilder psexecBuilder = new ProcessBuilder(
    "psexec.exe", "\\\\SERVERNAME",
    "-u", "DOMAIN\\USERNAME", "-p", "PASSWORD",
    "-accepteula", // 自动接受PsExec的许可协议
    "C:\\path\\to\\your\\remote-script.bat"
);

Process psexecProcess = psexecBuilder.start();

// 读取执行输出
try (BufferedReader outputReader = new BufferedReader(new InputStreamReader(psexecProcess.getInputStream()));
     BufferedReader errorReader = new BufferedReader(new InputStreamReader(psexecProcess.getErrorStream()))) {

    String line;
    System.out.println("执行输出:");
    while ((line = outputReader.readLine()) != null) {
        System.out.println(line);
    }

    System.out.println("\n错误输出:");
    while ((line = errorReader.readLine()) != null) {
        System.out.println(line);
    }
}

int exitCode = psexecProcess.waitFor();
System.out.println("\nPsExec退出码:" + exitCode);

关键注意事项

  • 确保远程服务器开启WMI服务(Winmgmt),防火墙允许WMI相关端口(默认135及动态RPC端口)
  • 使用的账号必须拥有远程服务器的管理员权限,且UAC设置允许远程执行命令
  • 若使用PsExec,需提前将PsExec.exe放在本地可执行路径下,或指定完整路径

内容的提问来源于stack exchange,提问作者Selvakumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:37:03