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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:33:16