如何为使用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
,执行安装程序后,权限如下所示:
我的主要目标是存储所有用户必须读取和修改的文件。如果有更好的方法,除了存储在"C:/ProgramData/MyApplication/"
中并授予所有用户权限外,这也将很有用。
1 目录为"$APPDATA\${APP_NAME}"
,即C:/ProgramData/MyApplication/
答案 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年来,这一直是首选方法。
如果您仍然决定所有用户都可以写和共享数据,则必须记住,不同的用户可以同时运行(远程桌面等)和应用程序读写时需要同步访问共享文件。