在PowerShell中设置ActiveDirectoryAccessRule PropagationFlags?
在PowerShell中操纵AD ACE的PropagationFlags属性
背景回顾
在PowerShell中,通过$ACL = Get-ACL -Path 'AD:<DN>'可获取指定AD对象的权限信息(ActiveDirectorySecurity类型),再通过$ACEList = $ACL.Access得到ACE列表(AuthorizationRuleCollection类型,成员为ActiveDirectoryAccessRule)。注意PowerShell中的ActiveDirectoryAccessRule与.NET同名类存在差异:部分成员被重命名(如InstanceType对应.NET的ActiveDirectorySecurityInheritance),且实例属性均为只读,缺失AccessRuleFactory等方法。
操纵PropagationFlags的方法
由于PowerShell返回的AD ACE实例属性只读,必须通过.NET的ActiveDirectoryAccessRule构造函数创建新ACE时直接指定PropagationFlags,具体步骤如下:
1. 创建带指定PropagationFlags的新ACE
使用System.DirectoryServices.ActiveDirectoryAccessRule构造函数,其中第6个参数即为PropagationFlags,可传入对应的枚举值(如None、NoPropagateInherit、InheritOnly):
# 定义参数 $identity = [System.Security.Principal.NTAccount]"DOMAIN\TargetUser" $adRights = [System.DirectoryServices.ActiveDirectoryRights]::ReadProperty $accessType = [System.Security.AccessControl.AccessControlType]::Allow $inheritanceType = [System.DirectoryServices.ActiveDirectorySecurityInheritance]::Descendents # 设置目标传播标志 $propFlags = [System.Security.AccessControl.PropagationFlags]::NoPropagateInherit $objectType = [System.Guid]::Empty $inheritedObjType = [System.Guid]::Empty # 构造新ACE $newAce = New-Object System.DirectoryServices.ActiveDirectoryAccessRule( $identity, $adRights, $accessType, $objectType, $inheritanceType, $propFlags, $inheritedObjType )
2. 将新ACE应用到AD对象
将创建好的ACE添加到ACL,再写入AD:
$acl = Get-ACL -Path "AD:<目标对象DN>" $acl.AddAccessRule($newAce) Set-ACL -Path "AD:<目标对象DN>" -AclObject $acl
3. 修改现有ACE的PropagationFlags
若需修改已存在的ACE,需先移除旧ACE,再构造带新传播标志的ACE并添加:
$acl = Get-ACL -Path "AD:<目标对象DN>" # 筛选出要修改的旧ACE $oldAce = $acl.Access | Where-Object { $_.IdentityReference -eq "DOMAIN\TargetUser" -and $_.ActiveDirectoryRights -eq "ReadProperty" } if ($oldAce) { $acl.RemoveAccessRule($oldAce) # 基于旧ACE属性构造新ACE,替换传播标志 $updatedAce = New-Object System.DirectoryServices.ActiveDirectoryAccessRule( $oldAce.IdentityReference, $oldAce.ActiveDirectoryRights, $oldAce.AccessControlType, $oldAce.ObjectType, $oldAce.InheritanceType, [System.Security.AccessControl.PropagationFlags]::InheritOnly, # 新的传播标志 $oldAce.InheritedObjectType ) $acl.AddAccessRule($updatedAce) Set-ACL -Path "AD:<目标对象DN>" -AclObject $acl }
关键说明
PropagationFlags枚举与文件系统ACE的枚举类型一致,但在AD场景中用于控制ACE向子对象的传播行为;- PowerShell中读取的AD ACE实例为只读,无法直接修改属性,必须通过构造新ACE实现变更。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

