在C:\ ProgramData \中编写时的权限/所有者问题

Bas*_*asj 35 windows privileges winapi uac

正如指出的用C编写的配置文件:\程序文件(x86)\ MyApp的\ myapp.cfg,对管理员权限,这是不是写在配置文件中是一个好主意C:\Program Files (x86)\MyApp\myapp.cfg.

而不是这个,我的软件现在将其数据保存在子目录中%ALLUSERSPROFILE%(例如:C:\ProgramData\MyApp\myapp.cfg在Win7上)

[我myfile = open(filename, 'a')在Python中使用它来执行此操作.]

我现在遇到有关此文件的问题:

  • 我安装了软件User A,然后运行它,然后C:\ProgramData\MyApp\myapp.cfg编写了文件.
  • 然后,我将用户更改为User B,并再次运行我的软件:现在显示错误:User 2无权写入C:\ProgramData\MyApp\myapp.cfg (Permission denied).

为什么?不是%ALLUSERSPROFILE%所有用户都可以写的地方吗?如何解决这个问题呢 ?

Dav*_*nan 34

不,C:\ProgramData也就是说FOLDERID_ProgramData,限制了安全设置.标准用户可以在那里创建文件.但是,默认情况下,这些文件是安全的,因此只有创建该文件的用户才能随后修改该文件.

建议的解决方案是让安装程序C:\ProgramData为共享存储创建子目录.并且安装程序必须为该子目录提供许可ACL.这就是授予所有标准用户所需访问权限的原因.

我想知道你是否真的需要共享的可写数据.通常我希望看到共享配置是在安装时指定的并且管理员不经常修改的.大多数配置数据往往是每个用户.

  • 更准确地说,“任何用户”是指内置用户组的成员。`ProgramData` 的权限是 `c:\ProgramData NT AUTHORITY\SYSTEM:(OI)(CI)(F) BUILTIN\Administrators:(OI)(CI)(F) CREATOR OWNER:(OI)(CI)(IO) (F) BUILTIN\Users:(OI)(CI)(RX) BUILTIN\Users:(CI)(WD,AD,WEA,WA)` (3认同)
  • 更一般地说,有没有一种方法可以创建一个文件(当我在 Python 中执行 `f = open(filename, 'a')` 时),该文件将具有 **所有其他用户** 的完全读/写访问权限? (2认同)
  • @DavidHeffernan:实际上你最初的前提是错的; 在Windows 7上,至少,`ProgramData`的默认权限允许任何用户写入它; 特别是,创建新的文件和文件夹.但是,只有创建任何给定文件的用户在默认情况下才具有写入权限的权限. (2认同)

小智 8

我想补充这一点,因为我在写作时C:\ProgramData也遇到了问题。我的问题最终是我的目录/文件C:\ProgramData是由管理员编写的。当我的应用程序在普通用户下运行时,它无法在那里写入,因此 Windows 自动使用它C:\Users\fooface\AppData\Local\VirtualStore\ProgramData。我通过在我的应用程序上使用进程监视器找到了它正在写入的路径。看到这个后,我删除了文件C:\ProgramData并再次运行我的应用程序,它按预期写入那里。

希望这对某人有帮助。