An admin opens the Intune update ring, reads Quality update deferral period: 7, and writes "our production ring is one week behind Patch Tuesday" into the risk register. That sentence is wrong on the device I used to write this article, and it is wrong by a factor of five.
The real number on that machine is 37 days — not because anything is broken, but because four separate clocks are running, each with a different starting gun, and the portal shows you one of them.
Worse: the classic registry hive that every "audit our WUfB config" script greps held none of the values that produce the 37.
A WUfB deferral does not tell you how far behind a device is. A deferral delays when an update is offered, measured from the day Microsoft released it. A compliance deadline then adds its own countdown, measured from the moment the client discovered the update in a scan — so the two periods add. A grace period adds a third window, measured from pending-restart. A pause adds a fourth, anchored to a date string an admin typed. On the live device I measured, DeferQualityUpdatesPeriodInDays=7 plus ConfigureDeadlineForQualityUpdates=30 plus ConfigureDeadlineNoAutoReboot=1 means an update released on Patch Tuesday is not force-restarted for 37 days. None of those values live in HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate — that key holds exactly two values on this box. They live under PolicyManager\current\device\Update, and the client's own resolved verdict lives in a third key almost nobody reads: WindowsUpdate\UpdatePolicy\PolicyState.
The problem: the portal says 7 and the device is 37 behind
Deferral misreading is not a rare edge case. It is the default state of most fleets, because the mistake is baked into the vocabulary. "Deferral period" sounds like "how late we are". It is not. It is one input to how late you are.
Three things make this failure hard to catch. The first is that the portal is telling the truth: Intune really is sending a 7-day quality deferral, the device really did apply it, nothing shows as non-compliant and no event is logged. The gap between intent and reality is arithmetic, not failure.
The second is that the periods use different anchors. Microsoft documents the feature-update deferral plainly: "The deferral period begins when Microsoft releases the update." But the deadline anchor moved — "The deadline calculation for both quality and feature updates is based off the time when the client initially discovered the update through scan." Discovery cannot happen until the deferral expires. So they stack.
The third is where the values live. On a modern Intune-managed device, they are not in the Group Policy hive that every audit script checks.
ConfigureDeadlineNoAutoReboot=1 it can trigger an immediate forced restart on a user who has had every update notification suppressed. Read the numbers first. Every command in the verification section below is read-only.Here is the classic hive on the device used for this article, read read-only:
The values are one hive over. Intune writes Policy CSP settings into the PolicyManager tree, and Microsoft's own configuration article documents the MDM landing zone as \Microsoft\PolicyManager\default\Update. On this build, that is not where the live values are either — default\Update holds the schema, one subkey per policy, and the applied values sit under current\device\Update. Sixty-five of them.
HKLM\SOFTWARE\Microsoft\PolicyManager\default\Update on this device reports ValueCount=2, SubKeyCount=100 — and the two values are unrelated WNF state names. If you follow the documented MDM registry path and enumerate values, you get nothing and conclude MDM set nothing. The 100 subkeys are the on-device policy schema; the applied values are under current\device\Update.Why it happens: four clocks, four different starting guns
There are four independent controls that can hold an update back, and they do not share a clock. Understanding which event starts each countdown is the entire skill.
Clock 1 — the deferral, anchored to release
The deferral answers one question: how long after Microsoft publishes an update will this device even be offered it. Microsoft's example is unambiguous: a device with DeferFeatureUpdatesPeriodinDays=30 "won't install a feature update that is first publicly available on Windows Update in September until 30 days later, in October".
Quality and feature deferrals use days, but with wildly different ceilings. Quality is capped at 30 days. Feature is capped at 365. That asymmetry is deliberate and the single most common source of "why is this device two releases behind" — a 365-day feature deferral is a legal, supported configuration.
DeferQualityUpdatesPeriodInDays as "Range: [0-30]", and Intune's ring reference says "from 0 to 30". But the summary table in the same Configure Windows Update client policies article lists DeferQualityUpdatesPeriodinDays as "0-35". The device settles it: the on-device schema for that policy carries lowrange=0 and highrange=30. When docs conflict, the schema subkey under PolicyManager\default\Update is the tie-breaker, because it is what the client enforces.Clock 2 — the pause, anchored to a date string
A pause is not a longer deferral. It is a hard stop with its own fixed 35-day life, and it is anchored to a date you supply, not to any update's release.
The modern controls are PauseQualityUpdatesStartTime and PauseFeatureUpdatesStartTime, and they are strings, not numbers — the CSP specifies "string (yyyy-mm-dd, ex. 2018-10-28)", and the in-box WindowsUpdate.admx declares them as text elements with maxLength="10", which is exactly the width of that format. Microsoft is explicit about the arithmetic: "Quality Updates will be paused for 35 days from the specified start date."
That anchoring is what makes a pause dangerous. The 35 days count from a string, so a later start date silently extends the pause — Microsoft documents that too: "In cases where the pause policy is first applied after the configured start date has passed, you can extend the pause period up to a total of 35 days by configuring a later start date."
The legacy boolean forms still exist and still have different windows. PauseQualityUpdates=1 pauses "for 35 days or until value set back to 0, whichever is sooner". PauseFeatureUpdates=1 pauses for 60 days. Same policy family, same units, near-identical names, nearly double the window. Intune writes both booleans and the start-time string to the device, so you have to check all three per update class.
Clock 3 — the deadline, anchored to scan discovery
A compliance deadline does not override a deferral. It runs after it. That is what turns a 7-day ring into a 37-day ring.
Microsoft states the anchor directly: the deadline is "based off the time when the client initially discovered the update through scan", a change from the older behaviour where quality deadlines counted from the release date. A deferred update is not returned by a scan until the deferral expires, so discovery is the earliest post-deferral scan, and deadline days start counting there.
Both deadlines take 0–30 days, with CSP defaults of 7 for quality and 2 for feature. Intune's ring UI documents the input range as "(2-30)" — another place the portal's constraint is narrower than the CSP's.
Clock 4 — the grace period, anchored to pending-restart
Grace is the fourth window, and it exists to stop a user returning from leave being restarted in their face. Microsoft: "The grace period for both quality and feature updates starts its countdown from the time of a pending restart after the installation is complete."
Grace and deadline do not add naively. The documented resolution is a maximum: "The effective deadline is whichever is the later of the scan discovery time plus the specified deadline or the restart required time plus the grace period." Grace only extends the window when installation lands very late relative to discovery.
The fallback chain matters when you audit. ConfigureDeadlineGracePeriodForFeatureUpdates falls back to ConfigureDeadlineGracePeriod if unset, then to a default of 7. Quality grace defaults to 2. An absent value is not a zero.
Precedence: which channel wins, and how the device records it
When both Group Policy and MDM set the same Update policy, the arbiter is MDMWinsOverGP in the ControlPolicyConflict CSP. Microsoft: "If set to 1 then any MDM policy that's set that has an equivalent GP policy will result in GP service blocking the setting of the policy by GP MMC." Default is 0 — meaning Group Policy wins unless you flip it.
You can read both halves of that mechanism on the device. Each schema subkey under PolicyManager\default\Update carries GPBlockingRegKeyPath and GPBlockingRegValueName, naming the exact classic-hive value that gets blocked. The arbiter itself is a single value under PolicyManager\current\device\ControlPolicyConflict, and on this device it reads 1 — consistent with the classic hive holding no deferral values at all.
Microsoft is blunt about the alternative: "it is recommended that the same settings should not be configured in both GPO and MDM policies unless the settings are under the control of MDMWinsOverGP. Otherwise, there will be a race condition and no guarantee which one wins."
Which binary actually reads all this
The arithmetic is not done by Intune. It is done on the box, by components you can version-check.
| Binary | Location and role | Measured version |
|---|---|---|
wuaueng.dll | C:\Windows\System32 — FileDescription "Windows Update Agent". The ServiceDll for wuauserv; the agent that applies deferral and offering logic. | 1509.2607.1012.0 |
wuapi.dll | C:\Windows\System32 — "Windows Update Client API". The COM surface callers use to drive scan and search. | 1509.2607.1012.0 |
usosvc.dll | C:\Windows\System32 — "Update Session Orchestrator Service". Backs UsoSvc, which schedules the scan/download/install/restart phases the deadline governs. | 10.0.26100.8737 |
usoapi.dll | C:\Windows\System32 — "Update Session Orchestrator API". | 10.0.26100.8521 |
MoUsoCoreWorker.exe | C:\Windows\UUS\amd64 — "MoUSO Core Worker Process". Not in System32: it ships in the Unified Update Stack, serviced separately from the OS build. | 1509.2607.1012.0 |
The version split is the point. wuaueng.dll reads 1509.2607.1012.0 while the OS is 10.0.26200.9168. The update agent is versioned independently of Windows, so "our devices are all on the same build" does not mean they are all running the same deferral-evaluation code.
usocore.dll. It appears in a lot of community troubleshooting posts and it does not exist in System32 or SysWOW64 on 26200.9168 — confirmed twice on this device. The real USO binaries are usosvc.dll, usoapi.dll, usodocked.dll and usocoreps.dll. If a runbook tells you to check usocore.dll, that runbook was not tested.How to verify: read the effective values off the device
Four keys, in this order. Do not skip to the third: the value of this sequence is watching the intent turn into an effective number.
Step 1 — the applied MDM values
The shared parent key for everything in the next table:
| Value | Meaning | What to look for |
|---|---|---|
DeferQualityUpdatesPeriodInDays | Days after release before a quality update is offered. REG_DWORD, CSP range 0–30. | Measured 7. This is the number the portal shows you, and the only one most people record. |
DeferFeatureUpdatesPeriodInDays | Days after release before a feature update is offered. Range 0–365. | Measured 0. Anything above ~60 here deserves a written justification. |
PauseQualityUpdatesStartTime | REG_SZ, yyyy-mm-dd. Pause runs 35 days from this date. | Measured empty string — but present, alongside PauseQualityUpdatesStartTime_LastWrite=1. A pause was written here and later cleared. |
PauseQualityUpdates / PauseFeatureUpdates | Legacy booleans. 1 pauses for 35 days (quality) or 60 days (feature). | Both 0. Check both these and the StartTime strings — Intune writes all of them. |
ConfigureDeadlineForQualityUpdates | Days from scan discovery to forced install and restart. Range 0–30, CSP default 7. | Measured 30 — the documented maximum. This is the value that quadruples the window. |
ConfigureDeadlineForFeatureUpdates | Same, for feature updates. Range 0–30, default 2. | Measured 2. |
ConfigureDeadlineGracePeriod | Minimum days from install to automatic restart, quality. Range 0–7, default 2. | Measured 7 — the maximum. Also the fallback for feature grace, which is absent here. |
ConfigureDeadlineNoAutoReboot | 1 = do not auto-restart outside active hours before deadline and grace expire. | Measured 1. This is what lets a device sit installed-but-unrebooted for weeks. |
SetDisablePauseUXAccess | 1 = the user cannot pause updates from Settings. | Measured 1. Good hygiene, and it means any pause you find is admin-authored. |
UpdateNotificationLevel | 0 default, 1 = notifications off excluding restart warnings, 2 = off including restart warnings. | Measured 2. Nobody on this device is being warned about a pending restart. |
AllowAutoUpdate | Automatic update behaviour. Maps to the legacy AU\AUOptions value. | Measured 6. The published CSP lists only 0–5; the on-device schema allows 0–6. Record it, do not guess what 6 means. |
<PolicyName>_WinningProvider | GUID of the management authority that set the sibling value. | Two distinct GUIDs here. Two providers are writing update policy to this one device. |
Step 2 — the on-device schema, for units and ranges you can trust
This is the step almost nobody knows about, and it is the one that ends arguments. Every Policy CSP node has a schema subkey on the device carrying its real range, its default, and the classic value it blocks.
| Policy | lowrange / highrange / default (measured) | GPBlockingRegValueName |
|---|---|---|
DeferQualityUpdatesPeriodInDays | 0 / 30 / 0 | DeferQualityUpdatesPeriodInDays |
DeferFeatureUpdatesPeriodInDays | 0 / 365 / 0 | DeferFeatureUpdatesPeriodInDays |
PauseQualityUpdatesStartTime | no range — policytype=1 (string) | PauseQualityUpdatesStartTime |
PauseQualityUpdates / PauseFeatureUpdates | 0 / 1 / 0 | same name |
ConfigureDeadlineForQualityUpdates | 0 / 30 / 7 | ConfigureDeadlineForQualityUpdates |
ConfigureDeadlineForFeatureUpdates | 0 / 30 / 2 | ConfigureDeadlineForFeatureUpdates |
ConfigureDeadlineGracePeriod | 0 / 7 / 2 | ConfigureDeadlineGracePeriod |
ConfigureDeadlineGracePeriodForFeatureUpdates | 0 / 7 / 7 | same name |
ActiveHoursStart / ActiveHoursEnd | 0 / 23 / 8 and 17 | same name |
ActiveHoursMaxRange | 8 / 18 / 18 | ActiveHoursMaxRange |
ConfigureFeatureUpdateUninstallPeriod | 2 / 60 / 10 | empty — no GP equivalent |
SetActiveHours | no schema subkey at all | n/a — ADMX-only, no CSP node |
Two rows in that table are worth stopping on.
SetActiveHours has no schema subkey because it is not a Policy CSP node. It exists only as an ADMX enable-flag — I confirmed valueName="SetActiveHours" and valueName="SetActiveHoursMaxRange" in the in-box C:\Windows\PolicyDefinitions\WindowsUpdate.admx. A device managed purely by Intune will never have it, so its absence tells you nothing about whether active hours are in force.
ConfigureFeatureUpdateUninstallPeriod has an empty GP-blocking name: MDM-only, no Group Policy twin. Range 2–60 days, matching Intune's "Set feature update uninstall period (2 - 60 days)", measured at 30 here.
Step 3 — the client's own resolved verdict
This is the key that answers "what does the Windows Update agent think it is doing", and it is not the key anyone greps.
| Value | Meaning | Measured on this device |
|---|---|---|
QualityUpdatesDeferralInDays | The deferral the agent has actually resolved for quality updates. | 7 — matches the MDM value, proving policy landed. |
FeatureUpdatesDeferralInDays | Same, for feature updates. | 0 |
DeferQualityUpdates / DeferFeatureUpdates | Synthesized enable flags. Neither has a Policy CSP node — the client derives them. | 1 / 1 |
IsDeferralIsActive | Agent's own boolean for "a deferral is in force right now". | 1 |
IsWUfBConfigured | Reads 0 here while deferrals are demonstrably active. Do not use it as your WUfB test. | 0 |
TargetReleaseVersion / TargetProductVersion | Resolved version pin. | 24H2 / Windows 11 — while the installed release is 25H2. The pin has been overtaken. |
BranchReadinessLevel | Servicing channel, as a string here rather than the CSP's integer. | CB |
IsWUfBDualScanActive | Whether deferral-driven dual scan is active. | 0 |
Step 4 — the pause status, and the active hours nobody set by policy
Microsoft documents two status values under HKLM\SOFTWARE\Microsoft\WindowsUpdate\UpdatePolicy\Settings, and they are the only honest answer to "is this device paused right now": PausedQualityStatus and PausedFeatureStatus, where 0 means not paused, 1 paused, and 2 "auto-resumed after being paused". The companion dates PausedQualityDate and PausedFeatureDate are documented too — but on a never-paused device they do not exist, so a script reading them without a null check reports a blank rather than "never paused".
Microsoft also flags why you cannot trust the console here: "The local group policy editor (GPEdit.msc) won't reflect whether the feature update pause period has expired. Although the device will resume feature updates after 35 days automatically, the pause check box will remain selected in the policy editor."
Active hours are the last trap. The brief for this article expected ActiveHoursStart, ActiveHoursEnd and SetActiveHours to be absent under the WindowsUpdate policy key, and they are. But they are not absent from the device:
Sixteen hours a day of restart suppression, configured by nobody in your management plane, invisible to an audit that only reads policy keys. Microsoft's CSP note is that the default maximum active-hours range is 18 hours from the start time unless ActiveHoursMaxRange says otherwise — and that policy is not set here either, so the user could legally have chosen 18.
The fix: compute days-actually-behind, then hunt the stale pause
The fix is not a registry edit. It is a number you can defend in a risk review, then a search for the control silently holding your fleet.
The arithmetic, on the real measured values
Take Patch Tuesday as day 0 and walk the four clocks with the values measured above — defer 7, deadline 30, grace 7, no-auto-reboot 1.
NoAutoReboot=1 holds the restart.Now add a pause: an incident the Monday before Patch Tuesday, and someone sets PauseQualityUpdatesStartTime to that date.
| Scenario | Offer date | Effective deadline | Days actually behind |
|---|---|---|---|
| Deferral only (deadline unset, CSP default 7) | Day 7 | Day 14 | 14 |
| Measured config: defer 7, deadline 30, grace 7, no-auto-reboot | Day 7 | Day 37 | 37 |
| Same, plus a 35-day pause started the day before release | Day 34 | Day 64 | 64 |
| Same, but the pause is Extended once at the 30-day review | Day 64 | Day 94 | 94 |
Note the second row against the first. Adding a deadline — a control whose whole purpose is to force compliance — more than doubled the exposure window, because it was set to its maximum of 30 while the CSP default is 7. A generous deadline is a deferral in disguise.
PauseFeatureUpdates boolean) — the ceiling is real and Microsoft enforces it. The months-long holds come from re-arming. Intune documents that "Extend" resets the pause period to 35 days for both feature and quality, and that a resume-then-pause "resets the pause period to 35 days". A monthly incident review that clicks Extend each time never expires, and the portal only ever shows "35 days remaining".Where a stale pause actually comes from
Nobody sets a pause and forgets it on purpose. Two documented Intune behaviours create stale pauses as a side effect.
The first is rollback. Intune's own documentation: "When you initiate an uninstall of feature or quality updates on an Update Ring, Intune also pauses updates of the same type on that Update Ring." Roll back one bad LCU and you have paused the ring, whether or not you meant to.
The second is worse, and it is the one to check first. Deleting the ring does not clear what it set: "Deleting a ring from Intune doesn't modify the settings on devices that were assigned the update ring. Instead, the device keeps its current settings. Devices don't maintain a historical record of what settings they held previously."
Delete the incident-response ring that carried the pause, and the values stay on every device that received it, with nothing left in the portal to show you they exist. That is exactly the fingerprint I found on this device.
PauseQualityUpdatesStartTime on this box is an empty string — but it is present, and PauseQualityUpdatesStartTime_LastWrite=1 sits beside it. An empty StartTime with a LastWrite marker is the signature of a pause that was set and then properly cleared: clearing the start date is the documented way to resume ("To resume receiving quality updates that are paused, clear the start date field"). Present-but-empty is good news. Present-with-a-date is the thing you are hunting.The numbered decision path
Run this in order on a device that looks behind. Every step is a read.
- Read
PausedQualityStatusandPausedFeatureStatusunderWindowsUpdate\UpdatePolicy\Settings. If either is 1, stop — the device is paused and nothing else in this list matters yet. Go to step 2. If either is 2, a pause expired and auto-resumed; go to step 3. If both are 0, go to step 3. - Find the pause anchor. Read
PauseQualityUpdatesStartTime/PauseFeatureUpdatesStartTimeand the legacyPauseQualityUpdates/PauseFeatureUpdatesbooleans underPolicyManager\current\device\Update. A date string gives you an expiry: start + 35 days. A legacy boolean at 1 gives 35 days (quality) or 60 (feature) with no visible anchor. Then find which ring still sends it — and whether that ring was deleted. - Read the deferrals from the same key, then confirm them against
QualityUpdatesDeferralInDays/FeatureUpdatesDeferralInDaysunderUpdatePolicy\PolicyState. If the two disagree, policy has been changed but not yet resolved by the agent — do not compute anything until they match. - Read the deadline trio:
ConfigureDeadlineForQualityUpdates,ConfigureDeadlineGracePeriod,ConfigureDeadlineNoAutoReboot. Remember the fallbacks: absent quality grace means 2, absent feature grace means quality grace, then 7. Absent deadline means 7 for quality, 2 for feature. - Compute. Days actually behind = deferral + deadline, floored by (install date + grace) if installation lands late. Add the remaining pause days if step 1 said paused.
- Check the classic hive last, not first. If
HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdateholds any of the same value names andMDMWinsOverGPunderPolicyManager\current\device\ControlPolicyConflictis 0 or absent, Group Policy is winning and your Intune number is fiction. - Check active hours under
WindowsUpdate\UX\Settings. A 16-hour user-chosen window plusConfigureDeadlineNoAutoReboot=1means restarts are only ever attempted in an 8-hour slot — and only if the machine is awake. - Check
UpdateNotificationLevel. At 2, restart warnings are suppressed. Your users are not ignoring the prompt; they are not getting one.
Proof it worked: a real read-only deferral audit
The audit above, run against the live device, produces a number you can put in a report and a provider GUID you can trace back to a management authority.
The event log corroborates the offering side of this. The channel is:
| Event ID | Message (as emitted on this device) | What it tells you |
|---|---|---|
| 26 | "Windows Update successfully found 0 updates." | 555 occurrences in 45 days. A scan completed and returned nothing. Not diagnostic on its own — a fully patched device and a device excluded by a deferral or a pin emit the identical line. |
| 41 | "An update was downloaded." | 110 occurrences. Download happened, which means the deferral had already expired for that update. This is your real "offered" timestamp. |
| 25 | "Windows Update failed to check for updates with error 0x80240438." | 20 occurrences. That code is not in Microsoft's published Windows Update error list — record it, do not assert a meaning for it. |
| 31 | "Windows Update failed to download an update." | 2 occurrences. A download-stage failure, distinct from the scan-stage failure in Event 25. |
Look at the ratio: 555 scans, every one reporting zero updates, against 110 downloads. Event 26 is the most common event on the channel and carries almost no information about deferral state, which is exactly why "the device is scanning fine" is not evidence that the device is current.
One last correlation from the same device, proving the offering path is live rather than blocked. The Setup log recorded Event 2 — "Package KB777778 was successfully changed to the Staged state" — at 21:46:02 on 21 August, and Event 1013/1014 (store corruption detection, "Detection Only: 1", zero instances found) later that evening. Staging happens. Scans succeed. The device is not stuck.
That is the distinction this article is about. "Stuck" is a fault you fix. "Thirty-seven days behind by configuration" is a decision somebody made, probably without knowing they were making it, and it appears nowhere in your compliance reporting.
References
- Configure Windows Update client policies — the deferral and pause policy tables, the 35-day pause arithmetic, the
PausedQualityStatus/PausedFeatureStatusvalues, and the GPEdit.msc warning. - Enforce compliance deadlines with policies — the effective-deadline definition, the scan-discovery anchor, and the grace-period countdown.
- Update Policy CSP — every node name, data type, range and default cited above.
- ControlPolicyConflict Policy CSP —
MDMWinsOverGP, its default of 0, and the race-condition warning. - Manage Windows update ring policies (Intune) — Pause, Resume, Extend and Uninstall behaviour, and the fact that deleting a ring leaves device settings in place.
- Update rings policy settings reference (Intune) — the portal-side ranges, including the 0–30 and 0–365 deferrals and the 2–60 day uninstall period.
- Avoid legacy policy configurations —
DeferUpdatePeriodin weeks,DeferUpgradePeriodin months, and the 60-day legacy feature pause.
All registry values, binary versions and event counts here were read read-only from one live Windows 11 Enterprise 25H2 device, build 26200.9168, on 23 August 2026. The console blocks are CSS-simulated reproductions of that output, not screenshots.