icacls 是新版工具,适用于 Windows Vista 及更高版本,提供了更强大的权限控制、更细粒度的管理以及更多的操作选项。在 PowerShell 中, 下面是 icacls 命令和 PowerShell 对应命令的对比:
Windows NTFS 权限模型深度解构
分析框架:底层原理|依赖文件|依赖关系|逻辑链路|配套链|边界|自动化 重点:安全描述符组织架构、嵌套层级、继承链路、生效判断栈
一、底层原理
NTFS 权限不是简单 “文件挂一组权限”,是分层嵌套 + 继承 + 特权覆盖 + 安全参考监视器 (SRM) 判决的复合访问控制模型。 内核组件:SRM(安全参考监视器),位于内核,所有本地文件访问全部经过 SRM 校验;ntfs.sys 负责把安全描述符 SD 持久化存储到卷元文件$Secure,MFT 每条记录存储 SD 索引,不重复存储完整 SD(SD 去重节约磁盘)。
安全描述符 SD 顶层结构(第 0 层,根对象)
SecurityDescriptor SD
├─ Owner SID 对象所有者
├─ Group SID 主组(Windows极少使用)
├─ DACL 自主访问控制列表 用户/组允许/拒绝访问(业务权限主体)
└─ SACL 系统审计ACL 访问审计规则,不控制权限,只写日志
注意:Owner 本身携带隐式特权:
WRITE_DAC、WRITE_OWNER;哪怕 DACL 全部拒绝,所有者依然可以修改权限,这个是独立于 DACL 的特权,不属于 ACE 条目。
二、DACL 内部组织架构(第 1 层)
DACL 是 ACE(Access Control Entry)条目的有序数组。 每条 ACE 结构:
ACE
├─ ACE类型:允许ACE / 拒绝ACE / 审计ACE(SACL内) / 完整性ACE(MIC)
├─ ACE标志位(继承控制标志)
│ ├─ CI ContainerInherit 容器继承(文件夹向下继承)
│ ├─ OI ObjectInherit 对象继承(文件向下继承)
│ ├─ IO InheritOnly 仅继承:本对象不生效,只传给子对象
│ ├─ NP NoPropagateInherit 不传播继承:只传给直接子一级,不再深层嵌套
│ └─ INHERITED_ACE 标记:此ACE来自父继承,不是本对象显式ACE
├─ Trustee SID:用户/组SID
└─ AccessMask 32位位掩码:细粒度权限位(RD WD AD X DE DC RC WDAC WO …)
ACE 强制排序规则(SRM 判决依赖顺序,不能乱)
- 显式拒绝 ACE
- 显式允许 ACE
- 继承拒绝 ACE
- 继承允许 ACE
拒绝优先原则:只要命中一条拒绝 ACE,直接拒绝访问,不再向后匹配。
三、完整嵌套层级模型(从卷根向下嵌套)
NTFS 权限是目录树嵌套继承模型,层级从卷根开始向下递归;每一个文件 / 文件夹都是独立安全对象。
| 层级 | 对象 | 说明 |
|---|---|---|
| L0 | NTFS 卷本身(\) | 卷根安全描述符;所有顶层目录继承源头 |
| L1 | 一级文件夹 D:\DirA |
显式 SD / 继承卷根 SD |
| L2 | 二级子文件夹 D:\DirA\Sub1 |
继承 L1,也可设置独立显式 SD(断开继承) |
| L3 | 三级子文件夹 / 文件 D:\DirA\Sub1\file.txt |
继承父 L2,可设置独立显式 SD |
| … | 无限向下嵌套 | 理论无硬编码最大层级;受 NTFS 路径长度、MFT 资源限制 |
⚠️ 逻辑层级 vs 物理 MFT:
- 逻辑嵌套层级可以无限深;
- 每个 MFT 记录对应 1 个安全对象;每个对象可以:①继承父 SD;②使用显式 SD(禁用继承)。
继承两种模式
- 启用继承(默认):子对象从直接父对象复制继承 ACE(标记
INHERITED_ACE);父改权限,子自动刷新继承 ACE。 - 禁用继承:
- 模式 A:复制继承 ACE 转为本对象显式 ACE(对应
icacls /inheritance:d) - 模式 B:完全删除所有继承 ACE,对象只保留手动新增显式 ACE(
icacls /inheritance:r)
- 模式 A:复制继承 ACE 转为本对象显式 ACE(对应
关键点:继承只来自直接父目录,不是卷根直接全局下发;每一层可以切断继承,生成独立 SD。
完整访问判决栈(SRM 判决多层判断顺序,非常重要)
当进程访问一个 NTFS 文件,SRM 按顺序逐层判断:
- 进程特权校验:是否
SeSecurityPrivilege、SeTakeOwnershipPrivilege等特权;特权可以绕过部分 ACL。 - 判断:当前进程 Token 用户 SID 是否等于对象 Owner SID → 授予 Owner 固有特权(修改权限)
- 加载该对象 DACL 全部 ACE(显式 + 继承 ACE 已经合并在本对象 DACL 内,不是实时向上递归查询父目录!!)
- 按 ACE 顺序逐条匹配进程 Token 内所有 SID(用户 + 全部所属组 SID)
- 命中拒绝 ACE → 直接拒绝访问,判决结束
- 命中允许 ACE → 累加 AccessMask 权限位
- 遍历全部 ACE 完成;有匹配允许位则放行;无任何允许命中则隐式拒绝。
✅重点误区纠正: ❌错误:访问文件的时候系统一层层向上查询父文件夹权限。 ✅正确:禁用 / 启用继承时,子对象就已经把继承 ACE 复制到自身 DACL;访问时只读取当前对象自己 DACL,不向上遍历父目录。父目录权限变更后,会向下传播更新子对象继承 ACE 缓存。
四、完整模型层级总表(由外到内,从系统到 ACE 位掩码)
0层:Windows安全子系统 SRM 安全参考监视器(内核,全局判决层)
↓
1层:NTFS卷 $Secure 安全描述符存储池(SD全局去重存储)
↓
2层:MFT文件记录:每个文件/文件夹引用一条SD(卷根L0,目录L1,子目录L2,文件L3…无限逻辑嵌套)
├─ SD.Owner / SD.Group
├─ SD.DACL → 第3层
│ ├─ ACE[0] 显式拒绝
│ ├─ ACE[1] 显式允许
│ ├─ ACE[2] 继承拒绝
│ └─ ACE[3] 继承允许 → 第4层
│ ├─ ACE标志位(OI/CI/IO/NP/INHERITED_ACE)
│ ├─ Trustee SID
│ └─ AccessMask 32bit位掩码(第5层,最小权限单元)
└─ SD.SACL(审计)
- 逻辑目录嵌套层级:理论无上限,受 Windows 最大路径长度限制;
- 权限模型内部数据嵌套一共 6 层:SRM → 卷 SD 存储池 → SD 安全描述符 → DACL 数组 → ACE 条目 → AccessMask 位掩码。
AccessMask 32 位掩码(最小权限单元,第 5 层)
32bit 每一位代表一项原子权限: RD(读数据)、WD(写数据)、AD(追加)、X(执行遍历)、DC(删除子项)、DE(删除)、RC(读取控制)、WDAC(写入DACL)、WO(写入Owner)等。 简易缩写F M RX R W D是多个 bit 的组合别名。
五、依赖文件
| 组件 | 作用 |
|---|---|
| ntfs.sys | 内核驱动;MFT 读写;$Secure 卷存储;SD 加载 |
| advapi32.dll | 用户态 API:GetNamedSecurityInfo / SetNamedSecurityInfo |
| lsass.exe | SID、用户组 Token 解析;登录 Token 生成 |
| srms.sys | 安全参考监视器内核模块,访问判决核心 |
六、逻辑链路(修改权限完整时序)
- icacls / GUI / PowerShell 调用
SetNamedSecurityInfo - advapi32.dll 传递 SD 结构到内核
- ntfs.sys 写入 / 复用 $Secure 池内 SD;更新 MFT 记录 SD 索引
- 如果开启继承:向所有子对象下发通知,刷新子对象内部继承 ACE 缓存
- 后续访问文件:SRM 读取当前对象自身 DACL 做判决,不再访问父目录
坑:大量目录递归修改权限,会触发大规模子对象继承 ACE 刷新,IO 极高。
七、边界约束
- 继承是 “向下复制缓存”,不是实时向上查询。切断继承之后,父目录权限变更不再影响该对象。
- Owner 特权独立 DACL 存在;即使 DACL 全部拒绝,Owner 可以修改权限,但不代表可以直接读写文件数据。
- 继承标志
NP(NoPropagateInherit):本对象 ACE 只直接子一级生效,不再向更深层级嵌套传递。 - ReFS 复用完全一样 SD 权限模型;FAT32 无 SD 结构,ACL 完全无效。
- 符号链接:可以设置自身 SD;访问时默认解析到目标对象,使用目标对象 SD 判决。
- 孤立 SID:SID 在本地 / 域不存在,但 ACE 条目仍然保留在 DACL 中,会造成权限异常。
八、配套链 & 自动化流水线
运维工具对应模型操作
- takeown.exe:只修改 SD.Owner(第 2 层 SD 字段),不动 DACL/ACE。
- icacls.exe:读写 DACL、ACE 标志位、AccessMask;控制继承传播。
- PowerShell
Get‑Acl:完整读取 SD 全部字段,包括 SACL;输出 SDDL 字符串(SD 完整文本序列化)。 - icacls
/verify:校验 DACL 内 ACE 排序是否符合 SRM 规范。
PowerShell 查看完整层级结构示例
#读取完整SD对象
$acl = Get‑Acl "D:\test" -Audit
#输出SDDL文本,可以看到完整Owner/DACL/SACL全部层级编码
$acl.Sddl
#枚举每一条ACE
$acl.Access | Format‑Table
SDDL 简短示例(直观看到模型序列化)
O:S‑1‑5‑32‑544G:S‑1‑5‑32‑544D:(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)
O=Owner SID
G=Group SID
D=DACL部分;每条(A=允许;OICI标志;FA完全访问;;SID)
Windows NTFS 访问控制全套原生工具栈(Win10/Win11‑2026 最新)
分析框架:底层原理|依赖文件|依赖关系|逻辑链路|配套链|边界|自动化 工具全集:
icacls.exe、takeown.exe、cacls.exe(废弃)、资源管理器安全 GUI、PowerShellGet‑Acl/Set‑Acl;底层统一基于 Windows 安全参考监视器 SRM + NTFS 安全描述符 SD。
一、底层原理
1. NTFS 安全描述符 SD(存储于卷元文件$Secure,去重存储)Microsoft ...
四元组结构:
Owner:所有者 SID;所有者固有特权:无视 DACL 拒绝,具备修改 SD 权限Group:主组(Windows 极少使用)DACL自主访问控制列表:控制谁读 / 写 / 执行;icacls /save仅保存 DACLSACL系统审计 ACL:记录访问审计事件;icacls 不读写 SACL
2. 安全子系统内核模型
- SRM 安全参考监视器:内核态,所有 ACL 校验、特权校验统一入口;
- 特权:
SeTakeOwnershipPrivilege(夺取所有权)、SeRestorePrivilege(设置所有者),必须管理员提升 Token 才会启用;UAC 过滤管理员 Token 默认不携带完整特权博客园。 - ACE 强制排序(GUI/icacls/PowerShell 全部遵循):
- 显式拒绝 ACE
- 显式允许 ACE
- 继承拒绝 ACE
- 继承允许 ACE
- MIC 强制完整性控制:低完整性进程不能写入高完整性对象;由 icacls
/setintegritylevel管理。 - SDDL 字符串:安全描述符文本序列化格式(O:/G:/D:/S:),PowerShell 原生支持,可完整保存 Owner/DACL/SACL。
3. 各工具定位
| 工具 | 定位 |
|---|---|
| icacls.exe | 现代命令行,DACL、继承、MIC 完整性、DACL 备份还原;不能强制夺取 Owner |
| takeown.exe | 仅修改 SD.Owner;解锁权限锁死对象;只改所有者,DACL 不变 |
| cacls.exe | 废弃遗留;不支持 MIC、精细继承、备份还原;仅兼容旧脚本Microsoft ... |
| 资源管理器安全 UI | 图形外壳;aclui.dll 封装,底层复用 advapi32 API;适合单点调试,不适合批量 |
| PowerShell Get‑Acl / Set‑Acl | .NET 包装原生 Win32 安全 API;唯一原生可完整读写 Owner+DACL+SACL+MIC 的系统组件,弥补 icacls 备份短板 |
二、依赖文件
| 组件 | 程序路径 | 核心依赖 |
|---|---|---|
| icacls.exe | C:\Windows\System32\icacls.exe |
advapi32.dll、aclui.dll、lsass.exe、ntfs.sys |
| takeown.exe | C:\Windows\System32\takeown.exe |
advapi32.dll、lsass.exe、ntfs.sys |
| cacls.exe | C:\Windows\System32\cacls.exe |
advapi32.dll、lsass.exe、ntfs.sys |
| 资源管理器安全 UI | explorer.exe + aclui.dll 对话框 | explorer.exe、aclui.dll、advapi32.dll、lsass.exe、ntfs.sys |
| PowerShell ACL Cmdlet | System.Security.AccessControl(.NET) | advapi32.dll、lsass.exe、ntfs.sys |
公共依赖释义
advapi32.dll:Win32 安全 APIGetNamedSecurityInfo/SetNamedSecurityInfo,读写对象安全描述符 SD。lsass.exe:SID ↔ 用户 / 组名双向翻译;本地 SAM、域账号解析;域离线输出原始 SID 字符串。ntfs.sys:内核驱动,操作卷$Secure元数据,MFT 安全描述符持久化、内核访问校验。aclui.dll:权限掩码、继承标记解析、GUI 对话框渲染;takeown 不加载该 DLL。
三、依赖关系(调用链路)
takeown.exe
takeown.exe 参数解析 /f /r /c
↓
启用特权 SeTakeOwnershipPrivilege + SeRestorePrivilege
↓
advapi32.dll::SetNamedSecurityInfo 修改SD.Owner字段
↓
lsass.exe 获取当前进程用户SID
↓
系统调用 → ntfs.sys写入卷$Secure元数据更新安全描述符
icacls.exe
icacls.exe 参数解析 /grant /deny /save /restore /inheritance /setintegritylevel
↓
advapi32.dll Get/SetNamedSecurityInfo,读写DACL、MIC完整性标签
↓
lsass.exe SID名称转换
↓
ntfs.sys 更新$Secure元数据
↓
控制台输出 / 写入自定义aclfile备份文本(仅DACL)
资源管理器安全 UI
explorer.exe 右键属性‑安全‑高级
↓
aclui.dll渲染权限编辑对话框
↓
aclui.dll内部调用advapi32.dll安全API
↓
lsass SID翻译
↓
ntfs.sys读写SD
PowerShell Get‑Acl / Set‑Acl
PowerShell Cmdlet → .NET System.Security.AccessControl
↓
封装advapi32.dll Win32安全API,支持SDDL完整序列化
↓
lsass SID解析
↓
ntfs.sys读写完整SD(Owner+DACL+SACL+MIC)
运行前置约束
- 必须 NTFS/ReFS;FAT32/exFAT/UDFS 无安全描述符,全部 ACL 操作报错无效Microsoft ...。
- UAC:修改 Owner、批量 ACL 修改必须提升管理员权限;普通过滤管理员 Token 缺少特权,takeown 夺取所有权失败。
- Windows 资源保护 WFP 受保护对象:即使 takeown 接管,修改后 WFP 会自动还原原始权限;系统目录谨慎递归操作。
- 符号链接:
- takeown:无
/L参数,永远跟随目标对象,不能修改链接本身所有者; - icacls:
/L操作符号链接自身; - GUI:默认跟随链接目标。
- takeown:无
四、逻辑链路
标准锁死目录修复时序(生产标准流水线)
1. takeown /f "D:\LockedDir" /r /c
→ 将所有子对象Owner修改为当前管理员SID;DACL完全不变
2. icacls "D:\LockedDir" /reset /t /c
→ 清除显式DACL,恢复父目录继承ACL
3. icacls "D:\LockedDir" /grant Administrators:(F) SYSTEM:(F) /t /c
→ 重新授予业务权限
> 重要:takeown仅改Owner,**夺取所有权不等于获得访问权限,必须后续重设DACL**
备份还原两套链路对比
- icacls
/save→/restore- ✅优点:速度快,原生递归;
- ❌缺陷:只备份 DACL;Owner、SACL 审计、MIC 完整性标签全部丢失,还原不会恢复。
- PowerShell
Export‑CliXml/Import‑CliXml- ✅完整保存 Owner、DACL、SACL、MIC 完整性标签;支持 SDDL 字符串导出;
- ❌大目录批量速度低于 icacls。
继承参数一一映射(GUI ↔ icacls)
| GUI 高级安全设置 | icacls 参数 |
|---|---|
| 禁用继承 → 将继承的权限复制到此对象 | icacls /inheritance:d |
| 禁用继承 → 删除继承的权限 | icacls /inheritance:r |
| 启用继承 | icacls /inheritance:e |
| 重置为父项继承权限 | icacls /reset |
关键能力对照表
| 能力 | icacls.exe | takeown.exe | cacls.exe | 资源管理器 GUI | PowerShell ACL |
|---|---|---|---|---|---|
| 修改对象 Owner | ❌不能强制夺取 | ✅仅修改 Owner | ❌ | ✅ | ✅完整读写 |
| DACL 授权 / 拒绝 ACE | ✅完整 | ❌不处理 DACL | ✅基础 | ✅完整 | ✅完整 |
| OI/CI/NP 精细继承标记 | ✅完整 | ❌ | ❌有限 | ✅完整 | ✅完整 |
| MIC 完整性标签管理 | ✅支持 | ❌ | ❌不识别 | ✅支持 | ✅支持 |
| DACL 备份还原 | ✅(/save /restore) | ❌ | ❌ | ❌ | ✅完整 SD 备份 |
| SACL 审计读写 | ❌不支持 | ❌ | ❌ | ✅图形界面 | ✅原生支持 |
| 符号链接操作 | ✅(/L) | ❌无参数 | ❌ | ❌ | ✅支持 |
五、配套链
系统原生配套
whoami /all:查看当前进程全部特权,校验SeTakeOwnershipPrivilege是否启用。- 安全事件日志:开启 SACL 审计策略后,安全日志记录所有者变更、ACL 修改事件。
- SDDL 字符串:跨机器迁移权限、模板化部署。
运维工作流
- 权限锁死修复流水线:
takeown → icacls /reset → icacls /grant - 批量权限迁移:快速 DACL 备份用
icacls /save;重要生产迁移优先 PowerShell 完整 SD 备份。 - 脚本规范:新脚本禁止使用废弃
cacls.exe,优先 icacls;需要 SACL/Owner 完整备份使用 PowerShell。 - 排错辅助:
icacls /verify扫描不规范乱序 ACL。
六、边界约束(风险坑点汇总)
| 分类 | 边界风险 |
|---|---|
| takeown 边界 | 仅修改 Owner,DACL 保持原样;UAC 未提升管理员,特权缺失直接失败;无符号链接 / L 参数;接管 WFP 系统文件会被 Windows 资源保护自动回滚。 |
| icacls 边界 | /save只保存 DACL,丢失 Owner/SACL/MIC;不能强制夺取所有者;/grant:r仅替换该 SID 显式允许 ACE,不碰拒绝、继承 ACE;/inheritance:d与/inheritance:r极易混淆造成权限丢失。 |
| cacls 边界 | 已废弃;不支持 MIC、高级继承、备份还原;输出文本与 icacls 备份文件互不兼容,禁止新自动化脚本使用。 |
| GUI 边界 | 适合单点调试;海量文件批量修改性能极差;底层行为等价命令行。 |
| PowerShell ACL 边界 | 完整 SD 备份性能弱于 icacls;SDDL 字符串写错直接造成对象完全锁死。 |
| 文件系统边界 | FAT32/exFAT 无安全描述符,全部 ACL 操作无效。 |
| 特权边界 | 修改 Owner、批量 ACL 必须提升管理员;普通用户返回拒绝访问。 |
| 符号链接边界 | takeown 无法修改链接本身所有者;icacls 必须显式/L才操作链接自身。 |
卡脖子痛点
- takeown 执行完成直接访问文件仍然报错,忘记后续 icacls 重设 DACL;
- 将 icacls
/save当作完整安全描述符备份,迁移后丢失所有者、审计 SACL;- 直接递归修改 Windows 系统目录,触发 WFP 回滚,系统组件异常。
七、自动化流水线
批处理模板(锁死目录修复 + DACL 备份)
@echo off
set "TARGET=D:\LockedFolder"
::1.夺取所有者
takeown /f "%TARGET%" /r /c
::2.重置ACL恢复继承
icacls "%TARGET%" /reset /t /c
::3.分配权限
icacls "%TARGET%" /grant Administrators:(F) SYSTEM:(F) /t /c
::4.备份DACL(仅DACL)
icacls "%TARGET%" /save acl_dacl_backup.txt /T /C /Q
PowerShell 完整安全描述备份(弥补 icacls 短板,包含 Owner+DACL+SACL+MIC)
$path = "D:\LockedFolder"
#完整SD备份
Get‑Acl -Path $path -Audit | Export‑CliXml "Full_SD_Backup.xml"
#完整恢复
Import‑CliXml "Full_SD_Backup.xml" | Set‑Acl -Path $path
#导出SDDL字符串模板
$sd = Get‑Acl $path -Audit
$sd.Sddl | Out‑File "sd_template.txt"
PowerShell 批量巡检校验 ACL 规范性
$scanPath = "D:\Data"
& icacls $scanPath /verify /T /C | Out‑File "acl_verify_report.txt"
icacls.exe 深度解构
分析框架:底层原理|依赖文件|依赖关系|逻辑链路|配套链|边界|自动化 定位:Windows NTFS DACL 命令行管理工具,替代已废弃
cacls.exe;负责文件 / 文件夹自主访问控制列表、继承、所有者、强制完整性标签管理;仅作用于 NTFS 文件系统。
一、底层原理
- NTFS 安全描述符 SD (Security Descriptor) 每个文件 / 文件夹在 MFT 主文件表记录内保存安全描述符 SD,结构四元组:
Owner对象所有者 SIDGroup主组 SIDDACL自主访问控制列表(icacls/save只备份这一部分)SACL系统访问控制列表(审计 ACL,icacls 不读写)
⚠️ icacls
/save//restore不保存 / 恢复 Owner、SACL、完整性标签,仅处理 DACL。
- ACE 访问控制项排序规则(Windows 强制校验) icacls 写入 ACL 会自动规范化重排 ACE 顺序,优先级从上到下:
- 显式拒绝 ACE
- 显式允许 ACE
- 继承拒绝 ACE
- 继承允许 ACE 使用
/verify可检测乱序、损坏、格式不规范 ACL。 - 两套权限掩码体系
- 简易缩写:
F完全控制、M修改、RX读取执行、R只读、W写入、D删除;是底层多个位掩码的组合别名。 - 细粒度底层掩码:
DE、RC、WDAC、WO、RD、WD、AD、X、DC,对应 Win32 原生 32 位访问掩码比特。
-
继承标志位(OI/CI/IO/NP/I)
标记 含义 (OI)ObjectInherit 对象继承:子文件继承 ACE (CI)ContainerInherit 容器继承:子文件夹继承 ACE (IO)InheritOnly 仅继承:本对象不生效,仅传给子对象 (NP)NoPropagateInherit:仅下一级,不再深层递归 (I)Inherited:该 ACE 来自父对象继承,非本对象显式 ACE - MIC 强制完整性控制
/setintegritylevel添加强制完整性标签 ACE:L低、M中、H高;低完整性进程不能写入高完整性对象。 - SID 解析机制 支持友好账号名;原始 SID 必须加前缀
*,例*S‑1‑1‑0;本地账号由 LSASS 解析,域 SID 依赖域控。
二、依赖文件
| 文件 | 路径 | 核心职责 |
|---|---|---|
| icacls.exe | C:\Windows\System32\icacls.exe |
主程序,解析命令行参数、业务逻辑、输出控制台 / 备份文件 |
| advapi32.dll | C:\Windows\System32\advapi32.dll |
Win32 安全 API:GetNamedSecurityInfo / SetNamedSecurityInfo;SID 名称转换 API |
| aclui.dll | C:\Windows\System32\aclui.dll |
权限字符串、继承标记 (OI/CI) 解析,与资源管理器安全 UI 共用同一套解析逻辑 |
| ntfs.sys | C:\Windows\System32\drivers\ntfs.sys |
NTFS 内核驱动;读写 MFT 内部安全描述符 SD;内核层访问权限校验 |
| lsass.exe | 系统进程 | SID <--> 用户 / 组名双向翻译;本地安全账号数据库读取;域 SID 需要 RPC 交互域控制器 |
icacls
/save输出的 aclfile:自定义文本格式,不是注册表、不是二进制 SD,只能被 icacls /restore 解析。
三、依赖关系
完整调用链路
icacls.exe 解析命令行参数
↓
advapi32.dll 安全API
↓
├─SID解析 → RPC调用 lsass.exe(本地/域账号解析)
└─GetNamedSecurityInfo / SetNamedSecurityInfo → 系统调用进入内核
↓
ntfs.sys 读写磁盘MFT记录中的安全描述符SD
↓
控制台输出 / 写入aclfile备份文本
运行前置约束
- 文件系统:必须 NTFS;FAT32/exFAT 没有 MFT 安全描述符,ACL 全部操作报错。
- 运行账号权限
- 读取 ACL:对象需要
READ_CONTROL - 修改 DACL(/grant/deny /remove):需要
WRITE_DAC - 修改所有者
/setowner:需要WRITE_OWNER;icacls 不会强制夺取所有权,权限不足直接失败,必须搭配 takeown.exe。
- 读取 ACL:对象需要
- 符号链接:默认跟随链接指向的目标;
/L参数才操作符号链接本身。 - 域环境:离线断网时,域 SID 无法翻译,输出原始 SID 字符串。
四、逻辑链路(子命令执行时序)
1. icacls name /save aclfile [/T /C /L /Q]
/T开启递归,遍历目录树所有对象;- 调用
GetNamedSecurityInfo读取 SD,只提取 DACL,丢弃 Owner/SACL/ 完整性标签; - 将对象路径、ACE 条目、继承标记写入自定义文本 aclfile。
2. icacls directory /restore aclfile [/substitute SidOld SidNew] [/C /L /Q]
- 读取解析 aclfile 文本;
- 如有
/substitute执行 SID 替换; - 调用
SetNamedSecurityInfo,仅把 DACL 写回 NTFS 对象;不触碰所有者、SACL、完整性标签。
/T在 restore 下无效,备份文件内已记录全部子项路径。
3. /setowner user
- 用户 / 组名解析为 SID;
- 修改 SD 内部 Owner 字段;
边界:无强制夺取权限;权限不足直接报错,需要前置 takeown。
4. /grant[:r] Sid:perm
- 不带
:r:叠加模式,新增 ACE,原有显式允许 ACE 保留; - 带
:r:替换模式,清除该 SID 全部显式允许 ACE,只保留本次授予权限,不修改拒绝、继承 ACE; - 构造 ACE 加入 DACL,icacls 自动规范化重排 ACE 顺序。
5. /deny Sid:perm
新增显式拒绝 ACE;拒绝优先级最高;同时清除该 SID 同权限的允许 ACE。
6. /remove[:g|:d] Sid
- 无后缀:删除该 SID 全部 ACE(允许 + 拒绝)
:g:仅删除允许 ACE:d:仅删除拒绝 ACE
7. /inheritance:e|d|r
e:启用继承,恢复继承父目录 DACL;d:禁用继承,把继承 ACE 复制为本对象显式 ACE(GUI:禁用继承→复制权限)r:禁用继承,彻底删除全部继承 ACE(GUI:禁用继承→删除继承权限)
8. /reset
清除本对象所有显式 DACL;完全使用父目录继承下来的 ACL。
9. /findsid /verify
/findsid Sid:递归扫描,找出 DACL 中显式包含该 SID 的文件;/verify:扫描 ACL 是否乱序、ACE 计数异常,识别损坏不规范 ACL。
10. /setintegritylevel
向 SD 添加 MIC 强制完整性 ACE,控制低完整性进程访问权限。
通用参数逻辑
/T:递归本目录及子文件子文件夹执行操作;/C:遇到访问拒绝、错误不终止整体任务,输出错误继续执行;/L:操作符号链接本身,而不是链接指向目标;/Q:静默模式,屏蔽成功输出,仅输出错误信息。
五、配套链
系统原生配套工具
- takeown.exe:夺取对象所有者;处理权限锁死目录标准流程:
takeown → icacls;icacls 无法强制夺取所有权。 - cacls.exe:旧版废弃工具;不支持完整性标签、精细继承控制、备份还原。
- 资源管理器安全 UI:文件夹属性→安全→高级安全设置;底层复用
advapi32.dll+aclui.dll同一套 API。
脚本配套组件
- PowerShell
Get‑Acl / Set‑Acl:.NET 封装同一套 Win32 安全 API;可以完整备份Owner+DACL+SACL 完整性标签,弥补 icacls/save缺失项。 - 备份还原组合工作流
- icacls
/save:快速批量备份 DACL; - PowerShell Export‑CliXml:完整全量安全描述符 SD 备份。
- icacls
标准运维流水线(修复权限锁死目录)
takeown /f "D:\target_dir" /r /c
icacls "D:\target_dir" /reset /t /c
icacls "D:\target_dir" /grant Administrators:(F) SYSTEM:(F) /t /c
六、边界约束(坑点汇总)
| 边界分类 | 风险说明 |
|---|---|
| 备份还原边界 | /save只保存 DACL;所有者、SACL 审计、完整性标签不会备份,restore 不会恢复,运维高频踩坑。 |
| 所有者边界 | /setowner不能强制夺取所有权;权限不足直接失败,必须前置 takeown.exe。 |
| 继承参数混淆 | /inheritance:d复制继承 ACE;/inheritance:r直接删除继承 ACE,两个参数行为差异巨大。 |
| SID 格式坑 | 数字 SID 必须前缀*,如*S‑1‑1‑0,缺少 * 会解析失败。 |
| 符号链接边界 | 默认跟随链接目标;修改链接本身权限必须加/L。 |
| ACE 自动重排 | 手动构造乱序 DACL,icacls 写入时自动规范化排序;/verify用于检测异常 ACL。 |
| 共享权限隔离 | icacls 只操作NTFS 本地 ACL,完全不处理 SMB 共享权限;网络访问有效权限 = NTFS ACL ∩ 共享权限。 |
| 拒绝 ACE 副作用 | /deny添加显式拒绝,优先级最高;大量拒绝 ACE 会造成排错困难,尽量少用。 |
:r替换范围 |
/grant:r只替换该 SID显式允许 ACE,不碰拒绝 ACE、继承 ACE。 |
| 文件系统限制 | FAT32/exFAT 没有安全描述符,ACL 全部命令报错。 |
卡脖子痛点:
- 误以为
/save完整备份全部安全属性,丢失所有者、审计 SACL;- 锁死对象直接调用 icacls 改所有者,忘记 takeown 全部操作失败;
d与r继承参数混淆,造成权限意外丢失。
七、自动化流水线(批处理 + PowerShell)
批处理模板
::备份DACL
icacls "D:\MyData" /save acl_backup.txt /T /C /Q
::还原DACL
icacls "D:\" /restore acl_backup.txt /C /Q
::授予管理员完全控制(替换原有显式权限)
icacls "D:\MyData" /grant:r Administrators:(F) SYSTEM:(F) /T /C
::禁用继承,复制继承ACE为显式权限
icacls "D:\MyData" /inheritance:d
::删除Everyone全部ACE
icacls "D:\MyData" /remove Everyone /T /C
::设置中等完整性级别
icacls "D:\MyData" /setintegritylevel M /T
PowerShell 脚本
$path = "D:\MyData"
#导出icacls权限报告
& icacls $path /T /C | Out‑File "acl_report.txt"
#校验ACL规范性
& icacls $path /verify /T /C
#修复锁死目录
takeown /f $path /r /c
icacls $path /reset /t /c
icacls $path /grant Administrators:(F) SYSTEM:(F) /t /c
完整安全描述备份(弥补 icacls 缺陷,包含 Owner/DACL/SACL)
#完整SD备份
Get‑Acl $path -Audit | Export‑CliXml "Full_SecurityDescriptor.xml"
#完整SD恢复
Import‑CliXml "Full_SecurityDescriptor.xml" | Set‑Acl $path
icacls.exe + takeown.exe + cacls.exe + 资源管理器安全 UI 完整解构
分析框架:底层原理|依赖文件|依赖关系|逻辑链路|配套链|边界|自动化 定位:Windows NTFS 访问控制全套原生工具栈。
icacls.exe:现代命令行 DACL / 继承 / 完整性标签管理takeown.exe:仅修改安全描述符 Owner 所有者 SID,用于解锁权限锁死对象cacls.exe:遗留兼容工具,功能残缺已废弃- 资源管理器安全 UI:图形交互外壳,底层和命令行共用同一套安全 API
一、底层原理
NTFS 安全描述符 SD 基础模型
SD 四元组:Owner(所有者SID) | Group | DACL自主访问控制列表 | SACL审计ACL
- Owner 特权规则:无论 DACL 如何拒绝,对象所有者天然拥有
WRITE_OWNER权限,可以重设 ACL;这是takeown能够解锁文件的理论基础。 takeown.exe只改写 Owner 字段,不改动 DACL、SACL、完整性标签。夺取所有权之后,再交由icacls.exe修改 DACL 权限。icacls.exe:操作 DACL、继承、MIC 完整性标签;没有能力强制修改 Owner,没有 SE_RESTORE 特权时直接报错。cacls.exe:仅能读写基础 DACL;不识别 MIC 完整性标签、高级继承标志OI/CI/NP,无备份还原能力。- 资源管理器安全 UI:
aclui.dll做界面封装,不实现权限内核逻辑;读写 SD 全部转发advapi32.dll;GUI “禁用继承” 两个选项与 icacls 参数一一对应:- 复制继承权限 →
icacls /inheritance:d - 删除继承权限 →
icacls /inheritance:r
- 复制继承权限 →
- ACE 规范化排序(四阶顺序,命令行与 GUI 统一)
- 显式拒绝 ACE
- 显式允许 ACE
- 继承拒绝 ACE
- 继承允许 ACE
二、依赖文件
| 组件 | 程序路径 | 核心依赖 |
|---|---|---|
| icacls.exe | %SystemRoot%\System32\icacls.exe |
advapi32.dll、ntfs.sys、lsass.exe、aclui.dll(字符串解析) |
| takeown.exe | %SystemRoot%\System32\takeown.exe |
advapi32.dll、ntfs.sys、lsass.exe |
| cacls.exe | %SystemRoot%\System32\cacls.exe |
advapi32.dll、ntfs.sys、lsass.exe |
| 资源管理器安全 UI | explorer.exe + aclui.dll 对话框 | explorer.exe、aclui.dll、advapi32.dll、ntfs.sys、lsass.exe |
公共依赖说明
advapi32.dll:提供 Win32 安全 APIGetNamedSecurityInfo/SetNamedSecurityInfo,读写 NTFS 对象安全描述符 SD。lsass.exe:SID ↔ 用户 / 组名双向解析;本地 SAM 账号、域账号翻译。ntfs.sys:内核驱动,MFT 记录持久化 SD,内核态访问权限校验。aclui.dll:权限掩码、继承标记解析与图形对话框渲染;takeown不加载此模块。
三、依赖关系
调用链路
takeown.exe
takeown.exe 解析命令行参数 /f /r /c
↓
advapi32.dll::SetNamedSecurityInfo 仅修改SD.Owner字段
↓
lsass.exe 解析当前进程Token得到当前用户SID
↓
系统调用进入内核 → ntfs.sys 将Owner SID写入MFT
icacls.exe
icacls.exe 参数解析(/grant /deny /save /restore /inheritance…)
↓
advapi32.dll Get/SetNamedSecurityInfo 读写SD(DACL、MIC完整性标签)
↓
lsass.exe SID名称转换
↓
ntfs.sys MFT读写安全描述符
cacls.exe
cacls.exe 参数解析
↓
advapi32.dll 仅读写DACL,忽略MIC标签,继承支持有限
↓
lsass SID解析
↓
ntfs.sys MFT读写
资源管理器安全 UI
explorer.exe 右键→属性→安全→高级
↓
加载aclui.dll渲染权限编辑对话框
↓
aclui.dll内部调用advapi32.dll安全API
↓
lsass SID翻译
↓
ntfs.sys 读写MFT安全描述符SD
前置运行条件
- 文件系统必须为NTFS;FAT32/exFAT 不存在安全描述符,全部 ACL 相关操作报错无效。
takeown.exe需要管理员提升权限,需要开启特权SE_RESTORE_NAME;普通过滤管理员 Token 无法夺取所有者。- icacls 修改 DACL 需要对象
WRITE_DAC权限;修改 Owner 需要WRITE_OWNER;无特权时不能强制夺取所有者。 - 域环境离线场景:域 SID 无法解析,界面与命令行直接输出原始 SID 字符串。
- 符号链接:
- takeown:无
/L参数,总是跟随符号链接目标,不能修改链接本身所有者; - icacls:提供
/L,可操作符号链接自身; - 资源管理器:默认跟随符号链接目标。
- takeown:无
四、逻辑链路
标准解锁时序(权限锁死目录完整流水线)
1. takeown /f "D:\LockedDir" /r /c
→ 修改全部子对象Owner为当前管理员SID,DACL保持原样
2. icacls "D:\LockedDir" /reset /t /c
→ 清除显式DACL,恢复父目录继承ACL
3. icacls "D:\LockedDir" /grant Administrators:(F) SYSTEM:(F) /t /c
→ 重新授予业务需要的访问权限
各工具能力对比
| 能力 | icacls.exe | takeown.exe | cacls.exe | 资源管理器安全 UI |
|---|---|---|---|---|
| 修改 Owner 所有者 | ❌不能强制夺取 | ✅仅修改 Owner | ❌不支持 | ✅支持 |
| DACL 读写、授权拒绝 | ✅完整支持 | ❌不处理 DACL | ✅基础支持 | ✅完整支持 |
| 继承精细控制 OI/CI/NP | ✅完整 | ❌ | ❌有限 | ✅完整 |
| 完整性 MIC 标签 | ✅支持 | ❌ | ❌不识别 | ✅支持 |
| DACL 备份 /restore 还原 | ✅支持 | ❌ | ❌ | ❌ |
| 符号链接操作 (/L) | ✅支持 | ❌无参数 | ❌ | ❌ |
关键行为边界
takeown执行完成不等于拥有访问权限,必须后续 icacls 修改 DACL 才可以正常读写文件。- icacls
/save只备份 DACL;Owner、SACL、MIC 标签不保存。 - cacls 输出文本格式与 icacls 备份文件互不兼容,不可混用还原。
五、配套链
系统原生配套
- PowerShell
Get‑Acl / Set‑Acl:.NET 封装同一套 Win32 安全 API;可完整备份 SD 全部字段(Owner+DACL+SACL+MIC),弥补 icacls 备份缺陷。 - 事件日志:安全日志可以记录对象所有者变更、ACL 修改审计(需要开启 SACL 审计策略)。
运维配套工作流
- 锁死目录修复流水线:
takeown → icacls /reset → icacls /grant - 批量权限迁移:icacls
/save备份 DACL;目标机器/restore恢复;重要场景搭配 PowerShell 做完整 SD 备份。 - 脚本兼容:新脚本禁止使用 cacls.exe,统一使用 icacls.exe。
六、边界约束(风险坑点)
| 分类 | 边界风险 |
|---|---|
| takeown 边界 | 只改 Owner,DACL 不变;UAC 未提升管理员,夺取所有者直接失败;无符号链接 / L 参数。 |
| icacls 边界 | /save不保存 Owner/SACL/ 完整性标签;不能强制夺取所有者;/grant:r仅替换显式允许 ACE;/inheritance:d与/inheritance:r极易混淆。 |
| cacls 边界 | 已废弃;不支持 MIC、高级继承、备份还原;不要在新自动化脚本中使用。 |
| GUI 边界 | 图形界面操作本质等价命令行;大量文件批量修改 GUI 性能极差,适合单点调试,批量优先命令行。 |
| 文件系统边界 | FAT32/exFAT 无安全描述符,全部 ACL 操作无效。 |
| 特权边界 | 修改 Owner、批量 ACL 修改,都需要提升管理员权限;普通用户会出现拒绝访问。 |
| 符号链接 | takeown 无法修改链接本身所有者,只能修改目标;icacls 需要显式/L。 |
卡脖子痛点:
- 执行 takeown 之后直接访问文件仍然报错,忘记后续 icacls 重设 DACL;
- 使用 icacls 尝试直接修改锁死对象所有者,操作失败;
- 把 icacls
/save当做完整安全描述符备份,迁移后丢失所有者、审计标签。
七、自动化流水线
批处理完整解锁模板
@echo off
set "TARGET=D:\LockedFolder"
::1.夺取所有者
takeown /f "%TARGET%" /r /c
::2.重置ACL,恢复继承
icacls "%TARGET%" /reset /t /c
::3.授予管理员、系统完全控制
icacls "%TARGET%" /grant Administrators:(F) SYSTEM:(F) /t /c
::4.备份DACL
icacls "%TARGET%" /save acl_backup.txt /T /C /Q
PowerShell 完整 SD 备份(弥补 icacls 备份缺陷)
$path = "D:\LockedFolder"
#完整安全描述备份,包含Owner、DACL、SACL、完整性标签
Get‑Acl -Path $path -Audit | Export‑CliXml Full_SD_Backup.xml
#完整恢复
Import‑CliXml Full_SD_Backup.xml | Set‑Acl -Path $path
PowerShell 批量巡检
$scanPath = "D:\Data"
& icacls $scanPath /verify /T /C | Out‑File acl_verify_report.txt




Windows NTFS 文件 / 文件夹安全 ACL 权限(截图界面完整解构)
分析框架:底层原理|依赖文件|依赖关系|逻辑链路|配套链|边界|自动化 截图序列:①文件夹属性‑安全选项卡 →②高级安全设置 →③权限项目编辑窗口;对象路径:
C:\Users\Administrator\Desktop\优化条目,NTFS 访问控制列表 ACL 图形编辑器。
一、底层原理
- NTFS 元数据层面:每个文件 / 文件夹都存在一个安全描述符 SD (Security Descriptor),存储于 MFT 主文件表记录内部;安全描述符包含:所有者 SID、组 SID、DACL 自主访问控制列表、SACL 系统访问控制列表(审计)。
- DACL(自主访问控制列表):就是截图中一条条权限条目,每条 ACE 访问控制项包含:主体 SID (用户 / 组)、类型 (允许 / 拒绝)、访问掩码 (权限位)、继承标志、应用于范围。
- 截图②可见:
继承于:C:\Users\Administrator\,权限从父文件夹继承而来;应用于:此文件夹、子文件夹和文件控制继承传播。
- 截图②可见:
- 权限计算逻辑
- 拒绝 ACE 优先级 > 允许 ACE;只要存在拒绝,优先拦截访问。
- 先评估本对象 ACE,再评估继承下来 ACE;用户有效权限 = 用户 SID + 用户所属全部组 SID 合并后的权限集合。
- 所有者 (Owner) 特权:截图②所有者是
Administrators,对象所有者可以无视 DACL,修改权限,这是 Windows 权限体系非常关键的后门机制。
- 继承机制:新建对象默认继承父目录 DACL;点击【禁用继承】可以切断继承,二选一:复制继承权限 / 删除继承权限。
- 访问掩码:截图③基本权限是高层封装;底层是32 位 bit 位掩码,完全控制、修改、读取执行都是多个底层 bit 的组合;点击「显示高级权限」可以看到原始细粒度 bit 权限。
注意:共享权限和 NTFS ACL 是两套独立权限;最终有效权限取两者交集,截图是 NTFS 本地 ACL,不是共享权限。
二、依赖文件
| 文件 / 组件 | 路径 | 作用 |
|---|---|---|
ntfs.sys |
%SystemRoot%\System32\drivers\ntfs.sys |
NTFS 内核驱动,读写 MFT 里面安全描述符 SD;内核完成访问权限校验 |
aclui.dll |
%SystemRoot%\System32\aclui.dll |
截图全部安全 UI 对话框实现:属性安全页、高级安全设置、编辑权限项目全部由这个 DLL 渲染 |
advapi32.dll |
%SystemRoot%\System32\advapi32.dll |
Win32 安全 API:GetNamedSecurityInfo / SetNamedSecurityInfo 获取、设置对象安全描述符 SD |
lsass.exe |
系统进程 | SID 解析、用户名‑SID 互相转换、用户组成员 SID 展开,UI 把 SID 翻译为人可读账号名称 |
| MFT($MFT) | NTFS 卷元数据,无直接文件路径 | 每个文件记录里面存储 Security Descriptor 安全描述符 |
注册表无直接存储:NTFS 安全描述符保存在磁盘 MFT,不在注册表。
三、依赖关系
完整调用链路(打开截图安全属性窗口)
资源管理器explorer.exe 右键文件夹 → 属性 → 安全选项卡
↓
explorer 加载 aclui.dll (ACL图形UI组件,截图全部窗口由它绘制)
↓
aclui.dll 调用 advapi32.dll API GetNamedSecurityInfoW
↓
内核转发到 ntfs.sys,读取磁盘MFT内该文件夹的安全描述符SD(DACL/所有者/SACL)
↓
aclui.dll RPC调用 lsass.exe:把SID翻译为用户名/组名,填充界面列表
↓
用户编辑权限、点应用 → SetNamedSecurityInfoW → ntfs.sys 将新SD写回MFT记录
外部依赖
- 文件系统必须是 NTFS;FAT32/exFAT 无安全描述符,安全选项卡会直接灰掉不可用。
- lsass.exe 正常运行:SID‑用户名解析依赖 lsass;lsass 异常界面会显示 SID 字符串而不是中文账号名。
- 权限依赖:修改 ACL / 所有者,需要对象 WRITE_DAC 权限;修改所有者需要 WRITE_OWNER 权限;普通读取安全页只需要 READ_CONTROL。
- 继承依赖:父文件夹存在有效的 DACL;新建对象默认继承父 ACE。
- 域环境:域 SID 需要域控制器解析账号名称;断网会显示 SID。
四、逻辑链路(时序,对应三张截图操作)
- 第一幅截图【属性‑安全】: explorer 加载 aclui.dll,读取 MFT 安全描述,解析 DACL,展示组或用户名列表,展示简化后的基础权限勾选框;点击【编辑】进入权限修改;点击【高级 (V)】跳转第二张截图高级安全设置。
- 第二幅截图【高级安全设置】
- 展示所有者、审核 SACL、完整 ACE 权限条目;每一条 ACE 显示:主体、类型、访问权限、继承来源、应用于范围。
- 【禁用继承】:切断来自父文件夹的权限继承;
- 选中 ACE,点击【编辑】,跳转第三张截图权限项目窗口。
- 第三幅截图【权限项目】
- 主体:用户 / 组 SID;类型:允许 / 拒绝;应用于:控制继承传播范围(此文件夹 / 子文件夹 / 文件)。
- 基本权限是高层封装;点击【显示高级权限】展开底层细粒度 bit 掩码。
- 勾选 / 取消权限 → 确定,构造新 ACE,写回对象 DACL。
- 点击全部窗口「应用」:调用
SetNamedSecurityInfo将新安全描述符 SD 写入 NTFS MFT。
关键边界逻辑
- 继承于字段:代表这条 ACE 不是本对象显式设置,复制自父目录;禁用继承后该字段消失。
- 应用于:控制 ACE 向下传播到子文件夹、子文件;是 NTFS 继承体系核心。
- 所有者权限:哪怕 DACL 全部拒绝,对象所有者依然可以修改权限;这是 Windows 设计,用于防止彻底锁死对象。
五、配套链
- 图形配套
cacls.exe:旧版命令行 ACL 工具,已逐步废弃。icacls.exe:现代 Windows ACL 命令行工具,查询、设置、备份、恢复 NTFS 权限。
- 编程接口
- Win32 API:
GetNamedSecurityInfo/SetNamedSecurityInfo - PowerShell:
Get‑Acl/Set‑Acl,封装上面 Win32 API,脚本自动化操作 ACL。
- 运维配套
- icacls 支持导出权限备份:
icacls 路径 /save acl_backup.txt,可恢复权限。 - 取得所有权:需要先修改所有者,才能修改被锁死对象 ACL。
六、边界约束 & 坑点
| 边界分类 | 详细说明 |
|---|---|
| 文件系统边界 | FAT32/exFAT 无 SD 安全描述符,安全选项卡灰色;仅 NTFS 支持完整 ACL。 |
| 继承坑点 | 子对象 “不继承”;复制 / 移动文件夹权限行为不同:同卷移动保留原 ACL;跨卷复制继承目标父文件夹 ACL。 |
| 拒绝 ACE 优先级 | 拒绝条目优先级高于允许;GUI 顺序不影响计算结果,很多人误以为列表从上到下判断,实际不是顺序匹配。 |
| 所有者边界 | 对象所有者可以绕过 DACL 拒绝,修改权限;即使 DACL 全部拒绝访问,所有者依然可以编辑安全。 |
| 应用于边界 | 「仅将这些权限应用到此容器中的对象和 / 或容器」= 只给子对象,本对象不生效,容易配置错。 |
| 共享 + NTFS 交集 | 网络访问时,有效权限 = NTFS ACL 和 共享权限两者取最小交集;很多故障只改 NTFS 忽略共享权限。 |
| SID 失效坑点 | 账号删除后,ACE 残留孤立 SID;UI 显示 SID 一串数字,无用户名。 |
| 加密 EFS 边界:EFS 加密文件,ACL 控制访问,但解密还需要用户 EFS 证书私钥,ACL 不能控制解密行为。 |
卡脖子痛点
- 文件夹移动复制,继承行为不符合预期,权限错乱;
- 只看 DACL,忽略所有者特权,以为设置拒绝就完全锁死;
- 混淆「共享权限」和「NTFS 本地 ACL」,网络访问权限故障。
七、自动化流水线(PowerShell + icacls)
1、读取文件夹 NTFS 安全描述 ACL(替代 GUI 查看)
$path = "C:\Users\Administrator\Desktop\优化条目"
Get-Acl -Path $path | Format-List
# 查看详细ACE条目
(Get-Acl $path).Access
2、icacls 查询权限(命令行)
icacls "C:\Users\Administrator\Desktop\优化条目"
3、备份整个目录树 ACL 权限
icacls "C:\Users\Administrator\Desktop\优化条目" /save acl_backup.txt /t
4、恢复 ACL 备份
icacls "C:\Users\Administrator\Desktop\" /restore acl_backup.txt
5、PowerShell 添加一条允许 ACE(读取和执行,对应截图③勾选状态)
$path = "C:\Users\Administrator\Desktop\优化条目"
$acl = Get‑Acl $path
$identity = "Everyone"
# 权限:读取和执行,列出文件夹内容,读取
$rights = "ReadAndExecute, ListDirectory, Read"
$accessRule = New‑Object System.Security.AccessControl.FileSystemAccessRule($identity,$rights,"ContainerInherit,ObjectInherit","None","Allow")
$acl.AddAccessRule($accessRule)
Set‑Acl -Path $path -AclObject $acl
6、禁用继承,复制已继承权限到本对象
$acl = Get‑Acl $path
# 参数 $true = 将继承ACE复制为本对象显式ACE;$false = 删除继承权限
$acl.SetAccessRuleProtection($true,$true)
Set‑Acl -Path $path -AclObject $acl
说明:
SetAccessRuleProtection($isProtected,$preserveInheritance)等价 GUI【禁用继承】的两个选项。

ICACLS命令 高级的文件和文件夹权限管理工具,支持更多功能
——————————————————————————————————————————————————————————————
ICACLS name /save aclfile [/T] [/C] [/L] [/Q]
将匹配名称的文件和文件夹的 DACL 存储到 aclfile 中以便将来与 /restore 一起使用。请注意,未保存 SACL、所有者或完整性标签。
ICACLS directory [/substitute SidOld SidNew [...]] /restore aclfile [/C] [/L] [/Q]
将存储的 DACL 应用于目录中的文件。
ICACLS name /setowner user [/T] [/C] [/L] [/Q]
更改所有匹配名称的所有者。该选项不会强制更改所有身份;使用 takeown.exe 实用程序可实现该目的。
ICACLS name /findsid Sid [/T] [/C] [/L] [/Q]
查找包含显式提及 SID 的 ACL 的所有匹配名称。
ICACLS name /verify [/T] [/C] [/L] [/Q]
查找其 ACL 不规范或长度与 ACE计数不一致的所有文件。
ICACLS name /reset [/T] [/C] [/L] [/Q]
为所有匹配文件使用默认继承的 ACL 替换 ACL。
ICACLS name [/grant[:r] Sid:perm[...]]
[/deny Sid:perm [...]]
[/remove[:g|:d]] Sid[...]] [/T] [/C] [/L] [/Q]
[/setintegritylevel Level:policy[...]]
/grant[:r] Sid:perm 授予指定的用户访问权限。如果使用 :r,这些权限将替换以前授予的所有显式权限。
如果不使用 :r,这些权限将添加到以前授予的所有显式权限。
/deny Sid:perm 显式拒绝指定的用户访问权限。将为列出的权限添加显式拒绝 ACE,并删除所有显式授予的权限中的相同权限。
/remove[:[g|d]] Sid 删除 ACL 中所有出现的 SID。使用
:g,将删除授予该 SID 的所有权限。使用
:d,将删除拒绝该 SID 的所有权限。
/setintegritylevel [(CI)(OI)]级别将完整性 ACE 显式添加到所有匹配文件。要指定的级别为以下级别之一:
L[ow]
M[edium]
H[igh]
完整性 ACE 的继承选项可以优先于级别,但只应用于目录。
/inheritance:e|d|r
e - 启用继承
d - 禁用继承并复制 ACE
r - 删除所有继承的 ACE
——————————————————————————————————————————————————
注意:
Sid 可以采用数字格式或友好的名称格式。如果给定数字格式,那么请在 SID 的开头添加一个 *。
/T 指示在以该名称指定的目录下的所有匹配文件/目录上执行此操作。
/C 指示此操作将在所有文件错误上继续进行。仍将显示错误消息。
/L 指示此操作在符号链接本身而不是其目标上执行。
/Q 指示 icacls 应该禁止显示成功消息。
————————————————————————————————————————————————————
ICACLS 保留 ACE 项的规范顺序:
显式拒绝
显式授予
继承的拒绝
继承的授予
perm 是权限掩码,可以指定两种格式之一:
简单权限序列:
N - 无访问权限
F - 完全访问权限
M - 修改权限
RX - 读取和执行权限
R - 只读权限
W - 只写权限
D - 删除权限
在括号中以逗号分隔的特定权限列表:
DE - 删除
RC - 读取控制
WDAC - 写入 DAC
WO - 写入所有者
S - 同步
AS - 访问系统安全性
MA - 允许的最大值
GR - 一般性读取
GW - 一般性写入
GE - 一般性执行
GA - 全为一般性
RD - 读取数据/列出目录
WD - 写入数据/添加文件
AD - 附加数据/添加子目录
REA - 读取扩展属性
WEA - 写入扩展属性
X - 执行/遍历
DC - 删除子项
RA - 读取属性
WA - 写入属性
继承权限可以优先于每种格式,但只应用于目录:
(OI) - 对象继承
(CI) - 容器继承
(IO) - 仅继承
(NP) - 不传播继承
(I) - 从父容器继承的权限
————————————————————————————————————————
示例:
icacls c:\windows\* /save AclFile /T
- 将 c:\windows 及其子目录下所有文件的ACL 保存到 AclFile。
icacls c:\windows\ /restore AclFile
- 将还原 c:\windows 及其子目录下存在的 AclFile 内所有文件的 ACL。
icacls file /grant Administrator:(D,WDAC)
- 将授予用户对文件删除和写入 DAC 的管理员权限。
icacls file /grant *S-1-1-0:(D,WDAC)
- 将授予由 sid S-1-1-0 定义的用户对文件删除和写入 DAC 的权限。
icacls.exe 完整解构
分析框架:底层原理|依赖文件|依赖关系|逻辑链路|配套链|边界|自动化 定位:Windows 现代 NTFS DACL 权限命令行工具,替代老旧 cacls.exe;操作 NTFS 安全描述符 DACL,支持备份还原、所有者、完整性标签、继承管理。
一、底层原理
- 内核对象基础 NTFS 每个文件 / 文件夹 MFT 记录存储安全描述符 SD,SD 包含:
Owner(所有者)、Group、DACL自主访问控制列表、SACL审计ACL、完整性标签ACE。
⚠️
/save仅保存 DACL;不保存所有者、SACL 审计、完整性标签,/restore也不会恢复这几项。
- ACE 排序规范(icacls 强制规范) icacls 写入 ACL 时会自动重排 ACE 顺序,Windows 访问校验遵循该优先级:
- 显式拒绝 ACE
- 显式允许 ACE
- 继承拒绝 ACE
- 继承允许 ACE
GUI 高级安全编辑器也遵循这套顺序;乱序 DACL 属于不规范 ACL,
/verify可检测。
- 权限掩码两套体系
- 简易权限缩写:
F完全、M修改、RX读取执行、R只读、W写入、D删除;是多细粒度位的组合封装。 - 细粒度原始位掩码:
DE,RC,WDAC,WO,RD,WD,AD,X,DC…,对应 Win32 底层访问掩码比特位。
-
继承标志位(OI/CI/IO/NP)
标记 含义 (OI)ObjectInherit对象继承:文件继承 ACE (CI)ContainerInherit容器继承:子文件夹继承 ACE (IO)InheritOnly仅继承,本对象不生效,只传给子对象 (NP)NoPropagateInherit不传播继承,只向下一级,不再递归深层 (I)Inherited该 ACE 是继承而来,非本对象显式 ACE - 完整性标签(Mandatory Label) Windows 强制完整性控制 MIC;
/setintegritylevel添加完整性 ACE:Low/Medium/High;低完整性进程无法写入高完整性对象。 - SID 解析:支持账号名,也支持
*S‑1‑xxx原始 SID 数字格式。
二、依赖文件
| 组件 | 路径 | 作用 |
|---|---|---|
icacls.exe |
%SystemRoot%\System32\icacls.exe |
主可执行程序 |
advapi32.dll |
%SystemRoot%\System32\advapi32.dll |
底层 Win32 安全 API:GetNamedSecurityInfo / SetNamedSecurityInfo、SID 转换 API |
aclui.dll |
%SystemRoot%\System32\aclui.dll |
权限掩码、继承标记字符串解析(与资源管理器安全界面共用同一套逻辑) |
ntfs.sys |
%SystemRoot%\System32\drivers\ntfs.sys |
NTFS 内核驱动,读写 MFT 中的安全描述符 SD,执行访问校验 |
lsass.exe |
系统进程 | SID ↔ 用户名 / 组名双向解析;处理本地账号、域账号 SID 翻译 |
备份输出的
aclfile是文本格式自定义格式文件,不是标准注册表,仅能被 icacls/restore读取。
三、依赖关系
调用链路
icacls.exe 命令行参数解析
↓
advapi32.dll Win32安全API
↓
1. SID名称解析 → RPC调用 lsass.exe
2. 获取/设置安全描述符SD → 系统调用转发内核
↓
ntfs.sys 读写磁盘MFT记录内SD(DACL/完整性标签)
↓
输出控制台文本 / 写入aclfile备份文件
前置依赖条件
- 文件系统必须为NTFS;FAT32/exFAT 无安全描述符,icacls 大部分参数报错。
- 运行身份权限:
- 读取 ACL:需要对象
READ_CONTROL权限。 - 修改 DACL (/grant/deny /remove):需要
WRITE_DAC权限。 - 修改所有者
/setowner:需要WRITE_OWNER权限;icacls 不会强制夺取所有权;无法修改时需要配合takeown.exe。
- 读取 ACL:需要对象
- 符号链接:默认操作目标文件;
/L参数操作符号链接本身,不跟随指向对象。 - 域环境:域 SID 解析依赖域控制器;离线会显示 SID 字符串。
四、逻辑链路(核心子命令时序)
1. /save 备份
- 遍历路径(带
/T递归子目录) - 调用
GetNamedSecurityInfo读取对象仅 DACL;丢弃 Owner/SACL/ 完整性标签 - 将路径、ACE、继承标志、权限掩码写入自定义文本 aclfile。
重要:SACL 审计、所有者、完整性标签不会备份进去。
2. /restore 还原
- 读取 aclfile 文本;解析每一条记录的路径 + DACL。
/substitute先替换 SID;- 调用
SetNamedSecurityInfo把 DACL 写回对应 NTFS 对象;不碰所有者、SACL、完整性标签。 /T不生效,备份文件内部已经记录全部子项。
3. /setowner user 修改所有者
- 解析用户名→SID;
- 设置 SD 内 Owner 字段;
限制:不会强制夺取所有权;当前账号没有 WRITE_OWNER 会直接失败;需要先 takeown。
4. /grant[:r] Sid:perm
- 不带
:r:新增 / 叠加 ACE;原有显式允许 ACE 保留。 - 带
:r:替换该 SID 全部原有显式允许 ACE,只保留本次授予的权限。 - 构造 ACE,追加 DACL,icacls 自动重排 ACE 顺序。
5. /deny Sid:perm
新增显式拒绝 ACE;拒绝 ACE 优先级最高;同时清除该 SID 相同权限的允许 ACE。
6. /remove[:g|:d] Sid
- 无后缀:删除该 SID全部 ACE(允许 + 拒绝)
:g仅删除授予(允许 ACE):d仅删除拒绝 ACE
7. /inheritance:e|d|r
e:启用继承;恢复从父对象继承 DACL。d:禁用继承,把继承 ACE 复制为对象显式 ACE(GUI:禁用继承→复制权限)r:禁用继承,完全删除全部继承 ACE(GUI:禁用继承→删除继承权限)
8. /reset
删除当前对象显式 DACL;完全使用父目录继承下来的 ACL。
9. /setintegritylevel
向 DACL 添加强制完整性 MIC ACE,控制低完整性进程访问。
通用参数
/T:递归本目录及全部子文件子文件夹执行操作/C:遇到访问错误继续执行,输出错误,不中断整个批量任务/L:作用于符号链接本身,不是链接指向目标/Q:静默,关闭成功输出,只打印错误
五、配套链
系统配套工具
takeown.exe:夺取对象所有者;icacls/setowner无法强制夺取,修改锁死文件 ACL 标准流程:takeown → icaclscacls.exe:旧版废弃工具;不支持完整性标签、继承控制、备份还原。- 图形 UI:文件夹属性→安全→高级安全设置,底层 API 与 icacls 同源。
脚本配套
- PowerShell
Get‑Acl / Set‑Acl:.NET 封装同一套 Win32 安全 API;适合复杂逻辑脚本。 - 备份恢复工作流:
icacls /save备份 DACL;注意单独处理所有者、SACL 审计、完整性标签(icacls 不保存)。
完整标准运维流程(处理权限锁死文件夹)
::1.夺取所有者
takeown /f "D:\target" /r
::2.重置ACL继承
icacls "D:\target" /reset /t /c
::3.重新授权
icacls "D:\target" /grant Administrators:(F) SYSTEM:(F) /t
六、边界约束 & 坑点
| 边界分类 | 详细风险说明 |
|---|---|
| 备份边界 | /save只存 DACL;所有者、SACL 审计策略、完整性标签不会保存;restore 也不会恢复,很多运维踩坑。 |
| /setowner 边界 | icacls 不能强制夺取所有权;权限不足直接报错,必须搭配 takeown。 |
| 继承坑 | /inheritance:d复制继承 ACE 为显式;/inheritance:r直接删除继承 ACE,二者极易混淆。 |
| SID 格式坑 | 数字 SID 必须前缀*,例如*S‑1‑1‑0;遗漏 * 会解析失败。 |
| 符号链接坑 | 默认跟随链接目标;修改链接本身权限必须指定/L。 |
| ACE 顺序坑 | 手动构造乱序 DACL,icacls 写入会自动重排;第三方工具生成乱序 ACL 可用/verify检测。 |
| 共享权限隔离 | icacls 只操作NTFS 本地 ACL;不操作 SMB 共享权限;网络访问有效权限 = NTFS ∩ 共享权限。 |
| 拒绝 ACE 行为 | /deny添加显式拒绝,拒绝优先级最高;不要滥用拒绝 ACE,排错困难。 |
| /grant:r 作用域 | :r只替换该 SID显式允许 ACE,不碰拒绝 ACE、继承 ACE。 |
| FAT32/ExFAT | 不支持 SD,所有 ACL 修改命令报错。 |
卡脖子痛点:
- 误以为
/save完整备份全部安全属性,实际丢失所有者、SACL、完整性标签。 - 锁死文件夹直接用 icacls 改所有者,忘记 takeown,操作全部失败。
- 混淆
/inheritance:d与/inheritance:r,权限意外丢失。
七、自动化流水线(批处理 + PowerShell)
1. 批处理示例
::备份DACL
icacls "C:\MyData" /save acl_backup.txt /T /C /Q
::还原DACL
icacls "C:\" /restore acl_backup.txt /C /Q
::授予管理员完全控制,替换原有显式权限
icacls "C:\MyData" /grant:r Administrators:(F) /T /C
::禁用继承,复制继承ACE到本对象
icacls "C:\MyData" /inheritance:d
::删除Everyone所有ACE
icacls "C:\MyData" /remove Everyone /T /C
::设置中等完整性级别
icacls "C:\MyData" /setintegritylevel M /T
2. PowerShell 封装批量巡检脚本
$target = "C:\MyData"
#导出icacls文本报告
& icacls $target /T /C | Out‑File "acl_report.txt"
#检测不规范ACL
& icacls $target /verify /T /C
#结合takeown+icacls修复锁死目录
takeown /f $target /r /c
icacls $target /reset /t /c
icacls $target /grant Administrators:(F) SYSTEM:(F) /t /c
3. 注意:备份缺失项补充方案
icacls
/save不备份 Owner/SACL;如需完整安全描述备份,使用 PowerShellGet‑Acl序列化,可完整保存 Owner/DACL/SACL。
#完整SD备份(包含所有者、DACL、SACL)
Get‑Acl "C:\MyData" -Audit | Export‑CliXml "Full_SD_Backup.xml"
#完整恢复
Import‑CliXml "Full_SD_Backup.xml" | Set‑Acl "C:\MyData"
在 PowerShell 中,icacls 命令通常对应于 Get-Acl、Set-Acl、Add-AccessControlEntry 和 Remove-AccessControlEntry 等命令。下面是 icacls 命令和 PowerShell 对应命令的对比:
| 功能 | icacls 命令 |
PowerShell 对应命令 |
|---|---|---|
| 查看文件或文件夹的权限 | icacls <文件路径> |
Get-Acl <文件路径> |
| 授予用户权限 | icacls <文件路径> /grant <用户>:<权限> |
Add-AccessControlEntry -Path <文件路径> -User <用户> -AccessType <权限> |
| 撤销用户权限 | icacls <文件路径> /remove <用户> |
Remove-AccessControlEntry -Path <文件路径> -User <用户> |
| 修改权限 | icacls <文件路径> /grant <用户>:<权限> |
Set-Acl <文件路径> -AclObject (Get-Acl <文件路径> |
| 备份权限 | icacls <文件路径> /save <文件> /t |
Get-Acl <文件路径> |
| 恢复权限 | icacls <文件路径> /restore <文件> |
Import-Clixml -Path <文件> |
| 删除指定文件夹的继承 | icacls <文件路径> /inheritance:r |
Set-Acl <文件路径> -AclObject (Get-Acl <文件路径> |
| 显示权限详细信息 | icacls <文件路径> /T |
Get-Acl <文件路径> |
说明:
Get-Acl:用于查看文件或文件夹的权限(类似于icacls的查看功能)。Set-Acl:用于设置文件或文件夹的权限,可以结合Add-AccessControlEntry或Remove-AccessControlEntry来修改权限。Add-AccessControlEntry:用于授予用户或组权限。Remove-AccessControlEntry:用于删除用户或组的权限。Export-Clixml和Import-Clixml:用于备份和恢复权限。Remove-AccessControlInheritance:用于移除权限继承。
示例:
-
查看文件的权限(
icacls对应Get-Acl):powershellCopy Codeicacls "C:\example\file.txt"对应的 PowerShell 命令:
powershellCopy CodeGet-Acl "C:\example\file.txt" -
授予用户权限(
icacls对应Add-AccessControlEntry):powershellCopy Codeicacls "C:\example\file.txt" /grant User:F对应的 PowerShell 命令:
powershellCopy Code$acl = Get-Acl "C:\example\file.txt" $permission = "User", "FullControl", "Allow" $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission $acl.AddAccessRule($accessRule) Set-Acl "C:\example\file.txt" $acl -
删除继承权限(
icacls对应Set-Acl和Remove-AccessControlInheritance):powershellCopy Code$acl = Get-Acl "C:\example\file.txt" $acl.SetAccessRuleProtection($true, $false) # 禁用继承 Set-Acl "C:\example\file.txt" $acl
使用 PowerShell 时,你可以更细粒度地控制文件和文件夹的权限,通过脚本化实现自动化管理。
cacls 和 icacls 在版本上的差异对比:
| 特性 | cacls |
icacls |
|---|---|---|
| 可用操作系统版本 | Windows XP及更早版本 | Windows Vista及之后版本 |
| 功能定位 | 基本的文件和文件夹权限管理工具 | 高级的文件和文件夹权限管理工具,支持更多功能 |
| 命令格式 | 简单的命令格式 | 更复杂、更灵活的命令格式 |
| 权限类型支持 | 基本的权限类型,如 r (读取)、w (写入)、f (完全控制) |
更细粒度的权限控制,包括 D (删除)、M (修改)等 |
| 继承权限管理 | 不支持继承权限管理 | 支持继承权限管理,可控制权限的继承关系 |
| 批量操作支持 | 不支持批量修改文件或文件夹权限 | 支持批量修改权限,可操作多个文件或文件夹 |
| 权限备份/恢复 | 不支持权限备份和恢复 | 支持权限的备份与恢复功能 |
| 命令的复杂性 | 简单,适合用于快速修改权限 | 更复杂,适用于需要精细控制权限的情况 |
| 支持的权限映射 | 不支持权限映射 | 支持权限映射,可以将权限从一个文件夹或文件传递到另一个 |
| 用户/组权限管理 | 基本支持用户和组权限设置 | 支持更细粒度的用户和组权限设置,包括详细的访问控制 |
| 命令行选项 | 选项较少,仅支持基本的权限操作 | 提供更多的命令选项,如 /grant、/deny、/setowner等 |
总结:
cacls是一个较老的工具,适用于旧版 Windows 操作系统,提供基本的权限管理功能,功能较为简单。icacls是新版工具,适用于 Windows Vista 及更高版本,提供了更强大的权限控制、更细粒度的管理以及更多的操作选项。
cacls 和 icacls 都是用于管理 Windows 文件和文件夹权限的命令行工具,但它们有一些重要的差异。以下是它们之间的对比:
| 特性 | cacls |
icacls |
|---|---|---|
| 可用版本 | 旧版(Windows XP及更早版本) | 新版(Windows Vista及之后版本) |
| 功能 | 用于查看和修改文件和文件夹的权限 | 用于查看、修改、备份和恢复文件夹和文件的权限 |
| 权限类型 | 只支持简单权限,如 r (读取)、w (写入)、f (完全控制) |
支持更复杂的权限控制,如 D (删除)、M (修改)等 |
| 支持继承权限 | 不支持继承权限的管理 | 支持继承权限设置,可以管理继承关系 |
| 权限备份/恢复 | 不支持权限备份和恢复 | 支持权限的备份和恢复功能 |
| 批量操作支持 | 不支持批量修改权限 | 支持批量修改权限,可以对多个文件/文件夹进行操作 |
| 支持的命令 | cacls <文件/文件夹>、cacls <文件/文件夹> /E /P <用户>:<权限> |
icacls <文件/文件夹>、icacls <文件/文件夹> /grant <用户>:<权限> 等 |
| 修改权限方式 | 只能修改现有权限 | 可以修改现有权限,也可以删除、备份和恢复权限 |
| 权限映射支持 | 不支持权限映射 | 支持权限映射,允许通过使用不同的权限来修改文件夹 |
| 命令复杂度 | 命令较简单,适合基础权限操作 | 命令更复杂,但提供了更多的功能和灵活性 |
| 支持的用户组和用户 | 基本支持用户组和用户权限控制 | 支持更细粒度的用户和组控制,包括允许对用户/组进行详细的权限分配 |
总结:
cacls是一个较旧且简单的工具,适合用于一些基础的权限管理,但不支持更复杂的权限配置与继承设置。icacls是一个功能更强大的工具,适用于较新的 Windows 系统,并且支持复杂的权限管理、权限备份与恢复以及批量操作等功能。
因此,如果您使用的是较新的操作系统,推荐使用 icacls,它提供了更灵活和强大的功能。
ICACLS 命令语法及功能
1. 保存权限到文件
ICACLS 路径 /save 保存文件 [/T] [/C] [/L] [/Q]
-
功能: 将指定路径下文件/文件夹的 DACL(自主访问控制列表)保存到文件中(不包含 SACL、所有者或完整性标签)。
-
参数:
-
/T: 递归处理所有子目录和文件。 -
/C: 忽略错误继续操作。 -
/L: 操作符号链接本身(而非目标)。 -
/Q: 静默模式(不显示成功消息)。
-
2. 从文件恢复权限
ICACLS 目录路径 [/substitute 旧SID 新SID [...]] /restore 保存文件 [/C] [/L] [/Q]
-
功能: 将保存的 DACL 应用到指定目录下的文件。
-
参数:
-
/substitute: 替换 SID(例如旧用户迁移到新用户)。 -
其他参数同上。
-
3. 修改所有者
ICACLS 路径 /setowner 用户 [/T] [/C] [/L] [/Q]
-
功能: 修改指定路径下所有匹配项的所有者(不强制更改所有权,需使用
takeown.exe强制修改)。 -
参数: 同上。
4. 查找包含特定 SID 的 ACL
ICACLS 路径 /findsid SID [/T] [/C] [/L] [/Q]
-
功能: 查找所有包含显式提及指定 SID 的 ACL 的文件/文件夹。
5. 验证 ACL 规范性
ICACLS 路径 /verify [/T] [/C] [/L] [/Q]
-
功能: 检查 ACL 是否符合规范格式或 ACE 条目数量是否一致。
6. 重置为默认继承权限
ICACLS 路径 /reset [/T] [/C] [/L] [/Q]
-
功能: 将所有匹配项的 ACL 替换为默认继承权限。
7. 授予/拒绝/移除权限
ICACLS 路径 [/grant[:r] SID:权限[...]]
[/deny SID:权限 [...]]
[/remove[:g|:d] SID[...]] [/T] [/C] [/L] [/Q]
[/setintegritylevel 级别:策略[...]]
-
功能: 直接修改权限或设置完整性级别。
-
参数:
-
/grant[:r]:-
:r表示替换现有显式权限,否则追加权限。 -
示例:
/grant Administrator:(F)授予管理员完全控制。
-
-
/deny: 显式拒绝指定权限(添加拒绝 ACE 并移除相同权限的允许 ACE)。 -
/remove[:g|:d]:-
:g移除所有允许权限,:d移除所有拒绝权限。
-
-
/setintegritylevel:-
设置完整性级别(
L低、M中、H高),可选继承标记(OI)(CI)。 -
示例:
/setintegritylevel (CI)(OI)L对目录应用低完整性级别。
-
-
8. 继承设置
/inheritance:e|d|r
-
功能: 控制权限继承。
-
e: 启用继承。 -
d: 禁用继承并复制现有 ACE。 -
r: 删除所有继承的 ACE。
-
关键参数说明
-
SID 格式:
-
可使用友好名称(如
Administrators)或数值形式(需以*开头,如*S-1-5-32-544)。
-
-
权限 (
perm) 格式:-
简单权限:
F(完全控制)、M(修改)、RX(读执行)、D(删除)等。 -
详细权限列表: 逗号分隔,如
(DE,WDAC)表示删除和修改 DAC。 -
继承标记: 如
(OI)(对象继承)、(CI)(容器继承)、(NP)(不传播继承)等。
-
-
ACE 排序规则:
显式拒绝 → 显式允许 → 继承拒绝 → 继承允许。
示例
icacls c:\windows\* /save AclFile /T
- 将 c:\windows 及其子目录下所有文件的 ACL 保存到 AclFile。
icacls c:\windows\ /restore AclFile
- 从 AclFile 恢复 c:\windows 及其子目录下文件的 ACL。
icacls file.txt /grant Administrator:(D,WDAC)
- 授予管理员对 file.txt 的删除和修改 DAC 权限。
icacls file.txt /grant *S-1-1-0:(D,WDAC)
- 授予 SID 为 S-1-1-0 的用户删除和修改 DAC 权限。
注意事项
-
管理员权限: 修改系统级路径需以管理员身份运行命令提示符。
-
备份 ACL: 操作前建议使用
/save备份原始权限。 -
符号链接: 使用
/L操作符号链接本身(默认操作目标)。 -
错误处理: 使用
/C忽略错误并继续执行。
通过此命令,可精细控制 Windows 系统的文件和目录权限。

浙公网安备 33010602011771号