Get-Acl / Set-Acl 是干什么的
Get-Acl 把文件、目录、注册表项等对象的安全描述符读成结构化对象,Set-Acl 把一份 ACL 对象整体套用到另一个对象上,等于“权限模板复制”。每个 ACL 还能用 .Sddl 取到字符串形式,非常适合做基线比对与批量归档——把几百台机器上同一目录的 SDDL 收上来,一眼就能看出哪台的权限被改过。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7+(文件系统部分) |
|---|---|
| 读取 | Get-Acl D:\Share |
| 写入 | Set-Acl -Path D:\NewDir -AclObject $acl |
| 导出文本 | (Get-Acl D:\Share).Sddl |
| 权限 | 修改 ACL 需对该对象有“更改权限”权限或属管理员 |
典型使用场景
- 权限模板套用:把标准目录的 ACL 复制给新建的一批目录
- 基线巡检:定期采集关键目录的 SDDL 与基准值比对,发现权限漂移
- 搬迁前后核对:数据迁移后确认权限结构与源端一致
- 排障取证:导出问题目录的完整 ACL 作为工单附件
- 批量修复:对权限被误改的多个目录统一恢复为标准模板
常用示例
常用示例
# 读取对象化 ACL
$acl = Get-Acl D:\Template
$acl.Access | Select-Object IdentityReference, FileSystemRights, AccessControlType, IsInherited
# 套用到新目录(先建目录)
New-Item -ItemType Directory -Path D:\NewDir -Force | Out-Null
Set-Acl -Path D:\NewDir -AclObject $acl
# 导出 SDDL 做基线比对
(Get-Acl D:\NewDir).Sddl
# 比较两个目录是否一致(False 表示不同)
(Get-Acl D:\A).Sddl -eq (Get-Acl D:\B).Sddl
# 批量采集归档
Get-ChildItem D:\Share -Directory | ForEach-Object { "$($_.Name)`t$((Get-Acl $_.FullName).Sddl)" } > D:\acl_baseline.txtACL 对象关键属性
| 属性 | 含义 | 用途 |
|---|---|---|
| Access | 访问规则集合 | 逐条核对身份与权限 |
| IsInherited | 是否继承自父级 | 区分本层设置与继承结果 |
| Owner | 所有者 | 判断谁能改权限 |
| Sddl | 字符串形式描述符 | 基线与批量比对 |
Set-Acl 是整体覆盖语义,不是追加:目标目录原先自己的规则会被模板内容替换。批量套用前先对样本目录做一次试运行并导出改动前的 SDDL。
跨机器套用 ACL 时账户要能被解析:把带域账户 SID 的模板套到未加域的机器上,会出现无法解析的身份条目,表现为权限列表里出现一串 S-1-5-21 开头的裸 SID。
在关键目录上批量执行权限变更前,务必先导出当前 ACL。权限是“改起来一秒、查起来一天”的典型配置,备份成本极低而回滚价值极高。