如何用Java启动Windows`runas`进程?

时间:2018-06-15 20:34:51

标签: java windows process

我有一个Windows runas命令在命令行输入时效果很好,但从我的Java程序通过Runtime.exec()调用时。代码看起来几乎完全像这样:

// Create the process.
Process process = Runtime.getRuntime().exec(
    String.format(
        "runas /noprofile /user:DOMAIN\\OtherUser \"%s\",
        command));

// Enter the password.
try (OutputStream outputStream = process.getOutputStream();
     PrintWriter printWriter = new PrintWriter(outputStream)) {
    printWriter.printf("%s\n", password);
    printWriter.flush();
} catch (IOException ex) {
    ex.printStackTrace();
}

// Wait for the process to terminate.
process.waitFor();

我看到密码提示Enter the password for DOMAIN\OtherUser:,然后进程立即终止,退出值为1。

作为实验,我将process.waitFor();移到输入密码的代码上方,期望进程在密码提示符下挂起。但是,该过程挂起。它仍然以1结尾! (然后尝试输入密码会导致java.io.IOException: Stream Closed。)

相同的代码将成功运行不需要输入的流程(并且不会通过runas),并且还能成功地向Linux上的sudo --stdin提供输入。

我研究了很多类似的问题而没有运气。

有问题的Windows是Windows 7,有问题的Java是Java 8.

1 个答案:

答案 0 :(得分:0)

好的,看起来你不能这样做:

How to fill password runas command in java

原因是Windows runas命令不是从stdin读取,而是直接从控制台读取。