首页/系统/Windows 运维速查/Get-Acl / Set-Acl 与 SDDL

Get-Acl / Set-Acl 与 SDDL

PowerShell 侧权限操作:读对象化 ACL、克隆到其他对象、导出为 SDDL 文本便于比对与归档。

Windows 运维速查系统更新于 2026-10-13

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.txt

ACL 对象关键属性

属性含义用途
Access访问规则集合逐条核对身份与权限
IsInherited是否继承自父级区分本层设置与继承结果
Owner所有者判断谁能改权限
Sddl字符串形式描述符基线与批量比对
Set-Acl 是整体覆盖语义,不是追加:目标目录原先自己的规则会被模板内容替换。批量套用前先对样本目录做一次试运行并导出改动前的 SDDL。
跨机器套用 ACL 时账户要能被解析:把带域账户 SID 的模板套到未加域的机器上,会出现无法解析的身份条目,表现为权限列表里出现一串 S-1-5-21 开头的裸 SID。
在关键目录上批量执行权限变更前,务必先导出当前 ACL。权限是“改起来一秒、查起来一天”的典型配置,备份成本极低而回滚价值极高。

易错点

  • 用 Set-Acl 追加权限却以为不会丢原设置:实际是整体覆盖,目标原有规则被替换
  • 把 SDDL 当文件内容直接编辑:格式错一个字符就无法解析,宁可重新取模板也不要手改
  • 跨域或未加域机器套用模板:账户 SID 解析失败,ACL 里出现裸 SID 导致权限形同虚设
  • 只看 Access 不看 IsInherited:误把继承来的权限当成本层设置,改动位置判断错误
  • 批量变更不留备份:出问题后无法还原,只能逐台凭记忆恢复

数据来源与参考

  • Microsoft Learn:Get-Acl
  • Microsoft Learn:Set-Acl

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌