在Windows下使用java以管理员身份运行cmd

在Windows下使用java以管理员身份运行cmd,java,cmd,Java,Cmd,使用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

使用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:虽然没有说明,但这个Q和A仅适用于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()
,无论是否需要,如果不需要,它都将被丢弃。

是否收到错误消息?我假设您必须为管理员提供登录名和密码从
Runtime.exec()
启动的进程中收集标准输出和标准错误流始终是一种良好的做法。但在某些东西不起作用的情况下,这一点尤其重要,因为这些流可能是诊断信息的唯一来源。cmd窗口没有显示,也没有例外……我添加了以下代码来检查inputstream,但没有输出BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream());字符串l;while((l=br.readLine())!=null){System.out.print(l);}感谢您提供的信息。
String cmd=“cmd.exe/c cd c:\\software\\teraterm&TTPMacro c:\\file\\execute.ttl param1 param2 param3”String[]命令=新字符串[]{“runas”,“/user:administrator”,“/savecred”,cmd}};Process p=Runtime.getRuntime().exec(命令);OutputStreamWriter osw=new OutputStreamWriter(p.getOutputStream);osw.write(“密码”);osw.write(\r\n”);osw.flush();
它仍然不工作。您能告诉我我的代码有什么问题吗?如果我刚执行了cmd(非管理员),它就工作了
Process p=Runtime.getRuntime().exec(cmd)
它是否创建了新窗口?如果是,请查看窗口。如果需要,请尝试
cmd/k
而不是
cmd/c
使窗口保持不变。如果不是,请尝试从
p.getErrorStream()
读取字节而不是行,以防万一,并显示它;如果没有帮助,请尝试
p.getInputStream()