簡體   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