2013-07-05 74 views
0

我有一個單獨的可執行文件,它通過InnoSetup默認安裝到Program Files \ FolderName中。該exe文件有一個第三方組件,它可以在線檢查新版本並下載它們,然後做一些小小的替換操作 - 簡單的東西。問題是,它不能在Program Files中做到這一點,因爲它有必要的安全性。我讀Windows 7 - Can't update my program's files in C:\Program Files在大衛Hefferman給出了一個解決方案,但隨後似乎說這是一個壞主意 - 但我不知道這個壞主意位是否指的是他的解決方案或業務方案的意見!在Program Files中更新自己的軟件

那麼程序可以自行更新的首選方法是什麼?一個將在XPSP3到Win8上工作的人。我似乎無法找到正確的詞組進入Google,這給了我相關的結果。爲簡單起見,現在忽略數字簽名等類似內容。 (請注意,它可能看起來像我作爲一個意見問題,但它不是 - 必須有一些MS認可的做法,我找不到。FWIW這是一個Delphi程序,但任何Win32音符都可以)

+2

下的程序文件把一個寬容的DACL不是解決您的問題。我直接回答了一個問題,然後給出了評論,指出提出的解決方案是一個壞主意。所以,不,不要在程序文件中考慮DACL。如果您想下載更新,請下載到可寫入的位置,然後如果您需要更新程序文件,則需要更新程序升級。 –

+0

對我來說,這有點模棱兩可,沒有得到OP的評論的幫助,因此提出了一個新問題,而不是增加了這個問題 - 不想讓我對自己的不確定性感到困惑!謝謝。 – GeoffM

回答

1

該第三方更新實用程序需要以管理權限運行,您可以通過編程實現該功能。

沒有什麼錯安裝在Program Files文件您的應用程序,這是該文件夾的指定用途。但是,應用程序使用的用戶數據應存儲在不同的位置。

但是您運行第三方工具,你應該首先檢查Windows操作系統版本,看看是否與UAC擺弄真的有必要(Vista的+ ...),然後運行在高架狀態的效用。

+0

當我說組件時,它實際上是在它更新的應用程序中編譯的(甚至沒有DLL/BPL)。所以想要更新自己的程序必須以不理想的狀態運行。然而,有趣的是,你說它可以通過編程完成 - 我必須研究這一點。數據當然是寫在用戶已知的文件夾中。謝謝。 – GeoffM

+0

我明白,但UAC在那裏,如果你想更新,你將不得不解決它,要麼在應用程序啓動時升高,要麼在需要更新時升高。 – Peter

+0

是的,我知道ACL爲什麼存在,需要解決,但不確定這是否是最佳方式。謝謝。 – GeoffM

0

他說其「極其惡劣的做法」與您的系統撥弄使正常的用戶可以在「程序文件」寫的。

如果您的程序位於「程序文件」中,則會安裝系統管理員權限。因此更新需要安裝系統管理員權限。

您可以配置InnoSetup要求管理員權限,所以你可以寫「程序文件」,但如果第三方組件不這樣做最大努力在其他目錄中安裝的一切。

即C:\ Your_Program

這樣,你的第三方組件可以在裏面寫。

+0

嗯,所以我認爲*你們都說,普通用戶不應該能夠更新軟件?這是有道理的。我不想要C:\ My_Program,它會像用戶一樣帶領氣球。 – GeoffM

+0

如果它只是你自己的程序,我認爲最好的選擇是用innosetup將你的app.exe打包到update.exe中。如果更新較新,請下載並執行update.exe。如果窗口在更新期間需要提升,它將提示用戶。 (根據安裝情況設置或不設置密碼)您可以使用/ silent開關創建innosetup,並在執行後以最少的用戶干預重新啓動程序。如果你的程序不能持續運行(這很可能) – Rik

+0

其他自我更新的程序似乎能夠在沒有提升的情況下完成,我認爲這是令人困惑的。如果我的軟件導致提升提示,那就沒有問題 - 主要是讓它以「適當」的方式工作! – GeoffM

-1

有幾個選擇這裏:

  • 最簡單的:使更新與艙單一個單獨的程序,這需要管理員權限。您也可以在啓動更新程序時要求管理員權限。或者,您可以將更新程序移至進程外COM對象而不是單獨的exe。
  • 您可以在安裝程序期間創建具有管理權限的隱藏用戶。然後,您將使用此用戶的憑據運行您的更新程序。
  • 您可以在安裝程序期間安裝系統服務,此服務將從系統帳戶運行。所以你的更新程序將作爲一項服務來實現。
+0

使用管理員權限創建隱藏的用戶?在系統帳戶下安裝服務?兩個練習都很差。 –

+0

有時您需要能夠在不提示憑據的情況下更新軟件。但是,如果你不需要這個,那麼用適當的清單分離更新將是最好的選擇。 – Torbins

相關問題