繁体   English   中英

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

[英]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只能运行一个程序(带参数); cdcmd的内置函数,而不是程序。 此外cmdone & cmdtwocmd一个功能,不是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM