2011-01-11 145 views
11

我需要使用Preferences API的systemRoot功能,但是如果UAC處於打開狀態,則由於缺少Windows權限而失敗。我試圖找到彈出UAC提示並提升權限以允許systemRoot更新成功的技術細節。如何提升Java的UAC權限?

+0

[UAC和Java]的可能重複(http://stackoverflow.com/questions/1076794/uac-and-java) – 2011-01-11 21:03:40

+0

排序然而,這個特定的問題嚴重缺乏使其工作所需的技術細節。我正在尋找*實用信息,而不是我們都知道的理論。 :-) – 2011-01-12 13:18:52

+1

在java bug數據庫中有一個「無法修復」的bug:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6790382 – 2014-11-03 16:50:10

回答

6

根據已接受的對this SO question的回答,您無法更改正在運行的進程的UAC權限。

根據答案this SO question,推出以提升的權限的過程可能的方式是:

  • 創建一個包裝與Windows清單請求提出的權限啓動JVM(使用適當的參數!) ,或
  • 使用鏈接到第二個答案的應用程序以提升的權限運行JVM。
2

除了清單使用JNI調用帶有verb = runas的ShellExecute也會這樣做 - 但使用清單指定內容是一種更健壯的方式。獲取嵌入到exe中的清單可能有點棘手,並且早期版本的Visual C++中的清單處理存在很多問題,但其中大多數都是現在制定出來的。

也就是說,我鼓勵你認真思考爲什麼你需要訪問系統根目錄 - 是否存儲所有用戶的設置?如果是這樣,你可能想考慮有一個單獨的應用程序來管理這些設置(使用它自己的清單)。你不能只是彈出一個UAC提升對話框 - 你實際上必須啓動一個新的進程(如果你看到任務管理器的應用程序似乎以這種方式工作,你會看到應用程序的第二個實例實際上啓動 - 查看任務管理器中的UAC虛擬化列以查看差異)。

另一種可能性是,你絕對必須從非提升過程中配置註冊表的區域來調整安全設置 - 但這違背了UAC的設計,它會幾乎總是造成更多的麻煩比它的價值。可能更好地喝M $ kool-aid併爲UAC正確設計你的應用程序。 (相信我,我感到你的痛苦 - 經歷過很多次)。

當我正經歷着這種痛苦我自己,我發現下面的MSDN文章非常有助於瞭解微軟的設計意圖與UAC:

http://msdn.microsoft.com/en-us/library/aa511445.aspx

希望這有助於...

2

你可以使用運行作爲根庫:https://github.com/dyorgio/run-as-root

// Specify JVM options (optional) 
RootExecutor rootExecutor = new RootExecutor("-Xmx64m"); 

// Execute privileged action 
rootExecutor.run(() -> System.out.println("Call your admin code here.")); 

PS:我是作者。