[英]Run cmd as administrator using java under Windows
使用 java,我运行 cmd 以便能够执行 ttl 文件。
我的代码:
try {
String[] command = new String[] {"cmd.exe", "/c", "cd C:\software\teraterm", "& TTPMacro C:\file\execute.ttl param1 param2 param3"};
Process p = Runtime.getRuntime().exec(command);
p.waitFor();
} catch (Exception e) {
throw e;
}
但我希望 cmd 以管理员身份运行,所以我在我的代码中添加了runas /savecred /user:.\\Administrator ,但它不再工作了:
try {
String[] command = new String[] {"cmd.exe", "/c", "runas /savecred /user:.\\Administrator", "cd C:\software\teraterm", "& TTPMacro C:\file\execute.ttl param1 param2 param3"};
Process p = Runtime.getRuntime().exec(command);
p.waitFor();
} catch (Exception e) {
throw e;
}
这有什么问题?
我已更新代码以检查输入流,但没有输出
try {
String[] command = new String[] {"cmd.exe", "/c", "runas /savecred /user:.\\Administrator", "cd C:\software\teraterm", "& TTPMacro C:\file\execute.ttl param1 param2 param3"};
Process p = Runtime.getRuntime().exec(command);
BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
String l;
while((l=br.readLine()) != null){
System.out.print(l);
}
p.waitFor();
} catch (Exception e) {
throw e;
}
Meta:虽然没有说明,但是这个问答只针对Windows,在其他系统上没用
runas
只能运行一个程序(带参数); cd
是cmd
的内置函数,而不是程序。 此外cmdone & cmdtwo
是cmd
一个功能,不是runas
可以做的。 您需要将您的命令放入cmd /c
调用中,就像您直接从 Java Runtime.exec
(它也只能运行单个程序)运行时所做的一样,只是runas
要求其运行程序恰好是一个参数,而不是可选的(重新)加入的几个。 所以:
String[] command = new String[]{"runas","/user:administrator","/savecred", // these must be separated args
"cmd /c cd directory & executable data"}; // these must be all one argument
同样在 Java 字符串文字中,反斜杠用作转义字符,因此您必须将每个字符加倍(在路径名或其他情况下)。
最后,如果runas
没有已经保存的凭据,它会提示输入密码。 这个提示不是一行,所以你不能用BufferedReader.readLine()
读取它。 您可以使用输入流将其读取为字节(到数组中),或使用InputStreamReader
读取字符(同上)。 但是,作为一种黑客行为,由于runas
不会将自己的 stdhandles 传递给它的孩子,而是一个新的控制台窗口,因此您可以忽略提示并始终将密码写入p.getOutputStream()
无论是否需要,如果不是,它将被丢弃。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.