38

我正在尝试使用需要管理员安装的 Nullsoft 安装系统构建 Windows 安装程序。安装程序会创建一个“日志”目录。由于普通用户可以运行此应用程序,因此该目录需要普通用户可写。如何指定所有用户都应该有权以 NSIS 脚本语言对该目录进行写访问?

我承认这听起来有点像一个坏主意,但该应用程序只是私有网络上只有少数人使用的内部应用程序。我只需要保存日志文件,这样我就可以看到如果发生不好的事情,应用程序为什么会损坏。用户不能成为管理员。

4

6 回答 6

37

使用AccessControl插件,然后将其添加到脚本中,其中“logs”目录位于安装目录中。

AccessControl::GrantOnFile "$INSTDIR\logs" "(BU)" "FullAccess"

这为所有用户提供了对该文件夹的完全访问权限。

于 2008-09-22T19:47:19.827 回答
18

AccessControl::GrantOnFile "<folder>" "(BU)" "FullAccess"在 Windows Server 2008 机器上对我不起作用。相反,我不得不使用这个:

AccessControl::GrantOnFile "<folder>" "(S-1-5-32-545)" "FullAccess"

根据 Microsoft 支持,S-1-5-32-545 相当于“用户” :Windows 操作系统中的知名安全标识符

于 2010-10-13T16:01:41.547 回答
9

与其更改 Program Files 下目录的权限,不如将日志放在所有用户均可写入的位置。

请参阅 NSIS 文档中的 4.9.7.7 SetShellVarContext 部分。您可以将它与 $APPDATA 一起使用,以获取所有用户均可写入的应用程序数据文件夹。

于 2008-09-24T18:56:59.913 回答
6

现在这是一个老问题,但正如 Sören 所建议的,APPDATA 目录是做你想做的事的好方法,事情是:不要拿用户的个人 APPDATA 而是“所有用户”的 APPDATA 目录!这样任何人都可以访问日志文件;-)

另外,我在某处读到,在 GrantOnFile 上使用 (BU) 在某些系统上无法正常工作(如果我没记错的话,Win 7 x64),也许你应该使用 SID "(S-1-5-32-545)" 代替(它是所有用户的 SID,这个值在每个 Windows 操作系统上都是一个常量)

于 2011-03-03T08:57:32.750 回答
5

一种方法:调用 shell,然后使用caclsor xcacls

于 2008-09-22T19:21:05.147 回答
2

为什么不在用户的 %APPDATA% 目录中创建一个日志目录?您真的需要将所有日志都放在安装目录中吗?为什么?

于 2008-09-22T19:22:33.660 回答