Skip to content

AD Access Control and BloodHound Relationships

This page relates access control in Active Directory Domain Services (AD DS) to the relationships shown in BloodHound. Similar terms in the two systems do not necessarily describe the same type of permission.

For example, GenericAll, WriteDacl, and ForceChangePassword appear in the same list, but interpreting them requires distinguishing three layers:

  1. Basic access rights defined by Windows as access masks.
  2. Rights configured for attributes, property sets, validated writes, and extended rights.
  3. Relationship names assigned by BloodHound after analyzing ACEs and AD object state.

The Microsoft and BloodHound sources used here are collected under “Official references” at the end. This content is based on Microsoft Learn and SpecterOps BloodHound documentation as of July 13, 2026.

GenericAll is a generic access right that can be assigned to an Active Directory object. When mapped to Active Directory rights, it becomes a powerful permission commonly called Full Control.

However, treating every label in BloodHound as the name of a Windows-defined right can be confusing. For HTB, start with these relationships:

Right or BloodHound edgeMeaningTypical targets
GenericAllNearly complete control over the targetUser, Group, Computer, OU, Domain, GPO, certificate template
GenericWriteCan change a broad range of unprotected attributes on the targetUser, Computer, Group, OU, GPO
WriteDaclCan modify the DACL to add other rightsMany AD objects
WriteOwnerCan change the object’s ownerMany AD objects
OwnsThe source principal currently owns the objectMany AD objects
AllExtendedRightsCan exercise all extended rights applicable to the targetUser, Group, Domain, certificate template, etc.
ForceChangePasswordCan reset the password without knowing the current oneUser
AddMemberCan add any member to a groupGroup
AddSelfCan add or remove oneself as a group memberGroup
WriteSPNCan change servicePrincipalNameUser, Computer
AddKeyCredentialLinkCan change msDS-KeyCredentialLinkUser, Computer
WriteAccountRestrictionsCan change attributes in the Account Restrictions property setUser, Computer
AllowedToActThe source principal is already allowed RBCD delegation to the target resourceComputer
ReadLAPSPasswordCan retrieve a local administrator password managed by LAPSComputer
ReadGMSAPasswordCan retrieve a gMSA managed passwordgMSA
GetChanges + GetChangesAllCan retrieve replication data, including secrets, from the domain naming contextDomain
DCSyncAn exploitable relationship generated by BloodHound from a combination of replication rightsDomain

More important than the edge name is reading the relationship in this order:

Who
↓
Has which object as a target
↓
With which access mask, GUID, and inheritance scope
↓
Can change which attributes or perform which operations
↓
And how that leads to authentication, delegation, group membership, or ACL changes

Each AD object has a security descriptor, which mainly contains:

ElementContents
OwnerThe object’s owner
DACLACEs that allow or deny access
SACLACEs that define what is audited
ACE trusteeThe security principal to whom a right is allowed or denied
ACE access maskPermission bits such as WRITE_DAC and WRITE_PROPERTY
ObjectTypeGUID identifying an attribute, property set, extended right, child object class, etc.
InheritedObjectTypeGUID identifying which child object class can inherit the ACE
ACE flagsDirection of inheritance, inherit-only behavior, scope for objects/containers, etc.

Even with the same WRITE_PROPERTY bit, an ObjectType containing the schema GUID for servicePrincipalName applies only to SPNs; without a GUID, it is treated as write access to all properties. Do not judge the strength of a right from the access mask alone.

A DACL (Discretionary Access Control List) defines who is allowed or denied which operations on an object. It contains multiple ACEs (Access Control Entries), each of which associates a principal with rights.

Security Descriptor
├─ Owner
├─ DACL
│ ├─ ACE: Allow Judith WriteOwner
│ ├─ ACE: Allow Management GenericWrite
│ └─ ACE: Allow Domain Admins GenericAll
└─ SACL
└─ Which operations to audit
TermMeaning
DACLThe full list of ACEs that allow or deny access to an object.
ACEOne allow or deny entry, containing a principal, access mask, target scope, inheritance conditions, etc.
SIDAn ID identifying a security principal, such as the user, group, or computer named in an ACE.
Access maskPermission bits such as GenericAll, WRITE_DAC (WriteDacl), WRITE_OWNER (WriteOwner), and WRITE_PROPERTY (WriteProperty).

For example, a WriteOwner relationship on the Management group conceptually corresponds to this Allow ACE:

Allow judith.mader WriteOwner on Management

This ACE means only that Judith can change the owner of the Management group. It does not make Judith a group member or immediately permit every operation.

Become the owner
≠
Become a group member
≠
Gain all operations on the object

As a rule, an owner has implicit WRITE_DAC to modify that object’s DACL. Thus, WriteOwner can start a chain of rights such as:

Have WriteOwner
↓
Make yourself the owner
↓
Modify the DACL as owner
↓
Allow yourself GenericAll or WriteProperty on the member attribute
↓
Change the group's member attribute

The basis for adding arbitrary group members is WRITE_PROPERTY on the member attribute, usually displayed by BloodHound as the AddMember edge. Some tools and materials call the same concept WriteMembers.

There are exceptions to an owner’s implicit WRITE_DAC, including OWNER RIGHTS ACEs and BlockOwnerImplicitRights. AdminSDHolder / SDProp may also reapply ACLs for protected accounts or groups, so check whether the DACL can actually be modified after changing the owner of each target object.

ItemRole
DACLDefines who is allowed or denied which operations.
SACLDefines which access is recorded in audit logs.
DACL = Can you do it?
SACL = Should we log it?

Even if the DACL allows access, the details of that operation may not be logged, depending on the SACL and audit policy configuration.

Attributes, property sets, and extended rights

Section titled “Attributes, property sets, and extended rights”

AD object-specific access control mainly includes these types:

TypeAccess maskMeaning of GUIDExample
Per-attribute read/writeREAD_PROP / WRITE_PROPSchema attributeservicePrincipalName, member
Property setREAD_PROP / WRITE_PROPProperty set grouping multiple attributesUser-Account-Restrictions
Validated writeSELFOperation subject to server-side validationSelf-Membership, Validated-SPN
Extended rightCONTROL_ACCESSControl access right for a special operationReset Password, replication rights, Certificate Enrollment
Child object operationCREATE_CHILD / DELETE_CHILDChild object classCreate a User object, delete a Computer object

Extended rights do not each have their own bit. They are identified by the CONTROL_ACCESS bit and a rights GUID in ObjectType. A CONTROL_ACCESS ACE without an ObjectType GUID means all extended rights applicable to that object, and underlies BloodHound’s AllExtendedRights edge.

A BloodHound edge is not necessarily the display name of one ACE. SharpHound collects ACLs, object types, property GUIDs, owners, attribute values, and other data; BloodHound normalizes or post-processes them into relationships useful for attack path analysis.

Representative examples:

BloodHound edgeMain basisWindows classification
GenericAllACE allowing Generic AllGeneric access right
WriteSPNWRITE_PROP on the SPN attribute or a corresponding validated writeAttribute / validated write
ForceChangePasswordACE allowing the Reset Password rights GUIDExtended right
AddSelfACE allowing the Self-Membership rights GUIDValidated write
OwnsOwner field of the security descriptorObject state, not an ACE
AllowedToActSource SID present in the RBCD security descriptorState derived from an attribute value, not a right over the ACL
DCSyncCombination of GetChanges and GetChangesAllRelationship generated from multiple edges
ADCSESC4, etc.Right to change a template plus template/CA conditionsAttack path derived from multiple ACLs, attributes, and settings

Thus, edge names, target nodes, and whether an edge is traversable may vary by BloodHound version and collection method.

Microsoft’s ADS_RIGHTS_ENUM defines the following access masks for Active Directory objects:

Windows constantValueCommon nameMeaning
ADS_RIGHT_DELETE0x00010000DeleteDelete the target object
ADS_RIGHT_READ_CONTROL0x00020000ReadControlRead the security descriptor except for the SACL
ADS_RIGHT_WRITE_DAC0x00040000WriteDaclModify the DACL
ADS_RIGHT_WRITE_OWNER0x00080000WriteOwnerChange the owner
ADS_RIGHT_SYNCHRONIZE0x00100000SynchronizeSynchronization access
ADS_RIGHT_ACCESS_SYSTEM_SECURITY0x01000000AccessSystemSecurityRead or set the SACL
ADS_RIGHT_GENERIC_READ0x80000000GenericReadGeneric read
ADS_RIGHT_GENERIC_WRITE0x40000000GenericWriteGeneric write
ADS_RIGHT_GENERIC_EXECUTE0x20000000GenericExecuteGeneric execute
ADS_RIGHT_GENERIC_ALL0x10000000GenericAllAll generic rights
ADS_RIGHT_DS_CREATE_CHILD0x00000001CreateChildCreate a child object
ADS_RIGHT_DS_DELETE_CHILD0x00000002DeleteChildDelete a child object
ADS_RIGHT_ACTRL_DS_LIST0x00000004ListChildrenList child objects
ADS_RIGHT_DS_SELF0x00000008SelfPerform a validated write
ADS_RIGHT_DS_READ_PROP0x00000010ReadPropertyRead a property
ADS_RIGHT_DS_WRITE_PROP0x00000020WritePropertyWrite a property
ADS_RIGHT_DS_DELETE_TREE0x00000040DeleteTreeDelete a subtree
ADS_RIGHT_DS_LIST_OBJECT0x00000080ListObjectDisplay a specific object
ADS_RIGHT_DS_CONTROL_ACCESS0x00000100ExtendedRightExercise an extended right

Generic access rights are mapped to standard and directory-specific rights by the GENERIC_MAPPING for the target object type. The conceptual inclusion relationships in AD are:

GenericAll / DS_GENERIC_ALL
├─ Delete / ReadControl / WriteDacl / WriteOwner
├─ CreateChild / DeleteChild / DeleteTree
├─ ListChildren / ListObject
├─ Self (validated writes)
├─ ReadProperty / WriteProperty
└─ ControlAccess (extended rights)
GenericWrite / DS_GENERIC_WRITE
├─ ReadControl
├─ WriteProperty
└─ Self (validated writes)

GenericWrite allows changes to a broad range of attributes, but it does not automatically include extended rights such as password reset. GenericAll includes changes to the DACL and owner as well as extended rights, so BloodHound treats it as equivalent to Full Control.

Even if an ACE appears to grant powerful rights, the actual access check and outcome depend on:

  • Explicit deny ACEs and the canonical ordering of ACEs.
  • Trustees in the access token, including user SIDs, group SIDs, and SID history.
  • Whether the ACE is direct or inherited from a parent container.
  • The ACE’s inheritance flags and InheritedObjectType.
  • The attribute, property set, extended right, or child object class specified by ObjectType.
  • Object class, schema, system-only attributes, and server-side constraints on validated writes.
  • Whether ACL inheritance is disabled on the target object.
  • Reapplication of ACLs by AdminSDHolder and SDProp for protected accounts or groups.
  • The owner’s implicit READ_CONTROL / WRITE_DAC and exceptions that limit it, such as the OWNER RIGHTS SID and BlockOwnerImplicitRights.
  • Whether the operation requires another user right or privilege, protocol, or service configuration.
  • Whether replication delay leaves the DC where a change was made in a different state from the DC used to verify it.

The Protected Users group provides protections for Kerberos/NTLM and credential delegation; it does not directly alter ordinary DACL access checks. By contrast, protected accounts and groups subject to AdminSDHolder / SDProp have ACL inheritance disabled and their ACLs periodically reset to match a template.

Therefore, seeing a GenericAll edge does not guarantee that every operation will succeed on every object type or Windows version.

EdgeMeaning and typical use
GenericAllFull Control over the target. Depending on its type, this can enable password resets, membership changes, attribute changes, DACL changes, etc.
GenericWriteUse writable attributes. Usually does not include DACL changes or all extended rights.
WriteDaclAdd GenericAll, attribute-write rights, extended rights, etc. for yourself or a principal under your control.
WriteOwnerMake yourself or a controlled principal the owner, then use the owner’s implicit WRITE_DAC to modify the DACL.
OwnsAlready the owner and normally able to use implicit WRITE_DAC; check for restrictions on owner rights.
AllExtendedRightsCorresponds to CONTROL_ACCESS without a GUID restriction and permits extended rights defined for the target.

Because WriteDacl allows modification of the target’s DACL, it can lead to other powerful rights in an attack path. The added ACE must still have the correct object type and inheritance scope, and the target object’s ACL protection must permit the intended effect.

WriteOwner and Owns are different. The former is a right to change the owner; the latter is a BloodHound edge describing the current owner field. An owner also has implicit READ_CONTROL and WRITE_DAC by default, but an OWNER RIGHTS ACE or Windows restrictions on implicit owner rights can limit this path.

EdgeMain operationTypical effect
ForceChangePasswordReset Password extended rightReset without knowing the current password
WriteSPNservicePrincipalNameTargeted Kerberoasting or SPN configuration changes
AddKeyCredentialLinkmsDS-KeyCredentialLinkPKINIT authentication path through Key Trust / Shadow Credentials
WriteAccountRestrictionsAccount Restrictions property setPotential changes to userAccountControl, accountExpires, RBCD attributes, etc.
GenericWriteBroad range of unprotected attributesSPNs, key credentials, and other writable attributes
GenericAllPassword, properties, owner, DACL, extended rightsFull Control of a User object
AllExtendedRightsExtended rights applicable to the UserReset Password, etc.

ForceChangePassword is BloodHound’s exploitable edge for Microsoft’s User-Force-Change-Password extended right, whose display name is Reset Password. It does not require knowledge of the current password.

“Change Password” and “Reset Password” are different:

Operation or rightCurrent passwordTypical user
Change Password / User-Change-PasswordGenerally requiredThe account holder
Reset Password / User-Force-Change-PasswordNot requiredAdministrator, help desk, or delegated principal

In Set-ADAccountPassword, a change specifying the old and new passwords is also a separate operation from a reset using -Reset.

EdgeMeaningMain Windows basis
AddMemberAdd any User, Group, Computer, etc. as a memberWRITE_PROP on the member attribute
AddSelfAdd or remove oneselfSelf-Membership validated write
GenericWriteChange writable attributes, including memberGeneric Write mapping
GenericAllFull Control, including membership and DACL/owner changesGeneric All mapping
WriteDaclGrant yourself membership-change rights, etc.WRITE_DAC

AddMember is a relationship that permits adding any principal to the target security group. That principal can use the group’s rights after receiving a new logon token or Kerberos ticket, for example. An existing session’s token is not necessarily updated immediately after the change.

AddSelf corresponds to Microsoft’s Self-Membership validated write and is limited to adding or removing oneself.

Some BloodHound versions or older materials use the plural AddMembers; this guide uses the current edge name, AddMember.

EdgeRelated attribute or featureInterpretation
AddKeyCredentialLinkmsDS-KeyCredentialLinkCan add a key credential to the Computer account
WriteAccountRestrictionsUser-Account-Restrictions property setCan change account restriction attributes, including RBCD
AllowedToActmsDS-AllowedToActOnBehalfOfOtherIdentityThe source principal is already allowed RBCD to the target resource
ReadLAPSPasswordLegacy LAPS / Windows LAPS password dataCan retrieve the password of a managed local account
ReadGMSAPasswordmsDS-ManagedPasswordCan retrieve gMSA password data
GenericWriteSPN, key credential, account restrictions, etc.Check which attributes are writable for this target
GenericAllEntire Computer objectMay lead to RBCD, key credentials, LAPS reads, etc.

WriteAccountRestrictions is a BloodHound edge derived from write access to Microsoft’s User-Account-Restrictions property set. It applies to Users and Computers, and the Windows Server 2012 definition includes msDS-AllowedToActOnBehalfOfOtherIdentity as a member.

In particular, modifying that attribute on a Computer object can configure RBCD (Resource-Based Constrained Delegation). AllowedToAct, however, describes a state where the source principal is already allowed in the RBCD security descriptor, not a right to change it.

The actual conditions for retrieving LAPS and gMSA data vary by product version, attribute, encryption settings, authorized decryptor, and ACL. For any edge, establish whether it grants access to a Legacy LAPS clear-text attribute, a Windows LAPS encrypted or clear-text attribute, or a gMSA managed password.

For an OU or Domain object, distinguish rights over the object itself from rights inherited by descendant objects.

GenericAll on OU (This object only)
-> Can modify the OU's own DACL or properties
GenericAll on OU (Descendant User objects)
-> Rights extend to child Users with inheritance enabled
WriteGPLink on OU
-> May lead to a GPO application path through gPLink

The main extended rights related to DCSync on a Domain node are:

Extended rightRights GUIDBloodHound labelMeaning
DS-Replication-Get-Changes1131f6aa-9c07-11d1-f79f-00c04fc2dcd2GetChangesReplicate changes from a Naming Context
DS-Replication-Get-Changes-All1131f6ad-9c07-11d1-f79f-00c04fc2dcd2GetChangesAllPermit replication including secret domain data
DS-Replication-Get-Changes-In-Filtered-Set89e95b76-444d-4c62-991a-0facbeda640cGetChangesInFilteredSetRelated to replication of the Filtered Attribute Set

The central combination from which BloodHound normally generates an exploitable DCSync edge is:

GetChanges
+
GetChangesAll
=
DCSync

BloodHound does not treat GetChanges alone or GetChangesAll alone as a DCSync-capable path. GetChangesInFilteredSet also matters when assessing the RODC Filtered Attribute Set or SyncLAPSPassword; distinguish its role from the two core rights for ordinary DCSync.

GenericAll on the Domain object, or applicable AllExtendedRights, may include GetChanges and GetChangesAll, so BloodHound can link them to DCSync.

In AD CS (Active Directory Certificate Services), distinguish these different targets:

ACLs / properties of the Certificate Template object
AD registration object of the Enterprise CA
Administrative security of the CA service
Template publication state and certificate issuance policy
Edge or rightTarget layerMeaning
EnrollCertificate template / Enterprise CAAllows certificate enrollment
AutoEnrollCertificate templateAllows automatic enrollment through Group Policy, etc.
GenericAllTemplate/CA-related object in ADAllows broad changes to the target AD object
GenericWriteTemplate/CA-related object in ADAllows changes to template attributes, etc.
WriteDaclAD objectAllows changes to the DACL of a template/CA-related object
WriteOwnerAD objectAllows changes to the owner of a template/CA-related object
WritePKINameFlagCertificate templateAllows changes to msPKI-Certificate-Name-Flag
WritePKIEnrollmentFlagCertificate templateAllows changes to msPKI-Enrollment-Flag
EnrollOnBehalfOfTemplate and enrollment agent conditionsRelationship allowing enrollment for another principal
ManageCACA serviceManage CA settings as a CA Administrator
ManageCertificatesCA serviceManage request approval, denial, revocation, etc. as a CA Officer

A certificate template is an AD object and has an ACL like other AD objects. The CA checks Enroll permission on the template and does not issue a certificate based on it if the requesting principal lacks that permission. Actual enrollment requires the template to be published to an Enterprise CA, the requester and CA to meet the necessary read/enroll conditions, and issuance requirements to be satisfied.

ManageCA and ManageCertificates are not equivalent to simply having GenericAll on the pKIEnrollmentService object. The former are roles and permissions on the CA service, assessed separately from the template object’s AD ACL.

BloodHound does not display a single ACE directly as ESC4. It analyzes template owners, DACLs, generic rights, per-attribute write rights, and template/CA configuration, aggregating them into attack paths such as ADCSESC4. Some edges, such as WritePKINameFlag alone, do not establish privilege escalation without a combination of other template flags, EKUs, issuance requirements, and publish/enroll conditions.

Why there is no single list of “all rights”

Section titled “Why there is no single list of “all rights””

Active Directory has attributes, property sets, validated writes, and extended rights that grow with schema and product additions.

Even Microsoft’s list of standard Extended Rights includes, for example:

  • Reset Password.
  • Change Password.
  • Apply Group Policy.
  • Certificate Enrollment.
  • Replicating Directory Changes.
  • Replicating Directory Changes All.
  • Replicating Directory Changes In Filtered Set.
  • Allowed to Authenticate.
  • Send As.
  • Receive As.
  • Create Inbound Forest Trust.
  • Domain Administer Server.
  • Reanimate Tombstones.

controlAccessRight objects, which let administration tools resolve display names and GUIDs, are registered in the following container in the Configuration naming context:

CN=Extended-Rights,CN=Configuration,<ForestRootDN>

The access check for an extended right uses the CONTROL_ACCESS bit and rights GUID. According to Microsoft’s protocol specification, a controlAccessRight object helps administration tools identify a right, but the object itself does not have to exist for the access check.

Installing Exchange, LAPS, AD CS, or other products that extend the schema adds environment-specific attributes and control access rights. For a complete list, enumerate the target forest’s schema and Extended-Rights container.

In a safe test environment or for administrative purposes, you can inspect them as follows:

Terminal window
$configurationNamingContext = (
Get-ADRootDSE
).configurationNamingContext
Get-ADObject `
-SearchBase "CN=Extended-Rights,$configurationNamingContext" `
-LDAPFilter "(objectClass=controlAccessRight)" `
-Properties displayName, rightsGuid, validAccesses |
Sort-Object displayName |
Select-Object displayName, rightsGuid, validAccesses

To find particular rights:

Terminal window
Get-ADObject `
-SearchBase "CN=Extended-Rights,$configurationNamingContext" `
-LDAPFilter "(objectClass=controlAccessRight)" `
-Properties displayName, rightsGuid |
Where-Object {
$_.displayName -match "Password|Replication|Certificate|LAPS"
} |
Select-Object displayName, rightsGuid

Property sets and validated writes are also represented by the controlAccessRight class. Inspect validAccesses to distinguish whether an entry is used as CONTROL_ACCESS, WRITE_PROP / READ_PROP, or SELF.

On an administration host with the Active Directory provider, you can inspect an object’s ACEs.

Terminal window
Import-Module ActiveDirectory
$targetDn = "CN=Example User,OU=Users,DC=example,DC=com"
(Get-Acl -Path "AD:\$targetDn").Access |
Select-Object IdentityReference,
ActiveDirectoryRights,
AccessControlType,
ObjectType,
InheritedObjectType,
InheritanceType,
IsInherited

Without resolving GUIDs to display names, it is easy to miss the meaning of attribute-scoped ACEs and extended rights. During an investigation, build a GUID map from the schema naming context and Extended-Rights container, or compare multiple views such as BloodHound, ADSI Edit, and dsacls.

For CPTS and HTB, the following order is practical:

GenericAll
GenericWrite
WriteDacl
WriteOwner
Owns
AllExtendedRights
ForceChangePassword
AddMember / AddSelf
WriteSPN
AddKeyCredentialLink
WriteAccountRestrictions / AllowedToAct
GetChanges + GetChangesAll -> DCSync
Enroll / AutoEnroll / ManageCA / ManageCertificates

After learning the names, examine how each expands for different object types.

TargetRights and attributes to check first
UserPassword reset, SPN, key credential, account restrictions, DACL
Groupmember, Self-Membership, DACL
ComputerRBCD, SPN, key credential, LAPS, DACL
OUACE inheritance, descendant object type, gPLink
DomainReplication extended rights, inherited ACEs, AdminSDHolder
GPOWrite access to both the AD object and SYSVOL
Certificate templateEnroll, template flags, EKUs, issuance requirements, publication status
Enterprise CAEnroll, ManageCA, ManageCertificates, CA flags

For defenders, searching only for GenericAll does not sufficiently detect powerful delegations. At a minimum, include:

  • WriteDacl and WriteOwner.
  • The Owner field and OWNER RIGHTS ACEs.
  • WriteProperty, Self, and ControlAccess scoped by GUID.
  • ACEs inherited by descendant objects from an OU or Domain.
  • Objects with ACL inheritance disabled and those subject to AdminSDHolder / SDProp.
  • Rights to change member, servicePrincipalName, msDS-KeyCredentialLink, and RBCD attributes.
  • Principals able to read LAPS / gMSA secrets.
  • Replication extended rights on the domain root.
  • Separate ACLs and roles for certificate templates and CA services.
  • Effective trustees, including nested group membership and SID history, not only direct ACEs.

Per-attribute ACEs can look inconspicuous in a GUI, yet BloodHound may show them as powerful attack paths such as WriteSPN, AddKeyCredentialLink, and WriteAccountRestrictions.

For an audit, record more than the presence of an edge:

Source principal SID
Target object GUID / DN / class
Allow or Deny
Access mask
ObjectType GUID
InheritedObjectType GUID
Inheritance flags
Direct or inherited
Owner
DC that processed the change