当前位置:Nanlon > 经验教程 > 正文

NSIS 访问控制插件 – AccessControl

在以前 Windows7 盛行的年代,由于大多数用户都使用封装的系统,且多以启用内置管理员(administrator)登录,以规避系统权限问题,访问权限问题并没有引起大家的过多关注。

而从 Windows8 开始,微软逐渐加强了系统权限管理,如今在 Windows10 普及的情况下,系统不再支持使用内置管理员登录,更多用户开始使用微软账户或创建一个本地新用户登录系统。

现在网上一些软件安装包由于权限问题,在 Win10 系统中用户体验欠佳。而解决方法大多使用 icacls 命令获取访问权限或使用注册表(Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers)提升权限来尝试解决,但效果欠佳!鉴于此,给大家推荐一个 NSIS 的访问控制插件,可以很好地解决文件、目录和注册表的访问权限问题。

访问控制概述

参考微软官方文档:https://docs.microsoft.com/zh-cn/windows/security/identity-protection/access-control/access-control

插件简介

支持:WinNT4+
NSIS 的访问控制插件。提供一组与 Windows NT 访问控制列表(ACL)管理相关的功能。

官方链接:https://nsis.sourceforge.io/AccessControl_plug-in

使用示例

官方使用示例:

# 将文件 "C:\ test.txt" 的所有权授予 "Waterloo\Mathias"
AccessControl::SetFileOwner "C:\test.txt" "Waterloo\Mathias"
Pop $0 ; 错误时输出 "error"

# 授予所有用户对目录 "$INSTDIR\database" 的读写权限。
AccessControl::GrantOnFile "$INSTDIR\database" "(BU)" "GenericRead + GenericWrite"
Pop $0

# 授予所有经过身份验证的用户(BUILTIN\Users)对注册表项 "HKEY_LOCAL_MACHINE\Software\Vendor\SomeApp" 的完全访问权限。
AccessControl::GrantOnRegKey HKLM "Software\Vendor\SomeApp" "(BU)" "FullAccess"
Pop $0

# 同上,但使用安全标识符(SID)
AccessControl::GrantOnRegKey HKLM "Software\Vendor\SomeApp" "(S-1-5-32-545)" "FullAccess"
Pop $0

Permission List(权限列表)

File Permissions(文件权限)

ReadData(读取相应文件数据的权限)
WriteData(将数据写入文件的权限)
AppendData(将数据追加到文件的权限)
ReadEA(读取扩展文件属性的权限)
WriteEA(写入扩展文件属性的权限)
Execute(执行文件的权限)
ReadAttributes(读取文件属性的权限)
WriteAttributes(写入文件属性的权限)
Delete(删除对象的权限)
ReadControl(读取对象的安全描述符中的信息的权限, 不包括系统访问控制列表 (SACL) 中的信息)
WriteDAC(在对象的安全描述符中修改自由访问控制列表 (DACL) 的权限)
WriteOwner(在对象的安全描述符中更改所有者的权限)
Synchronize(使用对象进行同步的权限。 这使线程可以等到对象处于终止状态。 某些对象类型不支持此访问权限。)
GenericRead(通用读取权限)
GenericWrite(通用写入权限)
GenericExecute(通用执行)
FullAccess(完全访问)
NULL(空)

Directory Permissions(目录权限)

ListDirectory(列出目录内容的权限)
AddFile(在目录中创建文件的权限)
AddSubdirectory(创建子目录的权限)
ReadEA(读取扩展目录属性的权限)
WriteEA(写入扩展目录属性的权限)
Traverse(遍历目录的权限)
DeleteChild(是删除目录及其包含的所有文件 (包括只读文件) 的权限)
ReadAttributes(读取目录属性的权限)
WriteAttributes(写入目录属性的权限)
Delete(删除对象的权限)
ReadControl(读取对象的安全描述符中的信息的权限, 不包括系统访问控制列表 (SACL) 中的信息)
WriteDAC(在对象的安全描述符中修改自由访问控制列表 (DACL) 的权限)
WriteOwner(在对象的安全描述符中更改所有者的权限)
Synchronize(使用对象进行同步的权限。 这使线程可以等到对象处于终止状态。 某些对象类型不支持此访问权限)
GenericRead(通用读取权限)
GenericWrite(通用写入权限)
GenericExecute(通用执行权限)
FullAccess(完全访问)
NULL(空)

Registry Permissions(注册表权限)

QueryValue(查询项值权限)
SetValue(设置键值权限)
CreateSubKey(创建子键权限)
EnumerateSubKeys(枚举子键权限)
Notify(请求注册表项或注册表项子键的更改通知权限)
CreateLink(创建符号链接权限)
Delete(删除对象的权限)
ReadControl(读取对象的安全描述符中的信息的权限, 不包括系统访问控制列表 (SACL) 中的信息)
WriteDAC(在对象的安全描述符中修改自由访问控制列表 (DACL) 的权限)
WriteOwner(在对象的安全描述符中更改所有者的权限)
Synchronize(使用对象进行同步的权限。 这使线程可以等到对象处于终止状态。 某些对象类型不支持此访问权限)
GenericRead(通用读取权限)
GenericWrite(通用写入权限)
GenericExecute(通用执行权限)
FullAccess(完全访问)
NULL(空)

通过安全描述符定义语言(SDDL)给指定的对象设置权限

支持的 SDDL 字符串:AN、AU、BA、BU、IU、SY 和 WD

"AN" Anonymous logon
包含已匿名登录的所有用户的组。例如 Guest 用户。

"AU" Authenticated users
经过身份验证的用户。其中包括所有使用用户名、密码登录并通过身份验证的账户,不包括来宾账户 Guest。

"BA" Built-in administrators
内置管理员用户。 操作系统初始安装后,组的唯一成员是管理员帐户。 当计算机加入域时,”域管理员” 组将添加到 “管理员” 组中。 当服务器成为域控制器时,”企业管理员” 组也将添加到 “管理员” 组中。

"BU" Built-in users
内置用户。操作系统初始安装后,唯一成员是 “经过身份验证的用户” 组。 当计算机加入域时,”域用户” 组将添加到计算机上的 “用户” 组中。

"IU" Interactively logged-on user
包含以交互方式登录的所有用户的组,成员身份由操作系统控制。

"SY" Local system
本地系统。操作系统使用的服务帐户。

"WD" Everyone
包括所有用户,甚至匿名用户和来宾的组。成员身份由操作系统控制。注意 默认情况下,”所有人” 组在运行 Windows XP Service Pack 2 (SP2)的计算机上不再包含匿名用户。

也可以通过安全标识符(SID)给指定的对象设置权限

参考链接:Windows 操作系统中众所周知的安全标识符

最后,获取的权限应以能够支撑程序运行的最小可用权限为度,而不能盲目的获取过多的无用权限或完全访问权限,以至于危及系统和数据安全!

另请参阅:文件安全性和访问权限
另请参阅:为 ACL 注释设置追加/修改

感觉很棒!可以赞赏支持我哟~

赞(1) 打赏
作者保留所有权,侵删请联系,转载请注明: » Nanlon » NSIS 访问控制插件 – AccessControl

评论抢沙发