2014-10-30 110 views
5

我正在編寫一個Java安裝程序,因此需要提升特權才能訪問Program Files目錄。在Windows上以管理員身份運行Java應用程序

public static void main(String args[]) { 
    if (!checkPrivileges()) { // spawn a copy w/ elevated privileges 
     Runtime runtime = Runtime.getRuntime(); 
     try { 
      Process p = runtime.exec(
       "runas /profile /user:Administrator \"java -cp . main.Main\""); 
     } catch (IOException e) { ... } 
    } else { 
     // Run with elevated privileges 
    } 
} 

,我使用檢查權限的測試稍微偏離的回答修改發現here,看起來像這樣:在此基礎上,我在網上找到的信息,如下我寫的實現:

private static boolean checkPrivileges() { 
    File testPriv = new File("C:\\Program Files\\"); 
    if (!testPriv.canWrite()) return false; 
    File fileTest = null; 
    try { 
     fileTest = File.createTempFile("test", ".dll", testPriv); 
    } catch (IOException e) { 
     return false; 
    } finally { 
     if (fileTest != null) 
      fileTest.delete(); 
    } 
    return true; 
} 

當我運行這個時,它失敗了特權測試 - 如預期的那樣 - 並且調用exec。實際上,通過查看p.isAlive()來檢查呼叫是否工作表明該過程是活着的;但是,我沒有看到新流程的任何證據,Windows並未提示我授予權限。

我不熟悉在Java中使用exec(),所以我很可能以某種方式誤解了它的用法。對於這個問題,我試圖在這裏甚至有可能做什麼?如果沒有,是否有一個簡單的替代方案能夠真正爲我帶來我期待的結果?

+1

在Windows 8(也可能是其他的)中,使用'runas'實際上並沒有帶來UAC彈出窗口,而是提示輸入密碼通過stdin。嘗試在命令提示符窗口中運行'runas/profile/user:Administrator notepad';這可能解釋你的問題。 – Pokechu22 2014-10-30 22:11:42

+1

這確實是這種情況。我想這隻會導致一個後續問題:如何在Java中創建一個UAC彈出窗口? 或者,我的目標平臺是Windows 7(即使我正在Windows 8平臺上開發)。此代碼是否可以完成我在該平臺上的計劃? – bionicOnion 2014-10-30 22:26:21

+1

一個解決方案是在C中編寫一個簡單的應用程序,以便爲您重新啓動Java程序。您可以給應用程序一個應用程序清單,告訴Windows需要提升。但是,可能有一種方法可以直接在Java中執行,這是一個有趣的問題。 +1。 – 2014-10-30 22:34:04

回答

1

好吧,我終於設法得到了一個解決方案,我很滿意這個問題;這有點醜陋,但它適用於我正在做的事情。

我借用this的代碼做了實際的權限提升;從那裏開始,問題就是真正讓這個解決方案與Java協同工作。對於該代碼最終看起來像這樣:

if (!checkPrivileges()) { 
     try { 
      String jarPath = DownloaderMain.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 
      String decodedPath = URLDecoder.decode(jarPath, "UTF-8"); 
      decodedPath = decodedPath.substring(1, decodedPath.length()); 
      Elevator.executeAsAdministrator(System.getProperty("java.home") + "\\bin\\java", "-jar " + "\"" + decodedPath + "\""); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     // Run with elevated privileges 
    } 

checkPrivileges方法是不變的,從上方和Elevator類幾乎是相同的出現在連接溶液中的一個(I只是拿出不需要main方法) 。該解決方案假定要升高的過程是一個罐子;要改變這種情況以適應您的個人需求不應太困難。

相關問題