Two devices in the same fleet both moved from one Windows 11 version to the next last month. One took four minutes and a single restart. The other took ninety minutes, wrote a multi-gigabyte payload to disk, rebooted three times and left a Windows.old folder behind. Same operating system. Same management tooling. Completely different change record, completely different maintenance window, completely different risk.
That is not a bug. It is two entirely different delivery mechanisms hiding behind one word: feature update. This post explains which is which, how to tell from a build number alone, and why the choice has a servicing-lifecycle consequence that catches people out a year later.
Windows 11 versions 24H2 and 25H2 share one servicing branch and one identical set of system files, so the 25H2 code already sits dormant on every patched 24H2 device. The version change is therefore a tiny enablement package (KB5054156) that flips feature flags and needs one restart, not a full operating system swap. You can tell which path a device is on from CurrentBuild alone: 26100 is 24H2, 26200 is 25H2, and both take the exact same monthly cumulative update with the exact same UBR. The sting is that identical code does not mean identical support - 24H2 Enterprise stops getting that shared update on 2027-10-12 while 25H2 Enterprise keeps it until 2028-10-10.
The problem: two very different updates wearing one label
Windows Update, WSUS and the Intune admin center all use the same phrase for both mechanisms. In every one of those consoles the change is called a feature update. In the Intune admin center it lives under a node literally named Feature updates. Nothing in the console tells you whether the device is about to download an operating system or flip a switch.
The practical consequences of guessing wrong run in both directions.
Guess too big. You schedule a four-hour Saturday window, warn the business, arrange cover, stage a Microsoft Connected Cache node, and confirm every device has 25 GB free. The change completes in one restart per device. You have burnt a weekend and a chunk of goodwill on a reboot.
Guess too small. You treat it as a reboot, push it into a Tuesday-evening deadline, and discover that the devices on the older branch are doing a full operating system swap. Laptops sit on the spinning-dots screen for over an hour, some run out of disk, and your service desk queue triples on Wednesday morning.
There is a third failure mode that is quieter and more expensive. Because the two versions on a shared branch contain the same code, admins conclude the version number does not matter and stop chasing it. Twelve months later the older version drops out of support - and stops receiving the very same monthly package the newer version is still getting. Devices that were byte-for-byte identical to a supported device are now unpatched.
Terms, spelled out once. A feature update is the annual release that changes the version - 24H2, 25H2. A quality update is the monthly cumulative fix package, also called an LCU (latest cumulative update). An enablement package - Microsoft's own shorthand is eKB - is a tiny update whose only job is to turn on code that is already present. UBR is the Update Build Revision, the fourth number in 10.0.26200.9168. CSP is a Configuration Service Provider, the settings surface MDM tools such as Intune write to. ADMX is the XML file format that defines Group Policy administrative templates.
Why it happens: one servicing branch, two version numbers
Start with what Microsoft actually builds. A servicing branch is a single code line that produces monthly cumulative updates. Historically each Windows version had its own branch. Since Windows 10 version 1903, Microsoft has periodically put two consecutive versions on one branch.
Microsoft states it plainly for the current pair. Windows 11 versions 24H2 and 25H2 "share a common core operating system with an identical set of system files", so the new 25H2 features "are included in the latest monthly quality update for Windows 11, version 24H2 but are in an inactive and dormant state".
Read that again, because it is the whole mechanism. The 25H2 features are not waiting on a server. They were delivered to your 24H2 devices months ago, inside ordinary Patch Tuesday packages, switched off.
The chain, from code complete to new version number
Here is what calls what, in order:
- A feature is finished in the shared branch. Instead of holding it for an annual release, Microsoft puts it into a monthly LCU for the current version - so 25H2 features shipped inside 24H2 cumulative updates.
- Some of those features are visibly live straight away. Others are held back on managed devices by temporary enterprise feature control, which turns off selected features on any device that gets its updates from Windows Update client policies or WSUS. Configuration Manager and Intune count as managed, because their updates ultimately come from those two.
- The bits sit on disk, dormant, month after month. Your 24H2 device is carrying 25H2 code it is not running.
- Windows Update offers the enablement package. Microsoft describes it as "a small, quick-to-install switch that activates all of the Windows 11, version 25H2 features".
- The eKB installs through the normal component-based servicing path. It changes flags from disabled to enabled and requires a restart. Microsoft's KB is explicit: "You must restart your device after you apply this update."
- After the restart,
CurrentBuildreads 26200 instead of 26100,DisplayVersionreads 25H2, and the temporary enterprise feature control on that feature set ends.
No operating system image was downloaded. No Windows.old was created. No migration ran. That is why it finishes in one restart.
Which transitions get the switch, and which get the swap
This is the table to keep. Everything in it comes from Microsoft's published version pages and the Windows 11 release information page.
| Version and build | Shares a branch with | How you get to the next version |
|---|---|---|
| 21H2 - build 22000 | Nothing | Full feature update |
| 22H2 - build 22621 | 23H2 (22631) | Enablement package, KB5027397 |
| 23H2 - build 22631 | 22H2 (22621) | Full feature update - "a full operating system (OS) swap" |
| 24H2 - build 26100 | 25H2 (26200) | Enablement package, KB5054156 |
| 25H2 - build 26200 | 24H2 (26100) | Top of its branch - check current guidance |
| 26H1 - build 28000 | Nothing | Not offered via Windows Update at all |
Two rows in that table deserve their own paragraph.
23H2 is the cliff edge. Microsoft's own announcement is blunt: "Windows 11 eligible devices on Windows 11, version 23H2 (and earlier versions) require a full operating system (OS) swap to update to Windows 11, version 25H2." If your estate is mixed, half of it gets a reboot and half of it gets a genuine upgrade. Plan both.
26H1 is not a third option, it is a different animal. Microsoft is explicit that 26H1 "isn't a feature update", is available "only preinstalled on select new devices", and "can't be installed as an in-place update on existing devices". It is a silicon-enablement release on build 28000, a different Windows core. Microsoft also warns that devices on 26H1 "won't be able to update to the next annual feature update" and will get a path in a future release. If a new laptop model arrives on 26H1, do not put it in your normal feature-update ring and expect it to converge.
Gotcha - the eKB is not in the Microsoft Update Catalog. This is where a lot of runbooks are wrong. Microsoft's KB5054156 article lists exactly two delivery channels: Windows Update, where "the feature update is named 'Windows 11, version 25H2'", and WSUS, with Product: Windows 11 and Classification: Upgrades. For the catalog the article says the update "is only available through the other release channels". If your process depends on downloading a standalone .msu from the catalog and pushing it as a Win32 app, that process is not the documented path. Deliver it as an upgrade through WSUS, Configuration Manager or a Windows Update policy instead.
Build versus UBR - the distinction that answers everything
A Windows build string has four parts: 10.0.<build>.<UBR>. On the device this post was written on that is 10.0.26200.9168.
- The build (26200) is the branch-and-version identity. Only a feature update or an enablement package changes it.
- The UBR (9168) is the monthly revision. Every cumulative update increments it. Nothing else does.
Now look at what Microsoft's release information page listed for August 2026. Both 24H2 and 25H2 show the same latest update, KB5121003, on the same date. 24H2 lands on 26100.9168; 25H2 lands on 26200.9168. One KB, one payload, two build numbers, one identical UBR.
That matching UBR is the fingerprint of a shared branch. Compare it with 23H2 in the same month: a different KB entirely (KB5120240) producing 22631.7517. Different branch, different package, unrelated revision number.
So the diagnostic rule is short. If two versions publish the same monthly KB and the same UBR, they are one branch and the hop between them is an enablement package. If they publish different KBs, the hop is a full operating system swap.
Why the lifecycle still differs. Identical code, separate clocks. From the Windows 11 release information page: 24H2 became available 2024-10-01 and its Enterprise, Education and IoT Enterprise editions stop receiving updates on 2027-10-12. 25H2 became available 2025-09-30 and those same editions are covered until 2028-10-10. Pro-family editions get 24 months rather than 36, so 24H2 Pro ends 2026-10-13 and 25H2 Pro ends 2027-10-12. Once 24H2 falls out of support, KB packages it shares with 25H2 simply stop being offered to it. The bits were never the thing being supported - the version string was.
How to verify: build, UBR, branch and pin on a live device
Everything below was run on a real Windows 11 Enterprise 25H2 device. Identifiers are replaced where any appear.
Registry - the version identity values
All of the version identity lives under one key. Read it, do not write it.
| Value name and type | Example on this device | What to trust it for |
|---|---|---|
CurrentBuild (REG_SZ) | 26200 | The authoritative version and branch identity. This is what you key detection and assignment filters on. |
CurrentBuildNumber (REG_SZ) | 26200 | Legacy duplicate of CurrentBuild. Same value. Pick one and be consistent. |
UBR (REG_DWORD) | 9168 | Monthly patch level. Use it to prove the LCU landed, never to identify a version. |
DisplayVersion (REG_SZ) | 25H2 | The human-facing version label, the one winver shows. Introduced with Windows 10 version 20H2, so absent on anything older. |
ProductName (REG_SZ) | Windows 10 Enterprise | Almost nothing. See the warning below. |
EditionID (REG_SZ) | Enterprise | Edition, which drives the 24-month versus 36-month servicing clock. |
ReleaseId (REG_SZ) | 2009 | Frozen since Windows 10 version 2009. Do not use it. DisplayVersion replaced it. |
CurrentMajorVersionNumber / CurrentMinorVersionNumber (REG_DWORD) | 10 / 0 | Still 10.0 on Windows 11. Useless for distinguishing Windows 10 from Windows 11. |
BuildLabEx (REG_SZ) | 26100.1.amd64fre.ge_release.240331-1435 | Nothing operational - but see the note under it. It is a superb illustration of the shared branch. |
Never build detection logic on ProductName, ReleaseId or BuildLabEx. On this genuine Windows 11 Enterprise 25H2 machine, ProductName reads Windows 10 Enterprise, ReleaseId reads 2009, and BuildLabEx still reads 26100.1 - the 24H2 base - even though CurrentBuild is 26200. Those three values are observed-and-undocumented behaviour: Microsoft does not publish a contract for them, so any of them can change in any update without notice. A compliance script that keys on ProductName will report a fleet of Windows 11 devices as Windows 10 and nobody will notice until audit. Key on CurrentBuild.
Here is the same key read from a console. The command below pulls the six values worth having and prints them as a list.
Reading it in the graphical tool looks like this. The same values, the same key.
Registry - the target release version pin
The second key that matters is the Windows Update policy key. This is where a version pin is written when you use Group Policy.
| Value name and type | Meaning | Set by |
|---|---|---|
TargetReleaseVersion (REG_DWORD) | 1 turns the pin on. Absent or any other value means no pin. | The Select the target Feature Update version policy. |
TargetReleaseVersionInfo (REG_SZ) | The version to sit on, for example 24H2 or 25H2. This is the Policy CSP Update/TargetReleaseVersion string. | The Target Version for Feature Updates field in the same policy. |
ProductVersion (REG_SZ) | The product, for example Windows 11. Microsoft documents it as the partner of the version string. | The Which Windows product version... field in the same policy. |
DeferFeatureUpdatesPeriodInDays (REG_DWORD) | 0-365. A deferral, not a pin. Expires by arithmetic; a pin does not. | Select when Preview Builds and feature updates are received. |
PauseFeatureUpdatesStartTime (REG_DWORD) | Pauses feature updates for up to 35 days from the start date, then auto-resumes. | The pause policy. Check PausedFeatureStatus to see whether it already expired. |
AllowTemporaryEnterpriseFeatureControl (REG_DWORD) | 1 enables every feature in the latest cumulative update immediately, without waiting for the eKB. | Enable features introduced via servicing that are off by default. |
Intune writes the same intent to a different place. Microsoft's tables document the MDM keys landing under HKEY_LOCAL_MACHINE\Software\Microsoft\PolicyManager\default\Update, with the merged effective values observable under the current\device\Update subtree on a live machine. Check both surfaces, because they disagree more often than you would like.
Gotcha - a stale pin looks like an enforced pin. On the device used for this post, the ADMX key holds TargetReleaseVersion = 1 and TargetReleaseVersionInfo = 24H2, while the machine itself is happily running 25H2 and the Intune PolicyManager equivalents are empty. Someone set a Group Policy pin, later moved version control to Intune, and the old value was never removed. Reading only the ADMX key would tell you this device is held at 24H2. It is not. Also note ProductVersion is absent here - Microsoft documents the product and version as a pair, and leaving the product blank lets the client resolve the highest matching release. Always read both keys and compare them with DisplayVersion.
Event Viewer - what an eKB install leaves behind
The enablement package installs through Component Based Servicing, so its evidence lands in the Setup channel, not the System log.
Microsoft does not publish a reference catalog of Setup-channel event IDs for the Servicing provider. The table below is therefore observed on a live 25H2 device, not documented. It is genuinely useful for reading a log by hand, and genuinely unsafe to build alerting on, because an undocumented ID can be renumbered in any update.
| Event ID (observed) | Message shape | What it tells you |
|---|---|---|
| 1 | Initiating changes for package name. Current state is X. Target state is Y. Client id: client. | A servicing transaction started. The Client id names the caller - UpdateAgentLCU for Windows Update, DISM Package Manager Provider for DISM, CbsTask for maintenance. |
| 2 | Package name was successfully changed to the state state. | The transaction finished. For an eKB you want to see the package reach Installed. |
| 4 | A reboot is necessary before package name can be changed to the Installed state. | This is the eKB's single restart, in log form. Until the restart happens the version has not changed. |
| 7 / 9 / 13 | Initiating changes to turn on / successfully turned on / reboot needed for selectable update name. | Optional-feature transitions. Useful for spotting a feature turned on in the same servicing session. |
| 1013 / 1014 | Initiating system store corruption detection and repair / ...has completed. Status: 0x0, Total instances of corruption found: 0. | Component store health. A non-zero corruption count here explains an eKB that will not install. |
Gotcha - the Setup log rotates and it rotates fast. On the device used here the Setup channel held roughly 2,500 events, all from the previous 24 hours, and the actual KB5054156 install from months earlier was long gone. If you need the eKB install event as audit evidence, collect it within days or forward the Setup channel to a collector. Do not assume it will still be there at review time. The component store, by contrast, remembers permanently - use it instead.
System files - the binaries that actually do the work
Two different code paths, two different sets of binaries. This is the clearest way to see that an eKB is not an upgrade.
| Binary and location | Role in the flow | Which path |
|---|---|---|
C:\Windows\UUS\amd64\MoUsoCoreWorker.exe | Update Session Orchestrator worker. Scans, decides applicability, and hands the payload to servicing. Lives under the Unified Update Platform folder, which is itself serviced independently. | Both |
C:\Windows\Servicing\TrustedInstaller.exe | The Windows Modules Installer service host. This is the process that actually installs the eKB and flips the flags. | Both |
C:\Windows\Servicing\CbsApi.dll | The Component Based Servicing API surface. Everything package-shaped goes through it. | Both |
C:\Windows\System32\poqexec.exe | Primitive Operations Queue executor. Runs the file and registry operations that were queued for the next boot. This is what the eKB's single restart is waiting on. | Both |
C:\Windows\System32\dism.exe | The command-line servicing tool. You use it read-only here, to inspect packages. | Both |
C:\Windows\System32\wusa.exe | Windows Update Standalone Installer. Historically the way a .msu was applied by hand. | Both |
C:\Windows\System32\oobe\SetupPlatform\SetupPlatform.exe | The setup engine that drives an in-place operating system swap - compatibility scan, offline phases, migration, rollback. | Full feature update only |
Package_for_KB5054156~31bf3856ad364e35~amd64~~26100.6717.1.4.mum | The eKB itself: a package manifest in the component store, not an executable. The whole "master switch" is a manifest. | Enablement package only |
Look closely at that last row. The package version reads 26100.6717 - the 24H2 branch - even though installing it produces a 25H2 device. The eKB is built against the branch it enables features inside. That single string is the shared servicing branch made visible.
The command below queries the component store for that package. Get-WindowsPackage is read-only; it changes nothing.
Log files - the exact strings to grep
| Path | Search string | Healthy versus broken |
|---|---|---|
C:\Windows\Logs\CBS\CBS.log | Package_for_KB5054156 | Healthy: CBS: Package Keyform: Package_for_KB5054156~...~26100.6717.1.4 followed by Appl: detect Parent ... Exist: present lines. Broken: Exist: absent, meaning the prerequisite cumulative update is missing. |
C:\Windows\Logs\CBS\CBS.log | Device: OS version | Healthy: Device: OS version 10.0.26200.9168. Compare it against CurrentBuild plus UBR; a mismatch means a servicing operation is mid-flight. |
C:\Windows\Logs\CBS\CbsPersist_*.log and .cab | Same strings | Rotated history. This is where an install from months ago survives after CBS.log has rolled. |
C:\Windows\Panther\setupact.log | Timestamp of the file itself | This is the strongest single tell. Panther is written by Windows Setup. On the 25H2 device here, setupact.log is dated March 2025 - the original 24H2 install - and the February 2026 move to 25H2 touched nothing in it. A stale Panther plus a recent version change equals an enablement package. A fresh Panther means a real operating system swap. |
C:\Windows\Panther\setuperr.log | Error | Only populated by an actual setup run. Empty or ancient on an eKB-only device. |
C:\Windows\Logs\WindowsUpdate\*.etl | Decode with Get-WindowsUpdateLog | Offer-side evidence: whether the update was ever offered, and whether a pin or a safeguard hold blocked it. |
Services and scheduled tasks
| Short name and display name | Expected state | Why it matters here |
|---|---|---|
TrustedInstaller - Windows Modules Installer | Manual, Running only during servicing | Installs the eKB. If it is disabled by hardening policy, the eKB fails and the version never changes. |
UsoSvc - Update Orchestrator Service | Automatic, Running | Decides what is offered, applies pins and deferrals, schedules the restart. |
wuauserv - Windows Update | Manual, Running on demand | The client agent that scans and downloads. |
DoSvc - Delivery Optimization | Automatic, Running | Peers the payload. Barely relevant for a tiny eKB; critical for a multi-gigabyte feature update. |
bits - Background Intelligent Transfer Service | Automatic, Running | Transfer fallback when Delivery Optimization is unavailable. |
| Scheduled task | State observed | Role |
|---|---|---|
\Microsoft\Windows\UpdateOrchestrator\Schedule Scan | Ready | The scan that discovers the eKB is being offered. No scan, no offer. |
\Microsoft\Windows\UpdateOrchestrator\Report policies | Ready | Pushes the device's policy state, including any version pin, back to the update service. |
\Microsoft\Windows\UpdateOrchestrator\USO_UxBroker | Ready | Drives the restart prompt the user sees. |
\Microsoft\Windows\Servicing\StartComponentCleanup | Ready | Automatic component store cleanup. Read the red warning below before you go anywhere near this one. |
Destructive risk - component cleanup can permanently remove your ability to roll back. Microsoft's DISM documentation states it directly: "Installed Windows updates can't be uninstalled after running /StartComponentCleanup with the /ResetBase option." The enablement package is, to servicing, just an installed update. If a build script, a disk-space remediation or an image-hardening step runs DISM /Online /Cleanup-Image /StartComponentCleanup /ResetBase after the version change, removing the eKB is off the table for good. Never put /ResetBase in a routine maintenance script on production endpoints, and never run it inside a version-change window.
Can the enablement package be uninstalled?
Here honesty matters more than a tidy answer.
Microsoft's KB5054156 article documents no uninstall procedure at all. It says the update does not replace any previously released update, and it says you must restart. It does not offer a removal path.
What is documented elsewhere is the general machinery. Windows exposes an Uninstall updates list at Settings > Windows Update > Update history > Uninstall updates, and Microsoft notes plainly that "Some updates cannot be uninstalled". DISM documents /Remove-Package for removing a .cab-based package by name from an online image. And Microsoft documents a dedicated policy for how long a feature update stays removable: Update/ConfigureFeatureUpdateUninstallPeriod, an integer with a default of 10 days and an allowed range of 2 to 60, at the Group Policy path Windows Components > Windows Update > Manage end user experience.
On the live device, the eKB behaves like an ordinary update in every observable way: it appears in Get-HotFix as KB5054156 with description Update, and its component store state is Installed with Restart Required: Possible. There is no Windows.old folder anywhere on the disk, because no operating system was swapped, so the classic Go back rollback image simply does not exist for this transition.
Tip - treat the eKB as a change you can reverse, not a change you can undo. Because the removal path is undocumented for this specific package, plan the reverse the same way you would plan the forward: through policy. Set the target release version back to the previous version and let the update service stop offering the newer one to the devices that have not moved yet. For devices already moved, test removal on a lab machine and measure it - do not assume it will work at scale, and do not learn the answer during an incident. And check ConfigureFeatureUpdateUninstallPeriod before you need it, not after.
Defender and security policy
This one is genuinely not applicable, and saying so is more useful than inventing a link. Enablement package delivery involves no Defender component: no Attack Surface Reduction rule governs it, no exploit protection setting applies, no WDAC policy or firewall rule is involved, and there is no Endpoint Security profile in Intune that touches it. It is a Component Based Servicing operation driven by the update client.
There is one indirect connection worth knowing. Because the eKB ends temporary enterprise feature control on a set of features, a restart can turn on user-facing features you had not reviewed - Microsoft's 25H2 page lists Agent in Settings, improved Windows search, Click to Do and AI actions in File Explorer as the features leaving temporary control in that transition. Several of those have their own permanent management controls. Review them before the eKB lands, not after, because the eKB is not the thing you can configure - the individual feature policies are.
The fix: choose the path deliberately, then pin it
The fix is not a registry edit. It is deciding which version your fleet sits on, writing that decision down as policy, and verifying the write landed.
Group Policy - the full click path
This is the ADMX-backed route. It writes to the Policies\Microsoft\Windows\WindowsUpdate key described earlier.
- Open the Group Policy Management Editor on the GPO you use for Windows Update, or
gpedit.mscfor a single machine test. - Navigate to Computer Configuration > Administrative Templates > Windows Components > Windows Update > Manage updates offered from Windows Update.
- Open Select the target Feature Update version. The setting comes from
WindowsUpdate.admx, so make sure your Central Store has a current copy. - Set it to Enabled.
- In Which Windows product version would you like to receive feature updates for? type
Windows 11. Microsoft documents accepted product strings includingWindows 11,11andWindows 10. Do not leave it blank. - In Target Version for Feature Updates type the version you want, for example
25H2. This is a version label, not a build number. - Apply, then run
gpupdate /target:computer /forceon a test device. - Verify the three values landed:
TargetReleaseVersionis1,TargetReleaseVersionInfois your version string, andProductVersionis your product string. IfProductVersionis missing, the policy did not save both fields - reopen it.
A pin is not a deferral. Microsoft documents two behaviours you should not confuse. A pause expires automatically after 35 days and cannot be extended past that. A deferral is arithmetic - up to 365 days from the release date - and then it is over. A target release version pin holds until you change or remove it, or until that version reaches end of service. If your intent is "we sit on 25H2 until we say otherwise", the pin is the only one of the three that expresses it.
Intune Settings Catalog - the CSP route
The same two values, delivered by MDM. Microsoft documents the CSP names as ./Device/Vendor/MSFT/Policy/Config/Update/TargetReleaseVersion and ./Device/Vendor/MSFT/Policy/Config/Update/ProductVersion, both string type.
- Sign in to the Microsoft Intune admin center and go to Devices > Configuration.
- Select Create > New policy. Platform Windows 10 and later, profile type Settings catalog. Select Create.
- Name the policy something a colleague will understand a year from now, for example
WIN-Update-TargetVersion-25H2. Select Next. - On Configuration settings choose Add settings, then search for
Target Release Version. The Windows Update for Business settings are grouped together in the picker; the underlying CSP isUpdate/TargetReleaseVersion. - Tick Target Release Version and, in the same category, Product Version. Add both. Configuring one without the other is the most common mistake here.
- Set Product Version to
Windows 11and Target Release Version to25H2. - Select Next through Scope tags, assign to a pilot device group first, then Create.
- After the device checks in, verify on the endpoint. The MDM values land under the PolicyManager subtree, not the ADMX
Policieskey - so confirm there, and confirm no stale ADMX value is contradicting you.
Gotcha - two policy surfaces, one outcome, no shared view. Group Policy writes to ...\Policies\Microsoft\Windows\WindowsUpdate. MDM writes under ...\Microsoft\PolicyManager\...\Update. Neither console shows you the other one. The device in this post is living proof: an ADMX pin to 24H2 sitting untouched while the machine runs 25H2 under Intune management. Before you declare a fleet pinned, read both keys on real devices - a report from either console alone is not evidence.
Intune feature update policies - the orchestrated route
Since the target release version pin only says "no further than this", Microsoft also provides a policy type whose job is to actively deploy a chosen version with rollout control.
- Go to Devices > Windows, then Windows updates > Feature updates.
- Select Create profile.
- Under Deployment settings, give it a name, then pick the version from the Feature update to deploy dropdown. Only in-support versions appear.
- Choose Make available to users as a required update for a managed rollout, or Make available to users as an optional update to let users pull it themselves. The optional path requires a Windows Autopatch licence.
- Configure Rollout options to phase availability rather than releasing to everyone at once.
- Assign to device groups, review, then Create.
- Then go back to your update ring and set Feature update deferral period (days) to 0. Microsoft is explicit that combining ring deferrals with feature update policies "adds unnecessary complexity and can delay or block feature updates".
- Confirm the Windows feature updates (Organizational) report shows targeted devices at state OfferReady before you remove the deferrals. That state is your proof the service has processed the policy.
Tip - size the window from the build number, not from the word "upgrade". Build a two-bucket report before every annual release. Bucket one: devices where CurrentBuild is already on the shared branch. These take the eKB - schedule a restart, not a window, and expect minutes. Bucket two: devices on an older build. These take a full operating system swap - schedule a real window, confirm free disk space, verify Delivery Optimization or a Connected Cache node, and keep a rollback plan. One assignment filter on CurrentBuild gives you both buckets. The companion script below produces exactly that verdict per device.
WSUS and Configuration Manager
If you sync updates yourself, the eKB arrives as an Upgrade, not an Update. Microsoft documents the WSUS configuration for KB5054156 as Product: Windows 11 and Classification: Upgrades. If your WSUS product and classification selections do not include Upgrades, the enablement package will never appear in your console and your devices will never be offered it - and nothing will look broken, because everything else keeps syncing normally. Check that first when devices refuse to move.
Proof it worked: real output from a 25H2 device
The companion script, Get-ServicingBranchIdentity.ps1, assembles the whole answer in one place: version identity, servicing branch, whether the next version change is a switch or a swap, any target release version pin on either policy surface, and whether an enablement package is present in the component store. It is read-only, it needs no modules, and it aborts with exit code 1 rather than print a clean-looking report after a failed read.
This is a genuine run on the Windows 11 Enterprise 25H2 device used throughout this post, with nothing invented. Hostnames were not printed by the script, so nothing needed redacting - but note the stale pin it caught.
Read that output as a story. Block 1 and 2 establish the device is on 25H2, build 26200, on the branch it shares with 24H2. Block 5 proves how it got there - an enablement package, installed on a specific date, still sitting in the component store as evidence months later when the Setup event log had long since rotated away. Block 4 is the finding that would never have surfaced from a console: a Group Policy pin that says one thing while the device does another.
Three things you now know that you cannot get from winver: which mechanism moved this device, when, and whether the policy you think is protecting it actually is.
The script is on GitHub in the feature-update-enablement-package-ekb-mechanics folder of the Windows-11-Scripts repository. Run it with -SkipPackageQuery for a fast identity-and-pin check, or -Quiet to drop the prose when you are collecting output across a fleet.
References
- KB5054156: Feature update to Windows 11, version 25H2 by using an enablement package - Microsoft Support. The shared core statement, the prerequisite, the restart requirement, and the WSUS product and classification.
- What's new in Windows 11, version 25H2 for IT pros - Microsoft Learn. The enablement package description, the servicing timeline, and the features leaving temporary enterprise feature control.
- What's new in Windows 11, version 23H2 for IT pros - Microsoft Learn. The equivalent statement for the 22H2 to 23H2 enablement package, KB5027397.
- Windows 11, version 26H1 for IT pros - Microsoft Learn. Why 26H1 is not a feature update, is preinstall-only, and cannot take the next annual release.
- Windows 11 release information - Microsoft Learn. Build numbers, availability dates, end-of-updates dates per edition, and the shared monthly KB across 24H2 and 25H2.
- Lifecycle FAQ - Windows - Microsoft Learn. The 24-month and 36-month servicing timelines by edition.
- Update Policy CSP - Microsoft Learn.
TargetReleaseVersion,ProductVersionandConfigureFeatureUpdateUninstallPeriod, with the Group Policy mappings and theWindowsUpdate.admxreference. - Configure Windows Update client policies - Microsoft Learn. The registry key tables for Group Policy versus MDM, deferrals, pauses, and
AllowTemporaryEnterpriseFeatureControl. - Configure Windows feature update policies - Microsoft Learn. The Intune admin center click path and the guidance on moving off update ring deferrals.
- DISM operating system package servicing command-line options - Microsoft Learn.
/Get-Packages,/Get-PackageInfo,/Remove-Package, and the/ResetBasewarning. - How to get the Windows 11 2025 Update - Windows Experience Blog. The shared code base statement and the full operating system swap requirement for 23H2 and earlier.
- How to uninstall a Windows update - Microsoft Support. The Settings path, and the note that some updates cannot be uninstalled.
Community deep-dives worth reading
Each of these was opened and confirmed on topic before being listed here.
| Author and site | Article | Why it helps |
|---|---|---|
| Ben Whitmore, MSEndpointMgr | Intune assignment filters for every in-support Windows build | Generates assignment filters from the Windows Update for Business deployment service catalog rather than hardcoding build numbers. Exactly the tooling you need to split eKB devices from swap devices. |
| Benoit Lecours, System Center Dudes | Upgrade Windows 11 22H2 using SCCM | Written for the previous shared branch, and still the clearest statement of the rule that an enablement package only ever takes you to the next version, never across several. |
| Peter van der Woude, All about Microsoft Intune | Smoothly introducing new feature updates for Windows 11 as optional updates | Walks the optional-versus-required choice inside Intune feature update policies, which is the control that decides whether the eKB lands on your schedule or the user's. |
Download it from Imran76Awan/Windows-11-Scripts — no sign-in required. It is read-only: it reports and never changes a device or anything in Intune. Validate it in your own environment before relying on the output.