如何用PowerShell移除目录特定用户NTFS权限?脚本失效排查
问题原因及解决方法
你的脚本问题出在**RemoveAccessRule的严格匹配机制和ACL对象的更新时机**上:
RemoveAccessRule需完全匹配规则的所有属性
该方法要求传入的权限规则对象,必须和ACL中已存在的规则在IdentityReference、FileSystemRights、AccessControlType、InheritanceFlags、PropagationFlags等所有属性上完全一致才能完成移除。仅判断IdentityReference无法保证匹配成功,哪怕表面返回true,实际可能未生效。未同步磁盘上的最新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
相关产品推荐
相关产品推荐

