HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Windows 11 Windows 11Servicing Stack UpdateCumulative UpdateDISMCBSWSUSOffline ServicingPowerShell

Servicing Stack Update Before Cumulative Update: Why the Order Matters and What a Combined SSU+LCU Package Really Is

IA
Imran Awan
21 August 2026

Every Windows update is installed by code. That code is itself shipped as an update. If you have never thought about that circularity before, this post is about the moment it bites you.

The component that installs Windows updates is called the servicing stack. Microsoft ships fixes for it as a servicing stack update, or SSU. A cumulative update, or LCU (latest cumulative update), is the monthly package of security and quality fixes. The SSU has to be current before the LCU can apply. Get that order wrong and Windows fails with an error code that names nothing helpful.

The short version

The servicing stack is the code that installs Windows updates, so it must be current before a cumulative update can apply. Since February 2021 Microsoft combines the SSU into the LCU payload for Windows Update, WSUS and the Microsoft Update Catalog, so online devices get the order right by themselves. Offline image servicing is where it breaks: the documented sequence applies the servicing stack from the cumulative update first, before languages, features and the LCU itself. And the combined package is a one-way door - Microsoft documents that wusa.exe /uninstall will not work on it and that the SSU cannot be removed after installation, leaving DISM /Remove-Package against the LCU package name as the only rollback.

The problem: an update that refuses to install, and a rollback that does nothing

There are two failures in this story, and they look unrelated until you know the mechanism.

Failure one. You are servicing a Windows 11 reference image offline. You mount install.wim, inject this month's cumulative update with DISM, and it fails. Or a technician downloads an .msu from the Microsoft Update Catalog, runs it on a machine that has been off for six months, and it fails. The error code is 0x800f0823.

That code has a name. Microsoft documents it as CBS_E_NEW_SERVICING_STACK_REQUIRED, and the troubleshooting article tells you to search CBS.log for a line like this one:

CBS.log - the line that explains everything
2023-09-04 15:01:53, Error    CBS    Package "Package_for_KB5012170~31bf3856ad364e35~amd64~~14393.5285.1.4" requires Servicing Stack v10.0.14393.5285 but current Servicing Stack is v10.0.14393.4349. [HRESULT = 0x800f0823 - CBS_E_NEW_SERVICING_STACK_REQUIRED]

Read that line slowly. The package is not corrupt. The disk is not full. The package is telling you it needs a newer version of the installer than the one you have. Microsoft's own wording for the cause is blunt: the error means the computer's servicing stack is out of date, and if it occurs the computer cannot process new updates correctly.

Failure two. A cumulative update goes out, something regresses, and you want it gone. You reach for the tool you have always used:

Command Prompt - run elevated - THIS WILL NOT WORK
wusa.exe /uninstall /kb:5121003 # Broken: on a combined SSU+LCU package this does nothing useful. # Microsoft documents it plainly: "Running Windows Update Standalone # Installer (wusa.exe) with the /uninstall switch on the combined package # will not work because the combined package contains the SSU." # Healthy alternative: DISM /Remove-Package with the LCU package name.

Both failures come from the same fact. The thing that installs updates is itself an update, and Microsoft has to be careful about the order in which those two things touch a machine.

Gotcha. Failure one is far more common in offline and on-premises workflows than on internet-connected devices. Windows Update, WSUS and Configuration Manager orchestrate the ordering for you. DISM against a mounted WIM does not orchestrate anything you did not ask for. If your image build pipeline predates February 2021, it may still be trying to fetch a separate SSU package that is no longer published.

Why it happens: the stack that installs updates has to update itself first

What the servicing stack actually is

Start with the plainest possible definition, which is Microsoft's own. Servicing stack updates provide fixes to the servicing stack, the component that installs Windows updates.

That component is bigger than it sounds. The same documentation says the servicing stack contains the component-based servicing stack, abbreviated CBS, and that CBS underpins several other things you use every week:

So the servicing stack is not a small helper for Windows Update. It is the transaction engine for the entire component store. When it is out of date, every one of those operations is at risk.

The chain, from click to reboot

Here is what calls what, in order, when an update installs on a running device.

  1. The Windows Update service (wuauserv) downloads the payload into C:\Windows\SoftwareDistribution\Download.
  2. The update agent hands the package to the Windows Modules Installer service. Its short name is TrustedInstaller, and its binary is C:\Windows\servicing\TrustedInstaller.exe.
  3. TrustedInstaller launches TiWorker.exe, the worker process that does the real work.
  4. TiWorker loads CbsCore.dll, the CBS engine, and wcp.dll, the Windows component platform that reasons about manifests and component identities.
  5. CBS evaluates applicability. This is where the servicing stack version check happens. If the package requires a newer stack than the one loaded, you get 0x800f0823 and nothing else happens.
  6. Files that cannot be replaced while Windows is running are queued into a pending operations queue. At the next boot, poqexec.exe drains that queue before the session manager starts anything else. That is why so many updates need a restart.

Now the important part. If the package being installed is a servicing stack update, CBS has to swap out its own engine. It cannot overwrite CbsCore.dll underneath itself mid-transaction. So the new stack is installed side by side in the component store, and the next servicing operation loads the new one. You can watch this happen in CBS.log, and we will do exactly that later.

Context. This is why an SSU is unusual among updates: it is the only kind that changes the installer rather than the installed. Microsoft flags this in the package metadata. On a real device, the SSU's registry key carries SelfUpdate : 1 and DISM reports Self servicing package : Yes, while a cumulative update reports Self servicing package : No. That flag is the mechanism made visible.

Why order matters, in Microsoft's words

Microsoft's servicing stack update FAQ states the rule without hedging: SSUs should always be installed before any new update for Windows, including the latest cumulative update, Monthly Rollup, or Security-only update.

Note what that sentence does not say. It does not say the SSU is optional if the LCU seems to install fine. It does not carve out an exception for offline images. It is an ordering rule for every delivery channel.

What a combined SSU+LCU package actually is

Before February 2021 the two packages were separate and you had to sequence them yourself. That produced a steady stream of support cases, so Microsoft changed the packaging.

The documented behaviour today: starting in February 2021, the cumulative update includes the latest servicing stack updates, providing a single combined cumulative update payload for Windows Update, WSUS and the Microsoft Update Catalog. It arrived on Windows 10 version 2004 and later with KB4601382.

Physically, a combined package is one .msu that contains both parts. When it installs, the update agent unpacks the SSU cab and applies it, then applies the cumulative payload. You can see the seam on a live device. On the machine I ran this on, the SSU's CBS registry key records its source as an SSU-26100.9156-x64.cab sitting inside the download folder of the cumulative update, and its InstallClient is UpdateAgentLCU. The SSU did not arrive on its own. It arrived inside the LCU.

Two consequences follow, and this is the part people get wrong.

ActionCombined SSU+LCU package
wusa.exe /uninstallDocumented as not working, because the combined package contains the SSU.
Remove the SSUNot possible. Microsoft states you cannot remove the SSU from the system after installation.
Remove the LCUSupported. Use DISM /Remove-Package with the LCU package name as the argument. Find the name with DISM /online /get-packages.

Destructive risk. There is no supported way back from a servicing stack update. Once the SSU is in, it is in - permanently, on that installation. Your rollback plan for a bad monthly update can only ever remove the cumulative payload, never the stack. If your change control assumes "we can uninstall it", correct that assumption now. For images, keep an unserviced copy of install.wim; for physical devices, the fallback is a restore point, a disk image, or reinstallation. Never test a new SSU first on a machine you cannot rebuild.

Checkpoint cumulative updates, and the WinRE wrinkle

Two further behaviours matter if you service images on Windows 11 version 24H2 or later.

Checkpoint cumulative updates. Microsoft now periodically publishes a cumulative update as a "checkpoint". Subsequent monthly updates compute their binary differentials against the last checkpoint rather than against the original release, which makes packages smaller. If checkpoints precede your target update, the device or image needs those checkpoints before it can take the target. Devices updating from Windows Update and WSUS handle this seamlessly, so update processes involving those channels remain unchanged. Microsoft Update Catalog users have to handle it, and the documented way is to drop every relevant .msu into one folder and let a single DISM call discover and sequence them.

WinRE. The Windows Recovery Environment is serviced differently, and the checkpoint documentation is explicit about it: WinRE is serviced by applying the servicing stack update from a cumulative update, because the latest cumulative update itself does not apply, plus the SafeOS Dynamic Update. Microsoft adds that applying servicing stack update then SafeOS Dynamic Update is the only way to ensure WinRE is serviced. That is the clearest statement in the docs of why the servicing stack is a separable, orderable thing even inside a combined package.

The binaries involved

These are the files that do the work. Knowing them turns "the update failed" into "which layer failed".

FileLocationRole in the flow
TrustedInstaller.exe%WINDIR%\servicing\The Windows Modules Installer service host. Owns the servicing transaction.
TiWorker.exe%WINDIR%\WinSxS\...servicingstack...\Worker process that executes the transaction. Lives inside the versioned servicing stack folder.
CbsCore.dll%WINDIR%\WinSxS\...servicingstack...\The CBS engine itself. This is the file an SSU replaces.
wcp.dll%WINDIR%\WinSxS\...servicingstack...\Windows component platform. Parses manifests, resolves component identities.
poqexec.exe%WINDIR%\System32\Drains the primitive operations queue at boot, completing locked-file replacements.
drvstore.dll%WINDIR%\System32\Driver store operations during servicing.
dpx.dll%WINDIR%\System32\Delta patch expansion, used to hydrate files from differentials.
dismapi.dll%WINDIR%\System32\The DISM API surface that Get-WindowsPackage and dism.exe both sit on.
CbsProvider.dll%WINDIR%\System32\Dism\The DISM provider that talks to CBS. This is what /Add-Package drives.

Notice the pattern in the middle three rows. TiWorker.exe, CbsCore.dll and wcp.dll do not live in System32. They live in a version-stamped folder inside the component store, named amd64_microsoft-windows-servicingstack_<keytoken>_<version>_none_<hash>. That is the side-by-side mechanism that lets the stack replace itself. On the device I tested, two such folders existed: the original release version and the current one.

Gotcha. While a servicing operation runs, Windows extracts a working copy of the stack into a folder under %WINDIR%\Temp whose name begins SSS_. Those folders are observed on real devices and contain CbsCore.dll, wcp.dll, TiWorker.exe and friends at a specific version. Microsoft does not document them. Treat them as a useful forensic breadcrumb when you are reconstructing what happened, and never as a detection target - an undocumented artefact can disappear in any update.

How to verify: build, UBR, servicing stack version and package state

You cannot get the order right if you cannot read the current state. There are four surfaces worth knowing, and they answer different questions.

Registry

Two parent keys carry everything. The first is where the build and revision live:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
ValueTypeWhat it tells you
CurrentBuildNumberREG_SZThe OS build, for example 26200. Changes only on a feature update.
UBRREG_DWORDThe Update Build Revision. This is the number a cumulative update increments. Build plus UBR is the pair winver shows.
DisplayVersionREG_SZThe marketing version, for example 25H2.
EditionIDREG_SZEdition, for example Enterprise. Relevant because package applicability is edition-aware.

The second is the component-based servicing hive, where package state lives:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing
Subkey or valueWhat it tells you
Packages\Package_for_ServicingStack_*The installed servicing stack update. The version is in the name.
Packages\Package_for_RollupFix~...Every cumulative update the machine has ever taken. The second field of the trailing version is the UBR that LCU produced.
Packages\...\InstallClientWho installed the package. UpdateAgentLCU means it came through a cumulative update payload.
Packages\...\InstallLocationThe source cab or metadata folder. An SSU-*.cab here is the fingerprint of a combined package.
Packages\...\SelfUpdate1 on a servicing stack update, 0 on a cumulative update.
RebootPendingKey exists when a servicing operation needs a restart to finish.
PackagesPendingKey exists when package state changes are queued across a reboot.

Microsoft's DISM repair documentation confirms that this hive is one of the three places DISM checks for integrity, alongside %SYSTEMROOT%\Servicing\Packages and %SYSTEMROOT%\WinSxS\Manifests. That is a good sanity check that you are looking at the right key.

Registry Editor
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages\Package_for_ServicingStack_9156~31bf3856ad364e35~amd64~~26100.9156.1.0
InstallClient   REG_SZ     UpdateAgentLCU
InstallLocation REG_SZ     \\?\C:\WINDOWS\SoftwareDistribution\Download\a1b2c3d4\SSU-26100.9156-x64.cab
SelfUpdate      REG_DWORD  0x00000001 (1)
CurrentState    REG_DWORD  0x00000070 (112)

Gotcha. Do not build detection logic on CurrentState. The only Microsoft documentation for its values is a Windows Server 2008 era article listing 7 for installed, 6 for pending reboot, 4 for staged, 0 for absent and 5 for removal pending. On the Windows 11 device I tested, the values observed were 112 for installed, 80 for superseded and 64 for staged. Those do not match the published set. Read package state from DISM instead, where Installed, Superseded and Staged are surfaced as words rather than integers.

PowerShell: the read you actually want

This first block answers "what build and revision is this machine on, and which servicing stack is loaded". Run it elevated - the CBS hive denies access to standard users.

PowerShell - run elevated
# 1. Build and revision. CurrentBuildNumber changes on a feature update, # UBR changes every time a cumulative update lands. $cv = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' '{0}.{1} ({2})' -f $cv.CurrentBuildNumber, $cv.UBR, $cv.DisplayVersion # Healthy: 26200.9168 (25H2) Broken: a UBR far below the current month. # 2. The active servicing stack version. One folder, named for the version. (Get-ChildItem "$env:WINDIR\servicing\Version").Name # Healthy: 10.0.26100.9156 Broken: empty, or a version months behind. # 3. The SSU and LCU packages, straight from the CBS hive. $p = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages' Get-ChildItem $p | Where-Object { $_.PSChildName -like 'Package_for_ServicingStack_*' -or $_.PSChildName -like 'Package_for_RollupFix*' } | Select-Object -ExpandProperty PSChildName # Healthy: exactly one ServicingStack entry, plus one RollupFix per month taken. # Broken: zero ServicingStack entries on a device that has taken updates.

Read the output as a pair. The servicing stack version and the UBR come from different packages and will not match. On my test device the stack was 10.0.26100.9156 while the UBR was 9168. That is normal: the SSU that shipped inside the August cumulative update was built at revision 9156, and the cumulative payload took the OS to 9168.

This second block uses DISM, which is the supported way to read package state and, critically, the only way to see which client installed a package.

PowerShell - run elevated
# List servicing stack and cumulative packages with their real state. Get-WindowsPackage -Online | Where-Object { $_.PackageName -match 'ServicingStack|RollupFix' } | Select-Object PackageState, ReleaseType, InstallTime, PackageName | Format-Table -AutoSize # Healthy: exactly one Installed RollupFix, older ones Superseded. # Broken: two Installed RollupFix entries, or a Staged one that never applied. # Now the detail view. 'Install Client' is the field that proves whether # the SSU arrived on its own or inside a combined cumulative update. dism.exe /online /Get-PackageInfo /PackageName:'Package_for_ServicingStack_9156~31bf3856ad364e35~amd64~~26100.9156.1.0' # Healthy on a combined package: Install Client : UpdateAgentLCU # Self servicing package : Yes # A standalone out-of-band SSU shows a different Install Client.

Why Get-HotFix is not the answer

The instinct is to run Get-HotFix. It is the wrong tool here, and Microsoft's documentation says why.

Get-HotFix is a wrapper over the Win32_QuickFixEngineering WMI class. That class documentation states that it returns only the updates supplied by Component Based Servicing, that those updates are not listed in the registry, and that updates supplied by Windows Installer or the Windows Update site are not returned. It also warns that because updates are stored in two places, an enumeration of the class can result in duplicates.

In practice that means three limitations for our purposes:

  1. It reports KB numbers, not servicing stack versions. It cannot tell you which SSU build you are on.
  2. Its Description field is generic. A servicing stack update shows up as "Security Update", indistinguishable from a cumulative update.
  3. Its InstalledOn field is date-only in practice, so it cannot show you that the SSU applied before the LCU on the same day.

Tip. Use Get-HotFix to answer "did KB number X land", and nothing else. For "is my servicing stack current", read %WINDIR%\servicing\Version and the Package_for_ServicingStack_* package name. Those two agree with each other and with the version CBS.log reports loading, which makes them a strong three-way cross-check.

Event Viewer

Servicing writes to one channel, and everything relevant carries one provider name.

Event Viewer > Windows Logs > Setup  |  Provider: Microsoft-Windows-Servicing
Event IDMeaningWhat to do with it
1Initiating changes for package. Names the current state and target state, plus the client ID.Your start marker. The client ID tells you whether Windows Update, DISM or a task drove it.
2Package was successfully changed to the given state.Your success marker. Pair each ID 1 with an ID 2 for the same package.
4A reboot is necessary before the package can be changed to the Installed state.Expected on most cumulative updates. If it never resolves, the reboot is not happening.
1013Initiating system store corruption detection and repair.Emitted by store scans. Useful to correlate against a failed update.
1014Corruption detection and repair completed, with a status code and counts.Non-zero corruption counts explain a lot of otherwise mysterious failures.

Older Microsoft documentation for CBS also describes events 4371, 4372, 4373, 4374 and 4376, covering package state transitions and the not-applicable case. Those are documented against Windows Server 2008. On current Windows 11 builds the IDs I actually observed in the Setup log were 1, 2, 4, 1013 and 1014.

Event Viewer - Setup log
Level Information   Source Microsoft-Windows-Servicing   Event ID 1
Initiating changes for package KB5121003. Current state is Absent. Target state is Installed. Client id: UpdateAgentLCU.
Level Information   Source Microsoft-Windows-Servicing   Event ID 4
A reboot is necessary before package KB5121003 can be changed to the Installed state.
Level Information   Source Microsoft-Windows-Servicing   Event ID 2
Package KB5121003 was successfully changed to the Installed state.

Log files

Three files, and the exact strings to grep for.

LogSearch stringHealthy versus broken
%WINDIR%\Logs\CBS\CBS.logLoaded Servicing StackHealthy: names a version and a path to cbscore.dll under a servicingstack folder. Broken: names a version older than the one your target package requires.
%WINDIR%\Logs\CBS\CBS.logCBS_E_NEW_SERVICING_STACK_REQUIREDHealthy: no matches. Broken: any match. The line names the required and current stack versions side by side.
%WINDIR%\Logs\CBS\CBS.persist.logsame stringsThe rolled-over archive. Check it when the failure was more than a few days ago.
%WINDIR%\Logs\DISM\dism.logAdd-PackageHealthy: an operation that completes. Broken: an HRESULT next to your package path.

Microsoft's own troubleshooting article confirms the two CBS paths, and points at the Windows Update log files documentation for the wider picture. The healthy Loaded Servicing Stack line from my test device looks like this, and it is the single most useful line in the whole file:

CBS.log - healthy
2026-08-21 23:36:50, Info  CBS  Loaded Servicing Stack v10.0.26100.9156 with Core: C:\WINDOWS\winsxs\amd64_microsoft-windows-servicingstack_31bf3856ad364e35_10.0.26100.9156_none_a546383f\cbscore.dll

Services and scheduled tasks

ItemShort nameExpected state
Windows Modules InstallerTrustedInstallerStart type Manual. Running only while servicing work is in flight.
Windows UpdatewuauservStart type Manual. Started on demand by the update orchestrator.
\Microsoft\Windows\Servicing\StartComponentCleanupscheduled taskReady. Removes superseded components after a grace period.
\Microsoft\Windows\WindowsUpdate\Scheduled Startscheduled taskReady. Triggers update scans.

If TrustedInstaller is Disabled, nothing about servicing works and no amount of correct ordering will help. Microsoft documents the StartComponentCleanup task and notes that running the DISM equivalent deletes previous component versions immediately, without the grace period and without the one hour timeout the task carries.

The fix: the documented order, online and offline

Online devices: there is nothing to configure

This is the part that surprises people, so let me say it plainly. There is no Group Policy setting and no Intune or CSP setting that controls servicing stack update ordering. None. It is not that the policy is hard to find; it does not exist.

The ordering is a property of the package and the update client, not of policy. Since February 2021 the SSU and LCU travel together in a single payload, and Microsoft's guidance for on-premises deployment is that if you use an endpoint management tool backed by WSUS, such as Configuration Manager, you only have to select and deploy the monthly cumulative update, and the latest servicing stack updates are automatically applied correctly.

Do not try to build this. Because there is no policy, there is also nothing to audit for. If a vendor tool, a compliance baseline or a hardening script claims to "enforce SSU before LCU" on a Windows Update or WSUS managed device, it is describing behaviour Windows already owns. Approving a separate SSU in WSUS on a modern build is at best a no-op and at worst causes a device to install an SSU on its own, breaking the combined-package assumption your rollback plan depends on.

The policies that do exist govern where and when updates come from, not their internal order. Those are worth setting deliberately, so here are both consoles.

Group Policy Editor - point devices at WSUS so the combined package flows correctly.

gpedit.mscComputer ConfigurationAdministrative TemplatesWindows ComponentsWindows Update
  1. Open Group Policy Management, or gpedit.msc for a local test.
  2. Expand Computer Configuration, then Policies if you are in the domain editor.
  3. Expand Administrative Templates, then Windows Components, then Windows Update.
  4. Open Manage updates offered from Windows Server Update Service.
  5. Open Specify intranet Microsoft update service location and set it to Enabled.
  6. Enter your WSUS server URL for both the detection service and the statistics server.
  7. Select OK, then run gpupdate /target:computer /force on a test device.
  8. Confirm with Get-WindowsPackage -Online after the next patch cycle that exactly one Package_for_RollupFix is Installed and the rest are Superseded.

Intune admin center - deploy the monthly cumulative update and nothing else.

intune.microsoft.comDevicesWindows updatesUpdate rings for Windows 10 and later
  1. Sign in to the Microsoft Intune admin center at intune.microsoft.com.
  2. Select Devices in the left navigation.
  3. Select Windows updates.
  4. Open the Update rings for Windows 10 and later tab.
  5. Select Create profile, name the ring, and continue to Update ring settings.
  6. Set Quality update deferral period (days) to your pilot value, for example 0 for the pilot ring and 7 for broad deployment.
  7. Set Microsoft product updates and Windows drivers to match your standard.
  8. Assign the profile to your pilot device group, then Create.
  9. After the next cycle, check Reports, then Windows updates, and confirm devices moved to the expected build and revision.

Notice that neither list contains a servicing stack setting. That absence is the point.

Offline image servicing: this is where the order is yours to get right

Microsoft publishes a full sequence for updating installation media, and it is a table of 28 numbered tasks across four targets. The three that matter here are task 1 for winre.wim, task 9 for install.wim and task 17 for boot.wim. All three are the same task: add servicing stack update via latest cumulative update. It is task number one in the whole sequence, before language packs, before Features on Demand, before the cumulative update itself.

The documentation is explicit that for those three steps you should use the combined cumulative update, because since February 2021 the SSU and LCU are distributed together. It also gives the general ordering rule in words: first apply servicing stack updates, followed by language additions, then by feature additions, and finally the latest cumulative update.

Here is the shape of that, reduced to the calls that carry the ordering.

PowerShell - run elevated - offline servicing skeleton
# Put the target LCU and any checkpoint CUs in ONE folder and nothing else. # DISM discovers and sequences the checkpoints for you from that folder. $lcu = 'C:\mediaRefresh\packages\CU\LCU.msu' # Step 1: servicing stack into WinRE, VIA the cumulative update. # WinRE takes the servicing stack from the CU plus SafeOS DU. The CU # payload itself does not apply to WinRE - that is documented, not a bug. Add-WindowsPackage -Path 'C:\mount\winre' -PackagePath $lcu Add-WindowsPackage -Path 'C:\mount\winre' -PackagePath 'C:\...\SafeOS_DU.cab' -ErrorAction Stop # Step 9: same package into the main OS image, FIRST. Add-WindowsPackage -Path 'C:\mount\os' -PackagePath $lcu # ... languages, then Features on Demand, then Optional Components ... # Step 13: the cumulative update again, LAST, so that everything you # added above is updated from its initial release state. Add-WindowsPackage -Path 'C:\mount\os' -PackagePath $lcu -ErrorAction Stop # Healthy: both calls succeed and Get-WindowsPackage shows the RollupFix Installed. # Broken: 0x800f0823 on the first call means your base image predates the stack.

Read that carefully. The same .msu is applied twice to the same image on purpose. The first call is there for the servicing stack it contains. The last call is there for the cumulative payload, after your customisations, so that newly added languages and features are brought current.

Gotcha. Microsoft's own sample script wraps the WinRE and WinPE servicing-stack calls in a try block that swallows one specific failure, 0x8007007e, and comments that it is a known issue with the combined cumulative update that can be ignored. The same script does not swallow it for the main OS image. If you copy the pattern, copy that asymmetry too, and never blanket-ignore errors on install.wim.

Rolling back a bad month

When a cumulative update has to come off, this is the only supported path.

Command Prompt - run elevated - removes the LCU only
DISM /online /get-packages # Find the Package_for_RollupFix entry whose State is Installed. # Copy the full identity string, tildes and all. DISM /Online /Remove-Package /PackageName:Package_for_RollupFix~31bf3856ad364e35~amd64~~26100.9168.1.19 # Healthy: the operation completes and asks for a restart. After the reboot # the UBR drops to the previous month's revision. # The servicing stack version does NOT drop. It cannot. That is by design.

Tip. Capture the exact package identity before you need it. Add a line to your monthly patch runbook that records Get-WindowsPackage -Online output for the pilot ring on patch day. Digging the identity string out of a machine that is already misbehaving, under pressure, at 2am, is a much worse experience than reading it off a file you wrote a week earlier.

Proof it worked: a real device, read end to end

The companion script for this post reads every surface above and prints one report. It installs nothing, removes nothing and repairs nothing. It reads the registry, the file system, CBS.log, DISM package state and the two services, then refuses to give you a clean verdict if any read failed.

The output below is a genuine run on a Windows 11 25H2 device. Only the download folder hash and the component store hash are replaced.

PowerShell 5.1 - Get-ServicingStackState.ps1 - real run, identifiers replaced
== OS identity ========================================================= ProductName : Windows 10 Enterprise DisplayVersion : 25H2 CurrentBuildNumber : 26200 UBR : 9168 OS build (build.UBR) : 26200.9168 # ProductName still says "Windows 10" on Windows 11. That is a known # quirk of the registry value, not a fault. Trust DisplayVersion. == Servicing stack version ============================================= servicing\Version marker : 10.0.26100.9156 SSU CBS package : Package_for_ServicingStack_9156~...~26100.9156.1.0 CBS.log loaded stack : Loaded Servicing Stack v10.0.26100.9156 0x800f0823 in CBS.log : none in the last 4 MB # Healthy: three independent surfaces agree on 9156. # Broken: they disagree, or 0x800f0823 appears. == Cumulative update history and combined package check ================ 4 Package_for_RollupFix entries. Newest first: Package_for_RollupFix~...~26100.9168.1.19 2026-08-20 09:12:53 CurrentState=112 Package_for_RollupFix~...~26100.8875.1.28 2026-07-24 05:31:18 CurrentState=80 SSU package : Package_for_ServicingStack_9156~...~26100.9156.1.0 SSU install time : 2026-08-19 18:25:28 SSU InstallClient : UpdateAgentLCU SSU InstallLocation : ...\Download\a1b2c3d4\SSU-26100.9156-x64.cab Combined SSU+LCU package : YES # This is the money line. InstallClient UpdateAgentLCU plus an SSU-*.cab # source path means the SSU came inside the cumulative update payload, # which means it cannot be uninstalled. == Ordering evidence =================================================== SSU installed : 2026-08-19 18:25:28 Latest LCU installed : 2026-08-20 09:12:53 Order : CORRECT # Healthy: SSU timestamp is at or before the LCU timestamp. == DISM package state ================================================== [Installed] Package_for_RollupFix~...~26100.9168.1.19 [Installed] Package_for_ServicingStack_9156~...~26100.9156.1.0 [Superseded] Package_for_RollupFix~...~26100.8875.1.28 [Staged] Package_for_RollupFix~...~26100.1742.1.10 # Healthy: one Installed RollupFix. Superseded entries are old months # awaiting StartComponentCleanup. A Staged entry is normal for a # checkpoint that shipped with the base image. == Verdict ============================================================= Servicing stack version : 10.0.26100.9156 Newest LCU package : Package_for_RollupFix~...~26100.9168.1.19 OS build : 26200.9168 No pending servicing operations. The stack is idle. 0 warning(s). All reads succeeded.

That is the whole picture in one screen. The stack is at 9156, the OS is at 9168, the SSU arrived inside the LCU, the SSU applied first, and nothing is pending. This machine will take next month's cumulative update without an ordering problem.

The script exits 0 when every read succeeded and 1 when any read failed or the session was not elevated. It deliberately never prints a clean verdict off a failed read, because a false "all clear" before an offline servicing run is worse than no check at all.

You can find it at Windows-11-Scripts/servicing-stack-update-vs-lcu-ordering/Get-ServicingStackState.ps1. It runs on Windows PowerShell 5.1 and PowerShell 7, needs no modules beyond the inbox DISM module, and is ASCII-only so a 5.1 host on a non-UTF8 codepage cannot mangle it.

References

Microsoft official

Community deep-dives

Both of these were fetched and confirmed to be on topic before citing.

AuthorPostWhy it is worth reading
Donna Ryan, MSEndpointMgrWIM Witch v3.2.0 - Windows 11 and Server 2022 supportDescribes extracting the servicing stack update and the cumulative update from a combined LCU package and installing the individual updates in order - the ordering problem solved in code.
Jitesh Kumar, ConfigMgr HTMD BlogFix SCCM offline servicing error 0x80004001A worked ConfigMgr offline servicing failure, with the manual DISM workaround for injecting the SSU and LCU into a WIM.

One thing to take away

The servicing stack is the only part of Windows that installs itself. That single fact explains the ordering rule, the combined package, the one-way removal, the extra DISM step for WinRE, and the error code that names none of them. Read the stack version before you service an image, and most of this class of failure disappears.

PowerShell — companion script

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.

Get-ServicingStackState.ps1 — Reports the servicing stack state of a Windows 11 device before you deploy an update.
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 11
The component store is corrupt, so every update fails: what…
WinSxS is not a folder of duplicate files, it is the Windows component store, and most of…
Windows 11
Attack Surface Reduction rules broke a line-of-business app:…
An ASR rule in Block mode kills an app and tells you nothing but a GUID. Here is the…
Windows 11
SMB signing became mandatory and your NAS stopped working:…
Windows 11 24H2 and later require SMB signing, refuse insecure guest logons and ship…