2015-12-01 51 views
2

我想在獨立於用戶的哺乳期中爲我的應用程序創建日誌文件。 AFAIK C:\ProgramData是很好的地方。在C: ProgramData中創建用戶獨立日誌文件

我試着這樣說:

if not DirectoryExists('C:\ProgramData\MyApp') then 
    CreateDirectory('C:\ProgramData\MyApp', nil); 

LogFileStream := TFileStream.Create('C:\ProgramData\MyApp\LogFile01.txt', fmCreate, (fmOpenRead or fmShareDenyNone)); 

這種方法的問題是創建申請不具有Properties->Security->Group or user namesAuthenticated Users也不Everyone

這會導致其他用戶無法修改創建的文件。

但我怎麼能做到這一點,也有其他用戶在修改創建的文件。

我認爲必須有可能在這裏有這個權限的文件。有些文件具有此權限,例如C:\ProgramData\Microsoft\Windows\Ringtones\Ringtone *.wav

也許無論是在

1)以某種方式創建「MyApp的」在C:\ProgramDataAuthenticated UsersEveryone許可文件夾,這將導致與TFileStream相同的權限自動創建文件或

2.)以某種方式告訴TFileStream創建所需的權限或

3.)以某種方式更改文件權限後創建一些API函數或

4.)其他一些方法?

+3

請勿使用硬編碼的'C:\ ProgramData'。使用Windows API檢索此路徑(FOLDERID_ProgramData/CSIDL_COMMON_APPDATA) – kobik

回答

2

默認權限C:\ProgramData,又名FOLDERID_ProgramData允許任何用戶創建新的文件和文件夾。但是,只有創建該文件或文件夾的用戶纔有權寫入該文件或文件夾。

因此,如果您希望允許任何用戶修改FOLDERID_ProgramData下的對象,那麼您需要添加一個允許的ACL來授予這些權限。您通常會在安裝程序時執行此操作。在FOLDERID_ProgramData下創建一個文件夾並添加一個ACL,授予您希望允許完全訪問權限的任何用戶類別的權限。另外,顯然你不應該使用已知的文件夾API編碼C:\ProgramData,而是使用FOLDERID_ProgramData。我猜測問題中的代碼僅用於測試,而您的真實程序代碼正確無誤。

+0

日誌文件的性質通常是在運行時創建的,而不是在安裝期間創建的。那麼我怎樣才能以編程方式更改權限? – avb

+0

我不清楚。我編輯過。安裝時,您在'FOLDERID_ProgramData'下創建一個文件夾並將ACL添加到該文件夾​​中。然後該文件夾中的對象繼承文件夾的權限。 –

+0

好吧,我明白了。另外使用'FOLDERID_ProgramData'比使用硬編碼的'C:\ ProgramData'好。但由於我的應用程序由於多種歷史原因而沒有真正的安裝程序,它必須自行創建和更改文件夾的權限。我必須使用哪個API函數才能實現此目的? – avb