powershell自动化管理ntfs权限需严格按四步执行:先获取所有权,再禁用继承并清理旧规则,接着构造精确filesystemaccessrule,最后递归应用并验证导出。
powershell 是设置 ntfs 权限最可控、可批量、可复用的方式。关键不是“加权限”,而是按顺序完成四步:先拿所有权,再断继承清旧规则,接着构造精确访问规则,最后递归写入并验证。
一、必须先获取文件夹所有权
没所有权,Set-Acl 会直接报错拒绝访问,哪怕你是管理员组成员。两种常用方式:
- 命令行快速接管(适合脚本初始化):
takeown /f "D:\Project" /r /d y —— 递归获取 D:\Project 及全部子项所有权,“/d y”自动确认 - PowerShell 显式设所有者(推荐用于精细控制):
$acl = Get-Acl "D:\Project"
$owner = New-Object System.Security.Principal.NTAccount("DOMAIN\ITAdmin")
$acl.SetOwner($owner)
Set-Acl "D:\Project" $acl
注意:若要作用到子项,需在 Set-Acl 后补上 -Replace 参数,或提前在高级设置中勾选“替换子容器和对象的所有者”
二、禁用继承并清理残留权限
不切断继承,上级文件夹的权限会持续覆盖你的设置;不清空旧规则,新旧权限可能叠加冲突。
- 禁用继承 + 删除所有继承来的 ACE:
$acl = Get-Acl "D:\Project"
$acl.SetAccessRuleProtection($true, $false) // true=关继承,false=删继承项
Set-Acl "D:\Project" $acl - 验证是否清干净:
(Get-Acl "D:\Project").Access | Where-Object {$_.IsInherited} - 如需保留某条旧规则(例如 Administrators 的完全控制),可在 SetAccessRuleProtection 后手动 AddAccessRule 补回,而不是全删
三、构造并应用精确的 FileSystemAccessRule
NTFS 权限决定用户能做什么——“读取+执行”不等于“不能删除”,“修改”包含删除,真要禁止删除得拆解权限组合。
- 只读+运行(禁止改、删、写):
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
"DOMAIN\Users", "ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow"
) - 允许保存但禁止删除(即“写入但不可删”):
不能直接选 Modify,而应组合:
"ReadAndExecute,Write,AppendData,CreateFiles,CreateDirectories" - 添加规则前建议先清空当前 ACE(避免冗余):
$acl.SetAccessRule($rule) // 替换同主体同类型规则
或 $acl.AddAccessRule($rule) // 追加新规则(需确保无重复)
四、递归应用并导出验证
Set-Acl 默认只改顶层,必须显式处理子项;应用后务必检查结果,避免“以为设了其实没生效”。
- 递归写入(PowerShell v5.1+ 支持 -Recurse):
Set-Acl "D:\Project" $acl -Recurse - 导出当前 ACL 备份或比对:
Get-Acl "D:\Project" | Export-Clixml "D:\Project_acl_backup.xml" - 快速验证某用户是否获得预期权限:
(Get-Acl "D:\Project").Access | Where-Object {$_.IdentityReference -eq "DOMAIN\Users"}











