在C:\ ProgramData

时间:2015-12-01 09:23:51

标签: windows delphi winapi permissions

我想在用户独立的哺乳期为我的应用程序创建日志文件。 AFAIK 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));

此方法存在的问题是创建的字段在Authenticated Users中没有EveryoneProperties->Security->Group or user names

这导致其他用户无法修改创建的文件。

但是我怎样才能实现这一点,其他用户也可以修改创建的文件。

我认为必须有可能拥有此权限的文件。某些文件具有此权限,例如C:\ProgramData\Microsoft\Windows\Ringtones\Ringtone *.wav

也许在

1。)以某种方式创建了一个“MyApp' C:\ProgramData中具有Authenticated UsersEveryone权限的文件夹会导致TFileStream自动创建具有相同权限的文件或

2.)以某种方式告诉TFileStream创建具有所需权限的文件或

3。)以某种方式在创建后使用某些API函数更改文件权限或

4.)其他一些方法??

1 个答案:

答案 0 :(得分:2)

C:\ProgramData中的默认权限,即FOLDERID_ProgramData,允许任何用户创建新文件和文件夹。但是,只有创建文件或文件夹的用户才有权写入该文件或文件夹。

因此,如果您希望允许任何用户修改FOLDERID_ProgramData下的对象,则需要添加许可ACL以授予这些权限。安装程序时通常会这样做。在FOLDERID_ProgramData下创建一个文件夹,并添加一个ACL,以便为您希望允许完全访问权限的任何类别的用户授予权限。

顺便说一下,显然你不应该硬编码C:\ProgramData,而应该使用已知文件夹API的FOLDERID_ProgramData。我想问题中的代码仅用于测试,而您的真实程序代码是正确的。