2010-11-17 28 views

回答

3

通過的SHGetFolderPath返回目錄中創建如果您創建一個文件時,它會簡單地繼承父容器的權限,換句話說,在文件夾它駐留在哪裏。所以你只需要在具有必要權限的文件夾中創建它。

+1

或者使用Win32 API'SetFileSecurity()'函數來設置對文件限制較少的權利。 – 2010-11-18 02:43:43

+2

好吧,當然你可以做到這一點,但最終你會得到一堆噩夢般的ACL,這些ACL很快變得無法管理。無論如何,除非你有足夠的權利這是基本問題,否則它將無法運作。 – 2010-11-18 20:39:05

+2

看來你正試圖寫入C:\ ProgramData這是一個受限制的權限文件夾。普通用戶對該文件夾的默認權限是讀取和執行,列出文件夾內容,讀取。這實際上是問題的核心。您需要找到一個更合適的位置來查找您的文件。 – 2010-11-18 20:41:32

1

你是什麼意思「由機器上的所有用戶可寫」?

你的意思是你創建一個用戶的文件,然後另一個用戶來試圖寫入該文件,並失敗?

還是你的意思是用戶創建一個文件,當第一位用戶在其寫入誰是(通過終端會話)同時連接到同一臺機器上的其他用戶不能寫入文件?

如果是第一種情況,文件保存在哪裏?它是否在所有用戶都有寫入權限的文件夾中?用這樣的代碼

var 
    Stream : TFileStream; 
begin 
    Stream := TFileStream.Create('D:\MyFile',fmOpenReadWrite + fmShareDenyNone); 
    try 

    finally 
    Stream.Free; 
    end; 
end; 

。注意到,多個用戶可能會相互覆蓋:

如果是第二種情況,你可以打開該文件進行讀/寫無鎖吧!

+0

這是第一種情況,文件是在c:\ ProgramData中創建的。我所看到的代碼使用'舊式'Pascal文件訪問,我想將其全部更改爲使用TFileStream,因爲我知道這是有效的。 – Mmarquee 2010-11-17 17:12:47

+0

你的意思是流:= TFileStream.Create('D:\ MyFile',fmOpenReadWrite或fmShareDenyNone);對?! :-P – ComputerSaysNo 2010-11-18 00:55:27

+0

@Dorin:+運算符具有與按位或運算符相同的效果。 – vcldeveloper 2010-11-18 01:47:24

1

您是否在談論文件的NTFS權限?如果是的話,你需要看看Delphi的包裝爲NT安全API,並使用該API更改文件安全設置,以允許每個人組訪問該文件。如果你只是在打開文件時談論共享訪問),上面的vcldeveloper已經給出了答案。

+0

德爾福包裝爲NT的安全API:聽起來像絕地武士Windows安全庫又名Jwscl:d – Remko 2010-11-17 20:07:35

6

我覺得OP想知道哪裏創建所有用戶文件可寫。 如果是這樣,視窗思想決定什麼這樣的文件應該在(CSIDL_COMMON_DOCUMENTS)或probabably CSIDL_COMMON_APPDATA

相關問題