授予NSIS语言的完全访问权限

时间:2019-09-21 16:36:44

标签: windows permissions windows-installer installer nsis

如何为使用NSIS语言的所有用户授予对目录 1 及其所有子目录的完全访问权限(读/写/删除)?我已经看到this和所有类似的答案。他们都建议这样做:

AccessControl::GrantOnFile  "$APPDATA\${APP_NAME}" "(S-1-5-32-545)" "FullAccess"

我做到了,但是在"$APPDATA\${APP_NAME}"中创建的文件仍然不能被创建者以外的用户访问(无法读取/修改/删除)。所有文件都无法修改,有些甚至无法读取。我在Windows 7 64位上。我究竟做错了什么?我还尝试使用"(BU)"代替"(S-1-5-32-545)""GenericRead + GenericWrite"代替"FullAccess"。都没有帮助。
我正在使用SetShellVarContext all,执行安装程序后,权限如下所示:

Permissions


我的主要目标是存储所有用户必须读取和修改的文件。如果有更好的方法,除了存储在"C:/ProgramData/MyApplication/"中并授予所有用户权限外,这也将很有用。

1 目录为"$APPDATA\${APP_NAME}",即C:/ProgramData/MyApplication/

1 个答案:

答案 0 :(得分:1)

尽管我的安全性选项卡与您的安全性选项卡相同,但其他非管理员用户可以在AccessControl调用后写入文件。如果单击屏幕快照中的“高级”按钮,您应该会看到真正的ACL,在该处应有一个非继承条目,该条目具有对用户组的完全访问权限。

RequestExecutionLevel admin
!define APP_NAME "SOTest"

Section
SetShellVarContext all

CreateDirectory "$APPDATA\${APP_NAME}"
nsExec::ExecToLog '"icacls" "$APPDATA\${APP_NAME}"'
Pop $0

AccessControl::GrantOnFile "$APPDATA\${APP_NAME}" "(S-1-5-32-545)" "FullAccess" ; or use S-1-1-0 for Everyone
Pop $0
MessageBox mb_ok "GrantOnFile returned $0"
nsExec::ExecToLog '"icacls" "$APPDATA\${APP_NAME}"'
Pop $0
SectionEnd

给我

Create folder: C:\ProgramData\SOTest
C:\ProgramData\SOTest NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
                      BUILTIN\Administrators:(I)(OI)(CI)(F)
                      CREATOR OWNER:(I)(OI)(CI)(IO)(F)
                      BUILTIN\Users:(I)(OI)(CI)(RX)
                      BUILTIN\Users:(I)(CI)(WD,AD,WEA,WA)

Successfully processed 1 files; Failed processing 0 files
C:\ProgramData\SOTest BUILTIN\Users:(OI)(CI)(F) <-- Full access for users group
                      NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
                      BUILTIN\Administrators:(I)(OI)(CI)(F)
                      CREATOR OWNER:(I)(OI)(CI)(IO)(F)
                      BUILTIN\Users:(I)(OI)(CI)(RX)
                      BUILTIN\Users:(I)(CI)(WD,AD,WEA,WA)

Successfully processed 1 files; Failed processing 0 files

即使您可以使用它,它也是not the correct way for a application to function。您可以将初始/模板数据存储在ProgramData文件夹中,但是用户首次运行该应用程序时,应将数据从ProgramData复制到用户%AppData%文件夹中。当然,这意味着每个用户都有自己的私人数据。至少20年来,这一直是首选方法。

如果您仍然决定所有用户都可以写和共享数据,则必须记住,不同的用户可以同时运行(远程桌面等)和应用程序读写时需要同步访问共享文件。