PowerShell配置文件共享ACL时AD组仅获列表权限问题求助
问题成因
- 核心原因是权限继承标志配置错误:原代码仅指定了
ContainerInherit(子容器继承)标志,缺少ObjectInherit(文件对象继承)标志,导致配置的Modify权限无法正确应用到目录本身和目录内的文件,最终系统仅识别到文件夹遍历/列表相关权限。 - 未处理权限继承冲突:如果目标AD组已经存在从父目录继承来的只读/列表权限,新添加的显式访问控制条目因为继承标志不完整,无法覆盖继承权限,最终合并显示为仅列表权限。
- SMB共享权限限制:Windows共享访问权限是共享权限与NTFS权限取最严格交集,默认新建共享的共享权限为Everyone只读,即使NTFS层配置了Modify权限,实际访问时也会被共享层拦截为只读。
修正方案
- 调整继承标志配置:将
InheritanceFlags设置为ContainerInherit -bor ObjectInherit,确保权限覆盖当前文件夹、所有子文件夹、所有文件,PropagationFlags保持None即可。 - (可选)如果需要避免父级继承权限干扰,可在配置ACL前禁用权限继承,将已继承的权限转换为显式权限。
- 提前确认共享层权限给目标AD组分配了「更改」及以上权限,避免共享层拦截。
修正后代码
$groupname = "group_users" $fullsharepath = "\\servername\servervol\share" $identity = "domain\$groupname" # 获取现有ACL $acl = Get-Acl $fullsharepath # 禁用继承(可选,根据需求选择是否启用) # $acl.SetAccessRuleProtection($true, $true) # 配置正确的权限:Modify权限,应用到当前文件夹、子文件夹、文件 $fsRights = [System.Security.AccessControl.FileSystemRights]"Modify" $inheritance = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit" -bor [System.Security.AccessControl.InheritanceFlags]"ObjectInherit" $propagation = [System.Security.AccessControl.PropagationFlags]"None" $accessType = [System.Security.AccessControl.AccessControlType]"Allow" $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule( $identity, $fsRights, $inheritance, $propagation, $accessType ) # 替换同主体同类型的现有权限规则 $acl.SetAccessRule($accessRule) # 写回权限配置 Set-Acl -Path $fullsharepath -AclObject $acl -Verbose
验证说明
配置完成后,可进入文件夹「属性-安全-高级」查看对应AD组的权限条目,正常应显示:
- 权限:修改
- 应用于:此文件夹、子文件夹和文件
如果访问时仍为只读,需要进入共享「属性-共享-高级共享-权限」,确认目标组有「更改」权限。
内容的提问来源于stack exchange,提问作者Rich
相关产品推荐
相关产品推荐

