HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Windows Hello for Business WHfBHybrid JoinPRTEnterprisePrtdsregcmdEvent 360Troubleshooting

Windows Hello for Business Not Working on a Hybrid-Joined Device — Step-by-Step Diagnostic Walkthrough

IA
Imran Awan
4 August 2026

This is the companion to the WHfB Event ID Catalog. That post tells you what the events mean. This walkthrough shows you what to do when you have a problem in front of you — the actual command sequence, the real output, and the decision at each step. A user cannot sign in with Windows Hello. Event 360 is firing. The device is Hybrid Joined. Here is how you find the answer.

What this covers: WHfB Cloud Trust on a Hybrid Azure AD / Entra-joined device (AzureAdJoined: YES + DomainJoined: YES). The device has a PIN enrolled but login fails intermittently, and Event 360 appears in the User Device Registration log. The root cause, as you will see, is almost never the PIN itself — it is the Primary Refresh Token (PRT) that underpins it.
▶ Watch: WHfB Hybrid Join PRT diagnostic walkthrough
Full step-by-step walkthrough — diagnose WHfB and PRT failures on Hybrid Joined devices
1Pull the event timeline across all three logs

As the Event ID Catalog explains, WHfB logs to three separate places. The quickest way to see them together is a single Get-WinEvent query that covers all three:

Windows PowerShell
Get-WinEvent -LogName 'Microsoft-Windows-User Device Registration/Admin', 'Microsoft-Windows-HelloForBusiness/Operational', 'Microsoft-Windows-AAD/Operational' | Where-Object { $_.Id -in 358,360,362,363,1097,1098,5205,5702 } | Select-Object TimeCreated, @{N='Log';E={$_.LogName -replace 'Microsoft-Windows-',''}}, Id, @{N='Level';E={$_.LevelDisplayName}}, @{N='Meaning';E={ @{358='Provisioning will be launched';360='Provisioning will NOT be launched'; 362='Provisioning complete';363='Provisioning failed'; 1097='Warning/Info (AAD)';1098='Error (AAD)'; 5205='WHfB config loaded';5702='WHfB keys written to disk'}[$_.Id]}} | Sort-Object TimeCreated | Format-Table -AutoSize -Wrap

Read the output and look for Event 360. It will be there at or just before the time the user reported the problem.

2Identify Event 360 — and know it is a Warning, not an Error

This is the single most important thing to understand before you do anything else, and it is the reason the Event ID Catalog calls it out specifically: Event 360 fires as a Warning, not an Error. Default Event Viewer filters hide it. Most SIEM rules miss it. If you are looking for a red event to explain why provisioning was blocked, you will not find one — because it never fires as an error.

Do not filter on Errors only. Event 360 (provisioning will not be launched — a prerequisite failed) is logged at Warning level. If your monitoring or Event Viewer is set to "Errors only," every blocked provisioning is invisible. Alert on Warning-level Event 360 in the User Device Registration log explicitly.
3Read Event 360 in full — find the failing prerequisite

The table view truncates the message. Run this to see the full prerequisite checklist:

Windows PowerShell
Get-WinEvent -LogName 'Microsoft-Windows-User Device Registration/Admin' | Where-Object Id -eq 360 | Select-Object -First 3 | Format-List TimeCreated, Message

The body lists every prerequisite with a Yes/No result. Scan each line. The first No is your diagnosis. In this case it was:

⚠ User Device Registration — Event ID 360 (Warning)
Device is Azure Active Directory joined (AADJ or DJ++): Yes
Device is domain joined: Yes
NGC is enabled by policy: Yes
User is not connected to a work or school account: Yes
User has a valid auth certificate: Yes
User has logged on with Microsoft Entra credentials: No ← blocking condition

Everything else passed. This single condition — "User has logged on with Microsoft Entra credentials: No" — blocked provisioning. The session authenticated via Kerberos or NTLM rather than the Entra PRT path. The cause is almost always a PRT that failed to refresh before the logon.

4Confirm the device join state

Before digging into the PRT, confirm exactly what you are dealing with:

Windows PowerShell
dsregcmd /status | Select-String "AzureAdJoined|DomainJoined|DeviceName|TenantName"
AzureAdJoinedDomainJoinedJoin type
YESYESHybrid Joined — this walkthrough
YESNOEntra-only (Cloud Join)
NOYESOn-premises only

On a Hybrid Joined device, "User has logged on with Microsoft Entra credentials: No" means the session authenticated via Kerberos/NTLM rather than the Entra PRT path. The cause is almost always a PRT that could not refresh.

5Check the PRT state

Run dsregcmd /status and look at the PRT section:

Windows PowerShell
dsregcmd /status | Select-String "AzureAdPrt|AzureAdPrtUpdateTime|AzureAdPrtExpiryTime|EnterprisePrt"
FieldHealthy valueWhat a problem looks like
AzureAdPrtYESNO — no PRT at all
AzureAdPrtUpdateTimeToday or recentDays old — stale, refresh failed
AzureAdPrtExpiryTimeFuture date/timePast date — expired
EnterprisePrtYESNO — on-premises SSO broken
Display cache quirk: AzureAdPrtUpdateTime does not flush until the next interactive logon, even when the PRT IS refreshing. Verify by watching AzureAdPrtExpiryTime instead — if the expiry timestamp extends across successive dsregcmd /refreshprt runs, the PRT is refreshing correctly and the stale UpdateTime is just a display artefact.
6Find why the PRT refresh failed

The AAD operational log holds the refresh failure with the exact error code. Run:

Windows PowerShell
Get-WinEvent -LogName 'Microsoft-Windows-AAD/Operational' -MaxEvents 30 | Where-Object { $_.Id -in 1097, 1098 } | Select-Object TimeCreated, Id, Message | Format-List

Look for error codes in the message body. The ones you are most likely to find on a Hybrid device:

Error codeMeaningWhat it points to
0xc000023cSTATUS_NO_LOGON_SERVERSNo domain controller reachable
0x80072ee7ERROR_WINHTTP_NAME_NOT_RESOLVEDDNS failure — no network at PRT refresh time
0x8007054BCannot get domain name / DC registration dataDC not reachable, even on VPN
0xCAA90022ADFS IWA endpoint not discoverableWS-Trust probe failed — often noise if you use Okta/non-ADFS STS
0xCAA9002BWS-Trust MEX exchange failedSTS unreachable or Kerberos failed at STS

If you see 0xc000023c and 0x80072ee7 together at the time of the Event 360, the device had no network when it tried to refresh the PRT. The session that followed had to authenticate via Kerberos/NTLM — triggering the 360.

About 0xCAA90022 (ADFS IWA endpoint): If your organisation uses Okta rather than ADFS as the federated STS, this error is expected background noise. The device probes for an ADFS IWA endpoint; Okta responds with a MEX WSDL but the IWA binding requires Kerberos, which requires a DC. Seeing this error does not mean WHfB is broken — it means the Enterprise PRT path is failing because there is no DC, not because the Okta endpoint is down. Confirm your STS by reading the MEX WSDL URL in the event message: if it points to an Okta domain (e.g. logon.yourdomain.com/app/office365/.../sso/wsfed/active), you are not on ADFS.
7Try a PRT refresh on VPN

Connect to the corporate VPN, then:

Windows PowerShell
dsregcmd /refreshprt Start-Sleep -Seconds 15 dsregcmd /status | Select-String "EnterprisePrt|AzureAdPrt|AzureAdPrtExpiryTime"

Two outcomes:

If EnterprisePrt: NO persists on VPN and 0x8007054B is still in the AAD event log, the VPN tunnel does not route traffic to the domain controller. The fix is a VPN routing change, not a device change. Collect the error output and raise it with the network team with three specific asks: (1) confirm DC subnet IPs are in the VPN routing table; (2) confirm internal DNS resolves the domain from within the VPN tunnel; (3) confirm UDP 88 (Kerberos) is not blocked between the VPN pool and DC subnet.
8Confirm WHfB is actually enrolled

Even when Event 360 is firing, WHfB may have successfully enrolled on a previous attempt. Check:

Windows PowerShell
dsregcmd /status | Select-String "NgcSet|NgcKeyId"
ResultMeaning
NgcSet: YES + a KeyId presentWHfB is enrolled — Event 5702 will confirm in the HelloForBusiness log
NgcSet: NOWHfB is not enrolled — provisioning never completed

NgcSet: YES means the device has a WHfB key. The Event 360 is blocking re-provisioning on each logon, but the key from a previous successful enrolment is still valid. Once the PRT issue is fixed (DC reachable at logon time), Event 360 stops firing and the PIN works correctly. If NgcSet: NO, provisioning has never completed — fix the PRT issue first, then the PIN setup flow will appear automatically.

9Workaround for an affected user right now

While the infrastructure issue is being investigated, a user who sees "Your credentials could not be verified" at the Windows Hello login screen can do the following:

  1. Ensure the device is connected to Wi-Fi or Ethernet before the login screen appears — not after.
  2. On the Windows Hello error screen, click OK and sign in with their password as a fallback.
  3. Once logged in, open an elevated Command Prompt and run: dsregcmd /refreshprt
  4. Sign out and sign back in — Windows Hello should authenticate correctly now that the PRT is fresh.
Why this works: WHfB Cloud Trust requires a valid PRT at authentication time. If the PRT is stale (because it could not refresh before the login screen), WHfB fails. Refreshing manually after a password logon gives the next WHfB attempt a valid PRT to use. The real fix is ensuring the device has network access early enough for the automatic refresh to succeed before the lock screen appears — typically by docking or connecting to Wi-Fi before waking from sleep.

The diagnostic flow at a glance

⚠ Event 360 fires in User Device Registration log
Step 2 & 3
Read full Event 360 message → find which prereq shows No
Step 4 & 5
Entra credentials: No → check dsregcmd /status → AzureAdPrt stale?
Step 6
AAD event log → 0xc000023c + 0x80072ee7 = no network at login time
Step 7
Connect to VPN → dsregcmd /refreshprt → EnterprisePrt still NO?
Root cause
0x8007054B still firing on VPN → DC subnet not routed through tunnel
Action
Escalate to network / DC team with three specific asks (VPN routing, DNS, UDP 88)

Quick-reference: what to collect before escalating

If you need to raise this with a network team or Microsoft Support, collect the following from the affected device and paste it into the ticket:

PowerShell — collect diagnostics for escalation
# 1. Device join state dsregcmd /status # 2. Attempt a PRT refresh (on VPN) and capture updated state dsregcmd /refreshprt Start-Sleep -Seconds 20 dsregcmd /status # 3. Last 30 AAD events around the failure time Get-WinEvent -LogName 'Microsoft-Windows-AAD/Operational' -MaxEvents 30 | Where-Object { $_.Id -in 1097,1098 } | Format-List TimeCreated, Id, Message # 4. Event 360 full message (last 3 occurrences) Get-WinEvent -LogName 'Microsoft-Windows-User Device Registration/Admin' | Where-Object Id -eq 360 | Select-Object -First 3 | Format-List TimeCreated, Message
Download the scripts — GitHub

Get-WHfBHybridDiagnostics.ps1 and Get-WHfBEventReport.ps1 are free and open source. Both scripts read event logs and device state only — no changes are made to the device. Download from the Imran76Awan/Daily-Tasks repository on GitHub.

Get-WHfBHybridDiagnostics.ps1View full repo →

References

Share this post
LinkedIn X / Twitter Reddit Bluesky

More from EndpointWeekly

Windows Hello for Business
dsregcmd /status Decoded: The Complete Field Reference for WHfB…
One command answers more WHfB questions than any portal - and its forty-plus fields come…
Windows Hello for Business
Windows Hello Signs In Fine but File Shares Prompt: Fixing…
The user signs in with their PIN and cloud apps work, but a file share throws a…
Windows Hello for Business
Key Trust vs Certificate Trust vs Cloud Kerberos Trust: Which…
Three trust models, and most admins cannot say for certain which one a given device is…