These notes are public, opinionated, and evolving — read abdelkader.ma for the long-form posts.
Active DirectoryPrivileged Accounts Checklist

Privileged Accounts Checklist

“Privileged” in AD means more than Domain Admins. This is the list I run through before signing off on any account hardening engagement.

The default privileged groups

If a person account is in any of these, they are tier-0 — every workstation they log into is now a domain-compromise risk.

GroupWhat it givesShould a human be in it?
Domain AdminsFull control of the domainNo — service accounts only, ideally none
Enterprise AdminsFull control of every domain in the forestNo
Schema AdminsModify the schemaEmpty, except during schema changes
Administrators (built-in)Local admin on every DCNo
Account OperatorsManage users (can elevate themselves)No
Backup OperatorsRead/write any file on DC, including NTDS.ditNo
Print OperatorsLoad drivers on DCs → SYSTEMNo
Server OperatorsManage DC services → SYSTEMNo
DnsAdminsDLL load via DNS server → SYSTEM on DCNo
Group Policy Creator OwnersModify GPOs → can ship malicious GPONo
Cert PublishersApprove cert requests → AD CS abuseService only
Domain ControllersThe DCs themselvesComputer objects only

Find every privileged human

PowerShell, one-liner-ish:

$tier0 = @(
  "Domain Admins","Enterprise Admins","Schema Admins",
  "Administrators","Account Operators","Backup Operators",
  "Print Operators","Server Operators","DnsAdmins",
  "Group Policy Creator Owners","Cert Publishers"
)
 
foreach ($g in $tier0) {
  Get-ADGroupMember $g -Recursive |
    Where-Object { $_.objectClass -eq "user" } |
    Select-Object @{n="Group";e={$g}}, Name, SamAccountName, distinguishedName
} | Export-Csv tier0-humans.csv -NoTypeInformation

Output is the audit trail: every human-mapped account with tier-0 access.

The hidden flags

memberOf is not the only story. Check these per account:

Get-ADUser -Filter * -Properties UserAccountControl, AdminCount,
  TrustedForDelegation, TrustedToAuthForDelegation,
  msDS-AllowedToDelegateTo, msDS-AllowedToActOnBehalfOfOtherIdentity,
  ServicePrincipalName, PasswordNeverExpires, PasswordNotRequired,
  DoesNotRequirePreAuth, AllowReversiblePasswordEncryption

For each:

FlagMeaningRisk
AdminCount = 1Was once in a protected group; ACL is hardened, may not have been re-cleanedLingering trust
TrustedForDelegationUnconstrained delegation — collects TGTsUsed with coercion = TGT for any user
TrustedToAuthForDelegationProtocol transitionCombined with constrained delegation = silver ticket
msDS-AllowedToActOnBehalfOfOtherIdentityRBCD — resource-based constrained delegationEasy persistence vector
ServicePrincipalName set on a userKerberoastableOffline crack possible
PasswordNeverExpires = TrueStatic credentialLong-lived risk
PasswordNotRequired = TrueBlank password permittedDomain compromise in one query
DoesNotRequirePreAuthAS-REP roastableOffline crack possible
AllowReversiblePasswordEncryptionPassword recoverable in clearCritical

PasswordNotRequired = True on any user account is a domain-compromise bug. Check it first on every assessment.

Protected Users group

The single biggest defensive control nobody enables. Members of Protected Users get:

  • No NTLM, no CredSSP, no Kerberos DES/RC4 (only AES)
  • No unconstrained or constrained delegation possible
  • 4-hour TGT lifetime, no renewable

Put every tier-0 account in Protected Users. The friction is tiny; the defensive lift is enormous.

Get-ADGroupMember "Domain Admins" -Recursive |
  Where { $_.objectClass -eq "user" } |
  ForEach-Object { Add-ADGroupMember "Protected Users" -Members $_ }

Don’t forget computer accounts

Domain Controllers are privileged accounts that happen to be machines. So is any server running:

  • AD CS (Certificate Services) — ESC1 through ESC11 are all live in the wild
  • ADFS — service account is effectively a domain compromise
  • Azure AD Connect — same
  • Exchange — historical Exchange Trusted Subsystem ACL abuse
  • SCCM / MECM — primary site server is tier-0 in practice
  • Any backup software with domain-wide read access

These all need the same protections you give a DC.

Quick win checklist

In order of “fastest mitigation per attacker capability removed”:

  1. Add every tier-0 user to Protected Users. 5 minutes.
  2. Remove PasswordNotRequired from every account. 1 hour.
  3. Move service accounts to gMSAs wherever supported.
  4. Audit and remove AdminCount=1 legacy ACLs on non-tier-0 accounts.
  5. Disable unconstrained delegation on every host that doesn’t need it.
  6. Enable LAPS on all workstations and servers (Windows LAPS, not legacy).
  7. Implement a tiering model with separate admin workstations (PAWs).