PowerShell设置目录ACL权限:如何实现父目录不继承上级权限且子对象继承父目录权限
PowerShell设置目录ACL权限:如何实现父目录不继承上级权限且子对象继承父目录权限
我完全懂你的需求——你想让C:\MyDirectory彻底摆脱C盘根目录的权限继承,但它下面新建的(或者已有的)子文件夹和文件,都能自动继承你指定的SYSTEM和本地管理员权限对吧?问题出在你创建权限规则的时候,没给它加上继承属性,所以这些规则只会绑定在父目录本身,根本不会传递给子对象。
咱们一步步改:
1. 先理清现有脚本的关键问题
你用$acl.SetAccessRuleProtection($true,$false)这行是对的:第一个$true表示关闭从上级目录的权限继承,第二个$false表示清除原来已经继承过来的权限——这完全符合你不让父目录继承C盘权限的需求。
但你创建FileSystemAccessRule的时候只传了三个参数,没有指定继承范围,默认这些规则是仅应用于当前目录,不会被子对象继承。
2. 修改权限规则的创建逻辑
你需要用完整的FileSystemAccessRule构造函数,补充继承和传播的参数,让规则可以被容器(文件夹)和对象(文件)继承。
完整的参数结构是:
New-Object System.Security.AccessControl.FileSystemAccessRule( "身份标识", "权限", 继承标志, 传播标志, 权限类型(允许/拒绝) )
这里我们需要设置:
- 继承标志:
ContainerInherit, ObjectInherit→ 文件夹和文件都继承这个规则 - 传播标志:
None→ 继承的规则正常向下传递,不做限制
3. 修改后的完整脚本
# 目标目录路径 $path = "C:\MyDirectory" # 目录不存在则创建 [System.IO.Directory]::CreateDirectory($path) # 获取目录的ACL对象 $acl = Get-Acl $path # 关闭从上级目录的权限继承,并清除已继承的权限 $acl.SetAccessRuleProtection($true,$false) # 创建SYSTEM的带继承权限规则 $SystemRule = New-Object System.Security.AccessControl.FileSystemAccessRule( "SYSTEM", "FullControl", [System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit, [System.Security.AccessControl.PropagationFlags]::None, [System.Security.AccessControl.AccessControlType]::Allow ) $acl.SetAccessRule($SystemRule) # 创建本地管理员组的带继承权限规则 $AdminRule = New-Object System.Security.AccessControl.FileSystemAccessRule( "BUILTIN\Administrators", "FullControl", [System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit, [System.Security.AccessControl.PropagationFlags]::None, [System.Security.AccessControl.AccessControlType]::Allow ) $acl.SetAccessRule($AdminRule) # 移除所有非继承的域用户权限(保留你原来的逻辑) $rulesToRemove = $acl.access | Where-Object { (-not $_.IsInherited) -and $_.IdentityReference -like "AD\*" } ForEach($rule in $rulesToRemove) { $acl.RemoveAccessRule($rule) | Out-Null } # 将修改后的ACL应用到目录 $acl | Set-Acl $path
4. 额外说明(可选)
如果你希望已经存在的子文件夹和文件也立即应用这些权限(而不仅仅是新创建的),可以在脚本最后加上一段递归应用的逻辑:
# 递归将父目录的ACL应用到所有现有子项 Get-ChildItem -Path $path -Recurse | ForEach-Object { Set-Acl -Path $_.FullName -AclObject $acl }
不过注意:这会覆盖子项原来的自定义权限,如果子项有特殊权限设置,谨慎使用。
这样修改后,C:\MyDirectory不会继承C盘的权限,而它下面的所有子文件夹和文件(不管是现在已有的还是之后新建的)都会自动继承SYSTEM和本地管理员的FullControl权限啦!
备注:内容来源于stack exchange,提问作者Emilio Garcia
相关产品推荐
相关产品推荐

