windows - 在 C :\ProgramData 中创建用户独立的日志文件

标签 windows delphi winapi permissions

我想在独立于用户的哺乳中为我的应用程序创建日志文件。据我所知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.) 以某种方式在 C:\ProgramData 中创建一个“MyApp”文件夹与 Authenticated UsersEveryone权限将导致 TFileStream自动创建具有相同权限的文件或

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

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

4.)其他方式?

最佳答案

C:\ProgramData(又名FOLDERID_ProgramData)中的默认权限允许任何用户创建新文件和文件夹。但是,只有创建该文件或文件夹的用户才有权对其进行写入。

因此,如果您希望允许任何用户修改 FOLDERID_ProgramData 下的对象,那么您需要添加宽松的 ACL 来授予这些权限。您通常会在安装程序时执行此操作。在 FOLDERID_ProgramData 下创建一个文件夹,并添加 ACL 以向您希望允许完全访问的任何类别的用户授予权限。

顺便说一句,显然您不应该对 C:\ProgramData 进行硬编码,而应将 FOLDERID_ProgramData 与已知的文件夹 API 一起使用。我猜问题中的代码只是为了测试,你的真实程序代码正确地做到了这一点。

关于windows - 在 C :\ProgramData 中创建用户独立的日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34016784/

相关文章:

delphi - 在 TForm 的 OnClose 事件中释放对象

c++ - 安全地停止线程

c++ - Windows on Linux 交叉编译

windows - 如何从 6.5/6.6 版迁移/升级到 sitecore 7

java - echo %JAVA_HOME% 返回 %JAVA_HOME%

javascript - 在 Javascript Windows 应用商店应用程序中加载许多音频文件

Delphi 应用程序和 TSAWARE header 标志

vba - 通过delphi检索扩展文件属性

c++ - 在 DirectX 11 中更改分辨率

c++ - 扩展外部应用程序的菜单