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

如何用PowerShell移除目录特定用户NTFS权限?脚本失效排查

问题原因及解决方法

你的脚本问题出在**RemoveAccessRule的严格匹配机制和ACL对象的更新时机**上:

  1. RemoveAccessRule需完全匹配规则的所有属性
    该方法要求传入的权限规则对象,必须和ACL中已存在的规则在IdentityReference、FileSystemRights、AccessControlType、InheritanceFlags、PropagationFlags等所有属性上完全一致才能完成移除。仅判断IdentityReference无法保证匹配成功,哪怕表面返回true,实际可能未生效。

  2. 未同步磁盘上的最新ACL状态
    你调用SetAccessRuleProtection并应用到磁盘后,仍使用之前的$acl对象操作,此时内存中的对象和磁盘实际的ACL状态可能存在差异,导致后续移除操作基于旧规则执行。

修正后的脚本

$sharePath = "C:\SHARE"

# 创建目录(-Force避免已存在时报错)
New-Item -Path $sharePath -ItemType Directory -Force

# 初始化ACL并禁用权限继承
$acl = Get-Acl -Path $sharePath
$acl.SetAccessRuleProtection($true, $true)
Set-Acl -Path $sharePath -AclObject $acl

# 重新获取磁盘上的最新ACL(关键步骤)
$acl = Get-Acl -Path $sharePath

Write-Host "Before :"
$acl.Access | Format-List *

$groupToRemove = "BUILTIN\Utilisateurs"
# 一次性移除该组的所有权限规则
$acl.RemoveAccessRuleAll((New-Object System.Security.AccessControl.FileSystemAccessRule($groupToRemove, "Read", "ContainerInherit,ObjectInherit", "None", "Allow")))

# 应用修改后的ACL到磁盘
Set-Acl -Path $sharePath -AclObject $acl

# 再次获取ACL验证结果
$acl = Get-Acl -Path $sharePath
Write-Host "After :"
$acl.Access | Format-List *

关键修正说明

  • 重新获取ACL:禁用继承并应用到磁盘后,必须重新调用Get-Acl,确保后续操作基于实际生效的权限规则。
  • 使用RemoveAccessRuleAll:该方法会直接移除指定身份的所有权限规则,无需完全匹配每个规则的细节属性,比逐个判断移除更可靠。如果需要精细控制,也可以先筛选出该组的所有规则,再逐个调用RemoveAccessRule(此时需保证每个规则的属性完全匹配)。

内容的提问来源于stack exchange,提问作者Fabien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:22:40