我正在尝试使用需要管理员安装的 Nullsoft 安装系统构建 Windows 安装程序。安装程序会创建一个“日志”目录。由于普通用户可以运行此应用程序,因此该目录需要普通用户可写。如何指定所有用户都应该有权以 NSIS 脚本语言对该目录进行写访问?
我承认这听起来有点像一个坏主意,但该应用程序只是私有网络上只有少数人使用的内部应用程序。我只需要保存日志文件,这样我就可以看到如果发生不好的事情,应用程序为什么会损坏。用户不能成为管理员。
我正在尝试使用需要管理员安装的 Nullsoft 安装系统构建 Windows 安装程序。安装程序会创建一个“日志”目录。由于普通用户可以运行此应用程序,因此该目录需要普通用户可写。如何指定所有用户都应该有权以 NSIS 脚本语言对该目录进行写访问?
我承认这听起来有点像一个坏主意,但该应用程序只是私有网络上只有少数人使用的内部应用程序。我只需要保存日志文件,这样我就可以看到如果发生不好的事情,应用程序为什么会损坏。用户不能成为管理员。
使用AccessControl插件,然后将其添加到脚本中,其中“logs”目录位于安装目录中。
AccessControl::GrantOnFile "$INSTDIR\logs" "(BU)" "FullAccess"
这为所有用户提供了对该文件夹的完全访问权限。
AccessControl::GrantOnFile "<folder>" "(BU)" "FullAccess"
在 Windows Server 2008 机器上对我不起作用。相反,我不得不使用这个:
AccessControl::GrantOnFile "<folder>" "(S-1-5-32-545)" "FullAccess"
根据 Microsoft 支持,S-1-5-32-545 相当于“用户” :Windows 操作系统中的知名安全标识符。
与其更改 Program Files 下目录的权限,不如将日志放在所有用户均可写入的位置。
请参阅 NSIS 文档中的 4.9.7.7 SetShellVarContext 部分。您可以将它与 $APPDATA 一起使用,以获取所有用户均可写入的应用程序数据文件夹。
现在这是一个老问题,但正如 Sören 所建议的,APPDATA 目录是做你想做的事的好方法,事情是:不要拿用户的个人 APPDATA 而是“所有用户”的 APPDATA 目录!这样任何人都可以访问日志文件;-)
另外,我在某处读到,在 GrantOnFile 上使用 (BU) 在某些系统上无法正常工作(如果我没记错的话,Win 7 x64),也许你应该使用 SID "(S-1-5-32-545)" 代替(它是所有用户的 SID,这个值在每个 Windows 操作系统上都是一个常量)
为什么不在用户的 %APPDATA% 目录中创建一个日志目录?您真的需要将所有日志都放在安装目录中吗?为什么?