2010-01-04 67 views
8

我有一個在Delphi 2006中編寫的應用程序,在Windows XP中工作正常。我使用Inno Setup打包了應用程序,使用Program Files作爲默認文件夾。一些用戶遷移到Windows Vista和Windows 7.這裏的問題是,應用程序會在其安裝文件夾內自行創建一些文件。這是在XP中工作,但在Windows Vista中,用戶遇到了創建文件的問題(他們沒有出現,等等)。在調查用戶的報告後,我發現KB 927387:「Windows Vista或Windows 7中的常見文件和註冊表虛擬化問題。」如何讓我的程序在Windows Vista和Windows 7中運行?

使用管理員權限運行應用程序只是解決了這個問題,但這是(我認爲)一個可怕的解決方法。我想知道是否有任何關於使應用程序與Vista和7兼容的指令或提示,因爲更多的用戶將很快遷移到這些操作系統。

+0

當用戶是標準用戶時,你會在Windows XP上做什麼? – 2011-04-05 15:17:06

回答

12

對於Vista/Win7的,您的應用程序不能將文件放在Program Files文件/程序的子文件夾,除非UAC被關閉或者應用程序正在運行的升高。請注意,「提升」並不一定意味着「以管理員身份登錄」。非管理員用戶可以提升,並且管理員不一定會提升。

如果應用程序試圖寫入程序文件,但不升高,操作系統將阻止任何應用程序或「虛擬化」的寫(將文件放在別的地方),這取決於UAC的配置方式。這兩者都不能幫助應用程序成功實現它的目標。

所以它需要把它們放在別的地方。這取決於爲什麼要創建這些文件,而且你還沒有告訴我們這些。您可以閱讀this article以瞭解有關選項。請注意,除用戶的AppData和漫遊文件夾之外,還有一個「所有用戶」(共享)配置文件。

你或許應該看看this article and screencast,這一現象從一個Delphi點討論UAC深入。

13

你需要重新編寫應用程序到其文件存儲在適當的位置,即使是在XP中,尤其是在Vista的開始,特別是如果啓用UAC。隨着微軟在每個新的操作系統版本中一直鎖定並強制執行其安全模型,這對於正確地變得越來越重要。有關如何正確管理應用程序和用戶相關文件的規則在MSDN上進行了記錄,例如:"Application Specification for Microsoft Windows 2000 for Desktop Applications, Chapter 4: Data and Settings Management""Application Specification for Microsoft Windows 2000 for Desktop Applications Appendix A: Best Practices"(是的,它們很舊,但仍然非常相關)。看看SHGetSpecialFolderLocation(),SHGetFolderPath(),SHGetKnownFolderPath()等相關函數來幫助你。

4

文件創建通過在安裝時比其他應用程序中使用應該進入ProgramData目錄,如果其在全球的工作站或到用戶的ApplicationData如果具體到用戶目錄。

對於絕對必須在程序文件目錄中放置文件的情況,可以使用com來請求提升。 This is discussed in great detaildelphi specific bits are also available。我使用過的一個例子是修補我的用戶安裝庫。 UAC警告說系統需要進行更改,因此如果您將此作爲自動化任務執行,則可能需要重新考慮邏輯以實現更多的用戶驅動。

2

我有一個類似的查詢here(堆棧溢出)。

最後,我意識到我需要把我的申請,程序文件在安裝時(需要UAC /高程),然後存儲在用戶的App Data文件夾我的應用程序的數據。我必須改變我的程序生成'默認'配置設置的方式,以及我在哪裏保存這些東西,但最後的努力是值得的 - 我們結束了在XP,Vista和Windows 7上安裝並運行良好的東西。

唯一的UAC擊中我們得到的是在安裝時,這是有道理的,我(你會得到一個類似的命中在安裝時在Mac上也是如此)。我們沒有任何數據在這個特例中對所有用戶都是通用的,但如果情況是這樣的話,我會查看程序數據特殊文件夾。

我們使用的安裝程序軟件(安裝廠)做這相當簡單(我們只是寫了一小段代碼來檢測XP與VISTA/Win7的,因此選擇合適的特殊文件夾)。在Inno Setup中這麼做也很容易,從我對它的有限經驗來看也是如此。

相關問題