使用PowerShell配置根文件夹NTFS权限时同安全组多规则添加失败
故障原因
- 核心错误是ACL规则写入方法调用错误:
SetAccessRule()的内置逻辑为,若ACL中已存在同安全主体、同允许/拒绝类型的规则,会直接覆盖原有规则,而非追加新规则。写入第一条RW组的根目录权限后,执行第二条规则写入时,该方法直接覆盖了前一条同主体的允许规则,最终仅保留最后一次写入的规则,表现为第二条规则始终无法正常和第一条共存。 - 权限范围配置错误:第二条Modify权限仅指定
ContainerInherit,ObjectInherit继承标志时,规则会同时作用于当前根文件夹,不符合「仅子文件夹和文件生效」的设计要求,必须额外搭配InheritOnly传播标志,才能将规则作用范围完全排除当前根目录。 - 现有第一条RW组的权限配置和预设需求不匹配:原代码写的
CreateFiles,AppendData,ReadAndExecute缺少CreateDirectories(创建文件夹)权限,还多了不必要的AppendData权限,无法匹配最初设计的根目录最小权限要求。
修复代码
所有规则写入改用AddAccessRule()方法(该方法会追加新规则,不会覆盖同主体的不同配置规则),修正权限标志和继承配置,优化写入逻辑(所有规则配置完成后统一提交ACL,减少重复IO和写入异常概率),完整可直接运行的代码如下:
$RFolder = read-host "folder name" $path = "C:$($RFolder)" <# 清空所有现有NTFS权限 #> $acl = Get-Acl $path $acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) | Out-Null } Set-Acl $path $acl <# 禁用权限继承,保留原有继承权限转换为显式权限 #> $acl = Get-ACL -Path $path $acl.SetAccessRuleProtection($True, $True) Set-Acl -Path $path -AclObject $acl <# 统一配置所有NTFS权限规则 #> $acl = Get-Acl $path # 禁止域用户对根目录执行删除、修改权限、夺取所有权操作 $denyRule = New-Object System.Security.AccessControl.FileSystemAccessRule( "PMGTINC\Domain Users", "Delete, ChangePermissions, TakeOwnership", "None", "None", "Deny" ) $acl.AddAccessRule($denyRule) # 只读组:根目录、子文件夹、文件均授予读取执行权限 $roRule = New-Object System.Security.AccessControl.FileSystemAccessRule( "PMGTINC\SEC_$($RFolder)_Ro", "ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow" ) $acl.AddAccessRule($roRule) # RW组根目录权限:仅当前文件夹生效,授予遍历、列目录、读属性、读扩展属性、创建文件、创建文件夹、读权限 $rwRootRule = New-Object System.Security.AccessControl.FileSystemAccessRule( "PMGTINC\SEC_$($RFolder)_RW", "Traverse, ListDirectory, ReadAttributes, ReadExtendedAttributes, CreateFiles, CreateDirectories, ReadPermissions", "None", "None", "Allow" ) $acl.AddAccessRule($rwRootRule) # RW组子内容权限:仅子文件夹和文件生效,授予Modify权限 $rwChildRule = New-Object System.Security.AccessControl.FileSystemAccessRule( "PMGTINC\SEC_$($RFolder)_RW", "Modify", "ContainerInherit,ObjectInherit", "InheritOnly", "Allow" ) $acl.AddAccessRule($rwChildRule) # 所有规则配置完成后一次性写入ACL $acl | Set-Acl $path
验证方法
脚本执行完成后,打开目标文件夹的「属性-安全-高级」面板,可看到RW安全组存在两条独立的允许规则:
- 第一条适用范围为「只有此文件夹」,权限为预设的特殊权限,无修改、删除根目录的权限
- 第二条适用范围为「子文件夹和文件」,权限为修改,用户可在子目录内正常编辑、创建、删除内容
该配置可完全避免用户重命名、误删根文件夹的运维故障。
内容的提问来源于stack exchange,提问作者AndrewC
相关产品推荐
相关产品推荐

