2014-01-10 91 views
4

我寫了一個包含自更新程序的Java應用程序。自更新程序從Web服務器加載新程序版本並替換應用程序文件。儘管如果安裝應用程序,這完美地工作,例如在用戶主目錄中,如果它安裝在C:\ Program Files文件夾中,它將在Windows計算機上失敗。這是因爲JVM是在沒有對程序目錄的寫入權限的用戶帳戶下執行的。 如果一個本地程序,例如一個安裝程序會嘗試寫入程序文件夾,通常彈出窗口會要求用戶允許寫入操作。這不會發生在Java應用程序中。爲什麼?從Java程序寫入到C: Program Files

有什麼辦法可以實現將Java程序寫入受限制文件夾的操作會彈出安全彈出框,以便用戶可以允許訪問該文件夾?


感謝您的回覆。根據答案我看到如下選項:

  1. Java Web Start的
    對我來說,這不是最終用戶的選項。我認爲沒有人能期望普通的最終用戶知道什麼是Java Web Start,它有什麼好處以及如何使用它,我懷疑普通的Windows用戶是否知道如何卸載Java Web Start應用程序。

  2. 使用帶有清單的exe啓動程序啓動Java應用程序
    據我瞭解這個解決方案,exe啓動程序會在應用程序啓動時請求擴展執行權。這不完全是我想要的,因爲我的使用情況下,如果更新可用而不是每次應用程序啓動時,獲得擴展權限就足夠了。

  3. 通過調用本機可執行文件執行更新操作
    可以調用本機可執行文件來讓它執行更新操作。這樣,如果更新可用,應用程序只會請求擴展權限。這聽起來不錯,但包括一些本地編碼的Windows,並不適用於其他平臺。

  4. 安裝程序文件夾中的一個發射器和在用戶家
    一個應用程序可以將在調用安裝在用戶的主目錄下的應用程序文件夾中的發射器。通過這種方式,可以更新用戶主文件夾中的應用程序。 我使用InnoSetup在Windows上安裝我的應用程序,並且據我所見,使用此安裝程序很難實現拆分安裝,並且可能與其他安裝程序也可以實現拆分安裝。

  5. 在用戶的主目錄中安裝完整的應用程序
    由於用戶具有對其主目錄的寫入權限,因此完全沒有問題。對我來說,這看起來是最簡單的選擇。

+0

檢查:http://stackoverflow.com/questions/4662574/how-do-i-elevate -my-uac-permissions-from-java – Xardas

+0

在另一個問題中,你問到JWS。爲什麼不安裝這個程序。使用JWS?它提供了自動更新.. –

+2

我是UAC,我會立即封鎖你的應用程序,並阻止它永久執行。誰保證你不會將惡意可執行文件與你看似無辜的java文件一起引入? –

回答

2

不幸的是,當您第一次啓動程序時,需要請求增加的權限,以後您無法再提升權限。看起來像他們這樣做的程序實際上是在後臺更高的權限後重新啓動自己。

幾年前,我有一個Java應用程序出現這樣的問題,最後我將應用程序安裝到用戶數據文件夾而不是程序文件,否則自動更新是一場噩夢。您仍然可以將其添加到開始菜單,因此對於用戶來說,它看起來與任何其他程序完全相同。

+0

我不明白的是,像安裝程序這樣的本地程序也首先使用用戶權限啓動,然後當程序嘗試訪問程序文件夾時,如果用戶確認安全彈出窗口,它將獲得管理員權限。所以當程序啓動的時候,不會增加權限,但是可以隨時獲得它。例如,區別在哪裏一個安裝程序和Java虛擬機?兩者都是本機窗口程序,並應該以相同的方式表現? – user2662314

+0

我已經回答了。它不會 - 安裝程序會重新啓動並在重新啓動時請求增加的權限。 –

3

如果您使用inno setup編譯器生成啓動程序,那麼您可以更改您的應用程序目錄權限。

例如,如果您需要完全控制,並希望下AppName的/ data文件夾更新文件

[Dirs] 
Name: "{app}"; 
Name: "{app}\data"; Permissions: everyone-full 

[Files] 
Source: data\*; DestDir: {app}\data\; Flags: ignoreversion recursesubdirs createallsubdirs; Permissions: everyone-full 
+0

我很高興在這裏看到這個答案(因爲我正在使用inno setup)。但是這個答案可以擴展爲更常用:在安裝過程中爲程序文件中的應用程序文件夾編輯權限。 – sinedsem

相關問題