【问题标题】:Create user independent logfiles in C:\ProgramData在 C:\ProgramData 中创建与用户无关的日志文件
【发布时间】:2016-03-05 03:53:26
【问题描述】:

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

这种方法的问题是创建的文件在Properties->Security->Group or user names中既没有Authenticated Users也没有Everyone

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

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

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

也许在

1.) 以某种方式在C:\ProgramData 中创建一个具有Authenticated UsersEveryone 权限的“MyApp”文件夹,这将导致TFileStream 自动创建具有相同权限的文件或

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

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

4.) 其他方式??

【问题讨论】:

  • 不要使用硬编码的'C:\ProgramData'。使用 Windows API 检索此路径 (FOLDERID_ProgramData/CSIDL_COMMON_APPDATA)

标签: windows delphi winapi permissions


【解决方案1】:

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

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

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

【讨论】:

  • 日志文件的性质通常是它们是在运行时而不是在安装期间创建的。那么如何以编程方式更改权限呢?
  • 我不清楚。我已经编辑过了。在安装时,您在FOLDERID_ProgramData 下创建一个文件夹并将ACL 添加到该文件夹​​。然后该文件夹中的对象继承该文件夹的权限。
  • 好的,我明白了。此外,使用FOLDERID_ProgramData 比使用硬编码的C:\ProgramData 更好。但是由于我的应用由于几个历史原因没有真正的安装程序,它必须自己创建和更改文件夹的权限。我必须使用哪个 API 函数来实现这一点?
  • 我相信你需要管理员权限才能做到这一点。所以你希望它在一个单独的程序中,或者至少你的程序用 runas 动词和命令行参数重新启动。确实,安装程序是执行此操作的最佳方法。但是,如果您真的想知道如何将 ACL 应用于目录,请在 SO 上搜索有关该主题的问题。它已经被问过很多次了。
  • 使用CreateDirectory() 创建文件夹,提供一个SECURITY_ATTRIBUTES 指向一个包含所需ACL 的SECURITY_DESCRIPTOR
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
相关资源
最近更新 更多