2013-09-30 27 views
5

我移植我在Windows 8應用程序使用路徑Windows 8的:應用程序是不是到C能寫: ProgramData

C:\ ProgramData \ MyProgramName \

存儲備份。 它在Windows 7上運行良好,但在Windows 8上運行時出現「拒絕訪問」。

什麼是存儲我的程序備份(與任何特定用戶無關)的正確方法和位置?

+0

您正在開發Windows應用商店應用程序或winform/wpf嗎? – Xyroid

+1

桌面的本地C++。 – tmporaries

+0

這可能有所幫助:http://stackoverflow.com/questions/16276139/difference-between-program-data-and-appdata。本質上(我無法找到我剛剛讀一兩天前的鏈接,對不起 - 瀏覽器歷史沒有findy)安裝程序時,您可以對一個文件夾進行寫入訪問。稍後嘗試寫入此文件夾將失敗。在實際使用程序時嘗試寫入數據(與安裝階段不同)時,必須使用其他文件夾。我懷疑在我提到的問題中提到了更好的使用場所。 – enhzflep

回答

4

C:\ProgramData具有防止標準用戶在那裏寫入的安全設置。這在Windows 8中並不新鮮,Windows 7也是如此,Vista上的等效文件夾也以這種方式保護。也許你的Windows 7環境禁用了UAC,或者你已經安全地使用C:\ProgramDataC:\ProgramData\MyProgramName來允許對標準用戶進行寫入訪問。

有幾種使用此文件夾的方法。某些應用程序僅在安裝過程中寫入,而安裝程序正在運行。然後,以標準用戶身份運行的應用程序本身可以讀取,但從不嘗試寫入。

另一種方法是讓安裝程序創建一個C:\ProgramData的子文件夾,該文件夾的安全性允許對標準用戶或開發人員認爲合適的任何用戶/組進行寫入訪問。

4

我看到很多程序將其非用戶相關的應用程序數據存儲在通用應用程序文件夾中。好的,實際上他們做的是在公共應用程序文件夾內創建一個文件夾來存儲他們的數據。

要獲取通用應用程序文件夾的路徑,可以使用CSIDL_COMMON_APPDATA作爲文件夾ID調用SHGetFolderPath函數。如果不需要支持Windows Vista之前的任何內容,則可以調用SHGetKnownFolderPath函數,並將FOLDERID_ProgramData作爲已知的文件夾ID傳遞。

啊!我不知道普通應用程序文件夾是不可由普通用戶寫入的。幸運的是似乎有一個推薦的解決方案。請參閱MSDN上的這篇文章,內容爲Data and Settings Management,其中聲明以下內容「如果應用程序要求普通用戶對CSIDL_COMMON_APPDATA的應用程序特定子目錄具有寫入權限,則應用程序必須在應用程序安裝期間顯式修改該子目錄上的安全性。必須記錄在供應商調查問卷中。「

+0

'CSIDL_COMMON_APPDATA'和'FOLDERID_ProgramData'通常展開爲'C:\ ProgramData'。那麼,你如何處理安全問題呢? –

+0

@DavidHeffernan:「安全」不是您可以孤立使用的名詞。確保對抗對手的信息是什麼? – MSalters

+0

@MSalters'FOLDERID_ProgramData'是安全的,以防止標準的用戶寫作。這就是問題所在。這個答案沒有解決這個問題。 –

相關問題