在java中使用不同的用户调用外部进程

时间:2009-09-11 09:06:07

标签: java exec

我们有一个作为Windows服务运行的java应用程序。特定功能需要执行二进制文件,但需要使用不同的用户启动应用程序。

我们可以通过“以不同用户身份运行”的方式调用exe。

我检查了ProcessBuilder的API,但没有找到任何与用户相关的内容。是否有任何第三方工具来实现这一目标。

3 个答案:

答案 0 :(得分:2)

您可以使用PSExec以不同的用户身份执行流程。命令行如下所示:

psexec.exe -u username -p password mybinary.exe

然后,您可以使用ProcessBuilder围绕此构建命令。

编辑:以下是您可以执行此操作的示例:

public int startProcess(String username, String password, 
        String executable, String... args) throws IOException {

    final String psexec = "C:\\PsTools\\psexec.exe"; //psexec location

    //Build the command line
    List<String> command = new LinkedList<String>();
    command.add(psexec);

    if(username != null) {
        command.add("-u");
        command.add(username);
        command.add("-p");
        command.add(password);
    }

    command.add(executable);
    command.addAll(Arrays.asList(args));

    ProcessBuilder builder = new ProcessBuilder(command);
    Process process = builder.start();

    int returnCode;

    try {
        returnCode = process.waitFor();
    } catch (InterruptedException e) {
        returnCode = 1;
    }

    return returnCode;
}

然后您可以像这样使用它:

startProcess("Bob", "Password", "Notepad.exe", "C:\\myfile.txt");

答案 1 :(得分:0)

我相信你可以在紧要关头使用runas DOS命令,如果你找不到别的东西。 (在dos提示符中输入runas以获取使用信息。)

编辑:不幸的是,根据说明here,这显然不适用于服务。 :/或者您可以创建一个可以调用的小型独立包装器应用程序,然后使用runas调用二进制文件。

答案 2 :(得分:0)

Runtime.getRuntime()。exec(?)方法。