HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Windows Hello for Business WHfBPIN ComplexityPassportForWorkIntuneGroup PolicyWindows 11 24H2

Windows Hello for Business PIN Complexity: Every Setting, CSP and GPO (and the 24H2 Trap)

IA
Imran Awan
31 July 2026

Two things about Windows Hello for Business (WHfB) PIN complexity trip up almost every admin. First, the Group Policy is not where you would look for it - it is not under Windows Hello for Business at all. Second, if you set PIN expiration on a modern fleet, it may silently do nothing, because Windows 11 24H2 quietly stopped honouring it on Virtualization-based Security devices. This post documents every PIN complexity setting, both CSP and Group Policy, and the two traps that make people think their policy is broken when it is actually working exactly as designed.

The problem: "a PIN is less secure than a password"

It is the objection every passwordless project hits. The answer is that a WHfB PIN is device-bound and Trusted Platform Module (TPM)-protected - it never leaves the machine, so it is not "a short password." But that argument only holds if you can show the PIN meets a real complexity standard. To do that you need to configure the PIN complexity policy correctly - and that is where the surprises start.

Why it happens: PIN complexity lives in two odd places

WHfB PIN settings are exposed through the PassportForWork Configuration Service Provider (CSP) under a PINComplexity node, and through Group Policy - but the Group Policy is filed under System › PIN Complexity, not under Windows Hello for Business where every other WHfB setting lives. Admins spend twenty minutes looking in the wrong Group Policy folder before they find it.

How to verify the effective policy

The applied PIN complexity values land in the registry under the PINComplexity subkey. Read them to confirm what is actually enforced (versus what you think you assigned):

Registry Editor — applied PIN complexity
HKLM\SOFTWARE\Microsoft\Policies\PassportForWork\<TenantId>\Device\Policies\PINComplexity
MinimumPINLength REG_DWORD 0x00000006
Digits REG_DWORD 0x00000001 # require
Note: There is a second precedence trap. If you also define password length/complexity via the DeviceLock CSP (the Exchange ActiveSync engine) and PIN complexity via PassportForWork, Windows enforces the strictest setting across both. A stray DeviceLock policy can therefore make your PIN requirements tighter than the WHfB policy alone - check both if the enforced result does not match your PassportForWork policy.

The fix: configure every PIN complexity setting

Here is the complete set. The CSP nodes are under ./Device/Vendor/MSFT/PassportForWork/{TenantId}/Policies/PINComplexity/ (a matching ./User/... path exists), and every Group Policy setting is under the same Computer Configuration › Administrative Templates › System › PIN Complexity folder:

SettingCSP nodeValues / notes
Minimum PIN lengthMinimumPINLengthMin 4; default 6 if not set
Maximum PIN lengthMaximumPINLengthUp to 127; must exceed minimum
Require digitsDigitsEnable / Disable / Not configured
Require lowercase lettersLowercaseLettersEnable / Disable / Not configured
Require uppercase lettersUppercaseLettersEnable / Disable / Not configured
Require special charactersSpecialCharactersEnable / Disable / Not configured
ExpirationExpiration1–730 days; 0 = never (default 0)
HistoryHistory0–50 remembered PINs (default 0)

"Require digits" behaves in three states worth understanding: Enabled forces at least one digit; Disabled forbids digits entirely; Not configured allows but does not require them. The same three-state logic applies to lowercase, uppercase, and special characters. The special-character set is the standard keyboard punctuation range.

Note: If no policy requires letters or special characters, the user may set an all-digit PIN - but they can also optionally set an alphanumeric one. If you want to guarantee complexity, set the specific "Require" toggles to Enabled rather than assuming the length setting alone raises the bar.

Here is a sensible baseline as an Intune custom policy (Settings Catalog exposes the same under Windows Hello for Business and PIN Complexity):

Intune — Custom OMA-URI (PINComplexity)
.../PassportForWork/{TenantId}/Policies/PINComplexity/MinimumPINLength Int = 6 .../PassportForWork/{TenantId}/Policies/PINComplexity/Digits Int = 1 # 1 = require .../PassportForWork/{TenantId}/Policies/PINComplexity/UppercaseLetters Int = 2 # 2 = do not allow .../PassportForWork/{TenantId}/Policies/PINComplexity/SpecialCharacters Int = 2

The two traps

Watch out - the 24H2 expiration trap: PIN expiration and history are not supported on devices with Enhanced Sign-in Security (ESS), and - starting with Windows 11 version 24H2 - on all devices that have Virtualization-based Security (VBS) enabled. Windows uses VBS to isolate the credential, which is incompatible with the old expiry mechanism. So you can set Expiration to 60 days, it will appear configured, and on a 24H2/VBS fleet it simply will not enforce. Do not build a compliance story on PIN expiry for modern devices - it is quietly a no-op.
Gotcha - the wrong Group Policy folder: Every other WHfB Group Policy setting is under Windows Components › Windows Hello for Business. The PIN complexity settings are the exception - they are under System › PIN Complexity. If you cannot find "Minimum PIN length" next to the other Hello settings, that is why. Same ADMX (Passport.admx), different folder.

If you configure via Group Policy instead of Intune, the values land under a different registry root (Policies\Microsoft rather than Microsoft\Policies) - useful to know when you are checking which channel actually applied:

Registry Editor — GPO-applied PIN complexity
HKLM\SOFTWARE\Policies\Microsoft\PassportForWork\PINComplexity
MinimumPINLength REG_DWORD 0x00000006
Expiration REG_DWORD 0x00000000 # 0 = never (and a no-op on 24H2/VBS anyway)

Proof it worked

Set a policy that requires a 6-digit minimum with digits required, assign it, and try to set a 4-digit PIN on a target device - Windows should reject it and state the requirement. The registry PINComplexity values match your policy, and a compliant PIN is accepted. If you configured expiration, verify on a non-VBS device (or accept it is a no-op on 24H2/VBS and remove it from your compliance narrative).

Tip: Do not over-tighten. A long, complex, expiring PIN pushes users back toward writing it down - the exact behaviour passwordless is meant to kill. Because the PIN is TPM-bound and device-local, a 6-8 digit PIN with a lockout after failed attempts is already strong. Set a sane minimum length, require digits, skip expiration (it is a no-op on modern devices anyway), and spend the saved goodwill on rolling Hello out wider.

References

PowerShell Scripts — PIN Complexity Reader

Script for this post is in Daily-Tasks.

Get-PinComplexityPolicy.ps1 — read-only: reads every applied PINComplexity value and flags whether expiration/history will actually enforce on this device (VBS / 24H2)
View all scripts on GitHub
Share this post
LinkedIn X / Twitter Reddit Bluesky

More from EndpointWeekly

Windows Hello for Business
How to Cleanly Disable or Remove Windows Hello for Business…
WHfB is enabled by default on every Entra joined device - Autopilot turned it on, not…
Windows Hello for Business
Windows Hello Multifactor Device Unlock: Require a Trusted…
Trusted signal unlock makes a device open only when the user proves themselves AND the…
Windows Hello for Business
Windows as a Passkey Provider: Where WHfB Ends and Passkeys…
Windows Hello is already a passkey provider - it can create, store and unlock passkeys…