You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 11:07:44