Applying multiple password policies in a single domain with Fine-Grained Password Policies: creating Password Settings Objects with PowerShell, understanding PSO attributes and precedence, linking them to users or groups, and comparing them with the Default Domain Policy.

In episode 10 you configured password policy and account lockout via GPO — and you may already be asking: what if admins need a 16-character password but regular users can make do with 10? With regular GPO, password policy applies uniformly to the whole domain because the Default Domain Policy can't differentiate per user. Episode 11 answers this limitation with Fine-Grained Password Policies (FGPP).
We'll cover why FGPP is needed, the domain functional level requirement, what Password Settings Objects (PSOs) are, how to create them with New-ADFineGrainedPasswordPolicy, their attributes, precedence rules, how to link them to users and groups, and a comparison with the Default Domain Policy.
Classic password policy has one structural weakness: one domain, one policy. Yet the population within a single domain is heterogeneous:
The naive solution is splitting into multiple domains — but that's expensive and complex. FGPP gives you several password policies within the same single domain, with no new domains. That's the right answer for most organizations.
Before starting, make sure the prerequisites are met:
Get-ADDomain and the DomainMode property.The heart of FGPP is the Password Settings Object (PSO) — an AD object holding one complete set of password policy. PSOs are stored in the Password Settings Container (under CN=Password Settings Container,CN=System) and replicate like other AD objects. A PSO is defined by a set of msDS-* attributes, then applied (subjected) to users or groups.
The most practical way to create a PSO is the New-ADFineGrainedPasswordPolicy cmdlet. An example for a stricter admin policy:
$parameter = @{
Name = "PSO-Admin"
Precedence = 10
MinPasswordLength = 16
ComplexityEnabled = $true
PasswordHistoryCount = 24
MinPasswordAge = (New-TimeSpan -Days 2)
MaxPasswordAge = (New-TimeSpan -Days 90)
LockoutThreshold = 5
LockoutDuration = (New-TimeSpan -Minutes 30)
LockoutObservationWindow = (New-TimeSpan -Minutes 30)
}
New-ADFineGrainedPasswordPolicy @parameterNote the splatting pattern: parameters are collected in a hashtable then called with @parameter — keeping long commands readable and easy to modify. New-TimeSpan is used for duration values like password age.
Each PSO translates to msDS-* attributes in AD:
| Attribute | Function |
|---|---|
| msDS-PasswordSettingsPrecedence | Priority number; the smaller, the more it wins |
| msDS-MinimumPasswordLength | Minimum password length |
| msDS-PasswordComplexityEnabled | Enables complexity |
| msDS-MinimumPasswordAge | Minimum age before a password can be changed |
| msDS-MaximumPasswordAge | Maximum age before expiration |
| msDS-PasswordHistoryLength | Password history that must not repeat |
| msDS-LockoutThreshold | Failed login attempt threshold |
| msDS-LockoutDuration | Account lockout duration |
Understanding these attributes lets you map the GPO policies from episode 10 into PSO form — only now the scope can differ per group.
How does AD decide which PSO applies when a user belongs to several groups with different PSOs? The rules, in order:
Linking a PSO to a group is done with Add-ADFineGrainedPasswordPolicySubject:
Add-ADFineGrainedPasswordPolicySubject -Identity "PSO-Admin" -Subjects "Domain Admins", "Enterprise Admins"A common strategy: create several PSOs with clear precedence gaps (e.g. 10, 20, 30) and link them to the right groups. New members of an admin group automatically get the stricter policy with no other changes — that's the power of group-based application.
The Default Domain Policy is the built-in password policy that applies to all users in the domain — it can't be deleted and serves as the fallback when no PSO applies. FGPP works on top of it:
Recommended practice: keep the Default Domain Policy as a safety net with sensible values for the general population, then create dedicated PSOs for groups needing different policies (stricter for admins, looser for contractors). Don't rely on the Default Domain Policy as the only policy — FGPP is the complement that makes policy truly match the population.
The PSO lifecycle is managed with consistent cmdlets:
Get-ADFineGrainedPasswordPolicy -Filter *
Set-ADFineGrainedPasswordPolicy -Identity "PSO-Admin" -MinPasswordLength 18To verify which policy actually applies to a user:
Get-ADUserResultantPasswordPolicy -Identity budi.santosoGet-ADUserResultantPasswordPolicy is the most valuable tool in FGPP troubleshooting: it shows the final result policy after all precedence rules are applied. If a user doesn't get the expected PSO, check the precedence order and group membership. Remove a user from a PSO's subjects with Remove-ADFineGrainedPasswordPolicySubject if needed.
Episode 11 completes the password policy puzzle: you understand why FGPP is needed when the domain population is heterogeneous, the Windows Server 2008+ domain functional level requirement, what Password Settings Objects are, creating PSOs with New-ADFineGrainedPasswordPolicy, reading the underlying msDS-* attributes, the precedence rules that decide which PSO wins, linking PSOs to users and groups, and verifying with Get-ADUserResultantPasswordPolicy.
Key takeaways:
Good password policy is just one layer of defense. In episode 12 we cover the rest: Active Directory Security Best Practices — privileged access management, the Protected Users group, the admin tier model, service account security, DC hardening, and auditing. See you in episode 12!