2011-04-12 45 views
1

所以我們有一個作爲Windows服務運行的java進程。它需要執行Runtime.getRuntime().exec(command)的命令。它執行的命令需要UAC。這是在Windows服務器2008年,聽起來像你不能禁用一個單一的可執行文件的UAC所以有沒有其他方式來使這項工作?java getRuntime()。exec需要UAC的EXE

+0

看起來像將清單應用於可執行文件可能是一個選項https://sourceforge.net/tracker/index.php?func=detail&aid=2539794&group_id=9328&atid=109328#(必須展開評論) – vinnyjames 2011-04-12 23:55:18

+0

可能的重複[ Java:以管理員身份運行](http://stackoverflow.com/questions/1385866/java-run-as-administrator) - 閱讀接受的答案... – 2011-04-13 01:26:30

+0

請參見[在Windows Vista/7上爲Java應用程序的管理員權限申請](http://stackoverflow.com/questions/258728/request-admin-privileges-for-java-app-on-windows-vista) – eee 2011-04-13 06:38:44

回答

5

如果您的Java應用程序作爲Windows服務運行,它很可能運行在系統帳戶之一下:SYSTEM(最可能),LOCAL SERVICE或NETWORK SERVICE。因此,如果服務在SYSTEM帳戶下運行,那麼從服務啓動的所有內容都將繼承該帳戶。無論如何,您的服務必須被允許與桌面互動。總結一下,如果你的進程運行時提升,那麼從它開始的進程也將運行提升。


升高,你必須使用Windows API的ShellExecuteShellExecuteEx功能。如果您開始使用的.exe文件在其清單中標記爲level=requireAdministrator,則shell將顯示UAC對話框。如果未標記,則可以使用動詞/操作runas強制UAC確認對話框。注意:Windows XP上的runas將顯示「以其他用戶身份運行」對話框。

如果Runtime.getRuntime().exec(command)通過ShellExecute實現,那麼使用適當的清單標記.exe文件就可以工作;如果exec使用CreateProcess,則該過程將以當前用戶權限開始,即不升高;此外,如果.exe在其清單中具有requireAdministrator,則該進程根本不會啓動。

+0

謝謝阿列克謝,我認爲尤其是EXE(從UnxUtils patch.exe)沒有定義適當的清單。使用cygwin中的patch.exe不會彈出UAC(或者拒絕權限失敗),所以我認爲它確實如此。 – vinnyjames 2011-04-13 17:32:40

+0

@vinnyjames很高興幫助。您可以通過查看.exe文件來檢查清單。在cygwin的情況下,我想你可以添加一個清單,如果它有幫助。 – 2011-04-14 08:47:03

+0

耶再次感謝。你用什麼工具查看exe的UAC清單? – vinnyjames 2011-04-14 14:52:09