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

Configure it via Intune (Settings Catalog)

  1. Sign in to the Intune admin centerDevices › Configuration › Create › New Policy.
  2. Platform = Windows 10 and later, Profile type = Settings catalogCreate.
  3. Name it (for example WHfB - PIN Complexity) › Next.
  4. Add settings › search PIN Complexity › tick the settings you want (Minimum PIN length, Digits, Uppercase letters, etc.) from the table below.
  5. Set each value › Next › assign to a pilot group › Next › Create.

Configure it via Group Policy

  1. Open gpmc.msc › right-click the target OU › Create a GPO in this domain, and Link it here... › name it.
  2. Right-click the GPO › Edit.
  3. Navigate to Computer Configuration › Administrative Templates › System › PIN Complexity (not under Windows Hello for Business - see the Gotcha below).
  4. Double-click each setting from the table, set Enabled, and enter the value.
gpmc.msc Computer Configuration Administrative Templates › System PIN Complexity

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

Here is a real run of Get-PinComplexityPolicy.ps1 from this series, showing the exact 24H2/VBS trap the post describes - MinimumPINLength is enforced, but this device would silently ignore an Expiration/History setting if one were added:

PowerShell — Get-PinComplexityPolicy.ps1 (real output)
WHfB PIN Complexity - Effective Policy ------------------------------------------------------------ Minimum PIN length : 8 Maximum PIN length : not set (default 127) Digits : not set Lowercase letters : not set Uppercase letters : not set Special characters : not set Expiration (days) : not set (0 = never) History (remembered) : not set (0) ------------------------------------------------------------ OS build: 26200 VBS running: True Note: PIN Expiration/History would not enforce here (VBS / 24H2+) - none set, so fine.

MinimumPINLength : 8 confirms the policy applied and is being read correctly. The VBS/build check underneath is the script doing your homework for you: because this device runs build 26200 with VBS on, any Expiration or History value you might set later would be silently ignored - the script flags that automatically instead of leaving you to find out the hard way.

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
Was this post helpful?
React below — no account needed
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…