【问题标题】:Grant full access in NSIS language授予 NSIS 语言的完全访问权限
【发布时间】:2019-09-21 16:36:44
【问题描述】:

如何为使用 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/

【问题讨论】:

  • 您能否确认您使用的是SetShellVarContext all。授予后您是否在资源管理器中检查了目录的安全性?
  • @Anders 是的,我正在使用SetShellVarContext all,并且在执行安装程序后,所有用户的权限是“完全控制”、“修改”、“写入”,但不是“读取”等其他用户"或"读取和执行"、"列出文件夹内容"、"特殊权限"
  • @Anders 添加了显示安全属性的屏幕截图

标签: windows permissions windows-installer installation nsis


【解决方案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 年来,这一直是首选方法。

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

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 2013-01-28
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多