Something goes wrong with Windows Update, and within about ninety seconds somebody says "run SFC, then run DISM". It is the most repeated advice in Windows administration. It is also, in that order, backwards. And almost nobody saying it can tell you what either tool actually touches.
C:\Windows\WinSxS is the Windows component store, not a folder of duplicate files. Microsoft documents that most of what Explorer counts there is hard links, so the folder is far smaller than it looks, and Dism /Online /Cleanup-Image /AnalyzeComponentStore is the documented way to get the real number. System File Checker repairs live Windows files from the component store, so if the store itself is broken SFC has nothing good to copy, which is why Microsoft's own support article runs DISM /RestoreHealth before sfc /scannow. And /CheckHealth is not a scan: it only reads a flag a previous failed operation set, which is why it can disagree with /ScanHealth on the same machine.
The problem: every update fails and WinSxS looks enormous
Two complaints arrive together often enough that they feel like one problem.
The first is that updates stop installing. A cumulative update downloads, stages, then rolls back. Enabling an optional feature fails. The error is usually 0x800f081f or 0x800f0922. Nothing in the Windows Update user interface explains why.
The second is a disk-space complaint. Somebody sorts C:\Windows by size in File Explorer and finds a folder called WinSxS using more space than everything else combined. On the machine I used to write this article, Explorer reports 24.81 GB.
Both complaints lead to the same two commands being typed, usually in the wrong order, usually with no idea what they do. So before any command, three questions need answers.
- What is the component store, and why does an update fail when it is damaged?
- How big is it really, as opposed to how big Explorer says it is?
- Which of the DISM switches read, which repair, and which permanently destroy your ability to uninstall an update?
Why it happens: WinSxS is the component store, not a junk drawer
What the component store actually is
Microsoft states the location plainly: the WinSxS folder is "the location for Windows Component Store files", and the component store "is used to support the functions needed for the customization and updating of Windows". It then lists what depends on it.
| Documented dependency | What breaks without a healthy store |
|---|---|
| Using Windows Update to install new component versions | Cumulative updates fail or roll back |
| Enabling or disabling Windows features | Optional features cannot be turned on |
| Adding roles or features using Server Manager | Role installation fails |
| Moving systems between different Windows editions | Edition upgrade fails |
| System recovery from corruption or boot failures | Repair has no known-good source |
| Uninstalling problematic updates | You cannot roll a bad update back |
| Running programs using side-by-side assemblies | Applications fail to load their libraries |
Read the last two rows again. The store is not only how updates go on. It is also how they come off. That is the single most important thing to understand before you run any cleanup command.
The chain, from trigger to result
Here is the order things happen in. Every arrow is one component handing off to the next.
- An update package arrives, as a
.msuor.cab. Microsoft documents that specific versions of components are collected together into packages, and that packages are what Windows Update and DISM use to update Windows. - The package is described by manifest and catalogue files. On a live device these sit as
.mumand.catfiles underC:\Windows\servicing\Packages. On the machine I checked there were 14,980 of them. - The servicing stack reads that metadata. The component-based servicing engine, CBS, decides what needs to change.
- Component versions are placed into
C:\Windows\WinSxS, one directory per component version. That machine had 30,125 of them and 43,198 files underWinSxS\Manifests. - The live operating system directories, such as
C:\Windows\System32, are pointed at the correct version using NTFS hard links. - A reboot commits any change that could not be made while the files were in use.
If step 4 is incomplete, step 5 has nothing to point at, and step 3 refuses to proceed. That is component store corruption in one sentence. The store says a component should exist; the payload for it does not.
Hard links, and why Explorer lies about the size
This is the part that gets WinSxS deleted by people who should know better. A hard link is, in Microsoft's words, "a file system object which allows two files to refer to the same location on disk". One set of bytes, two paths. Explorer counts both paths.
Microsoft gives a worked example. Directory A holds 1.txt, 2.txt and 3.txt. Directory B holds 4.txt. Files 1 and 2 are hard linked together and hold 1 MB. Files 3 and 4 are hard linked together and hold 2 MB. So how big is directory A? Microsoft gives three different correct answers.
| What you are doing | Documented answer |
|---|---|
| Reading every file in it | 4 MB, the sum of each file size |
| Copying it somewhere else | 3 MB, the sum of the hard-linked data |
| Deleting it to free space | 1 MB, because only that much is linked from A alone |
Microsoft then says which of the three applies to WinSxS: "The third answer in the directory A example, most closely matches how much extra space is used." Files hard linked to the rest of the system are needed for the system to run, so they should not be counted at all.
You can watch this happen on your own machine. Microsoft's older troubleshooting article uses advapi32.dll as its example, so here is that exact file on a real Windows 11 device.
Genuine run on a Windows 11 device, build 26200.9168. The component-directory hash is redacted only because it is long, not because it is sensitive.
The servicing stack: the code that does the work
Microsoft defines the servicing stack as "the component that installs Windows updates", and says it contains the component-based servicing stack, CBS, which is the underlying component for DISM, System File Checker, changing Windows features or roles, and component repair. All four of those things are the same engine wearing different hats.
Here are the binaries. Every path below was confirmed on a live Windows 11 device rather than copied from another article.
| Binary | Where it actually lives | What it does in the flow |
|---|---|---|
Dism.exe | C:\Windows\System32 | The command line front end. Parses your switches and calls the API. |
DismApi.dll | C:\Windows\System32 | The DISM API that Dism.exe and the PowerShell module both call. |
DismHost.exe | C:\Windows\System32\Dism | Hosts the DISM providers out of process. Several copies during a long run is normal. |
dismcore.dll, dismprov.dll | C:\Windows\System32\Dism | The provider plumbing that DismHost.exe loads. |
sfc.exe | C:\Windows\System32 | System File Checker front end. Tiny; the work is in the DLL below. |
sfc_os.dll | C:\Windows\System32 | The Windows Resource Protection logic that SFC actually runs. |
TrustedInstaller.exe | C:\Windows\servicing | The service host. The only thing allowed to modify the store. |
CbsApi.dll, CbsMsg.dll | C:\Windows\servicing | CBS entry points and message resources. |
CbsCore.dll, wcp.dll | Inside WinSxS, not System32 | The servicing engine and the component platform itself. |
poqexec.exe | C:\Windows\System32 | Runs the primitive operations queue at boot, after a reboot-required change. |
That row about CbsCore.dll deserves a sentence of its own, because it is the neatest possible demonstration of what WinSxS is for. People expect the servicing engine to be a DLL in System32. It is not. It is a component version inside the store, and the running copy is hard linked out of it.
Genuine run, with the component hash redacted for width. This is also why Microsoft ships servicing stack updates separately and occasionally out of band: when the repair engine is the broken part, nothing else can repair it.
TrustedInstaller.exe is in C:\Windows\servicing, not System32, and CbsCore.dll is only inside WinSxS. A detection script that tests Test-Path C:\Windows\System32\CbsCore.dll will report "missing" on every healthy Windows 11 device on earth.How to verify: read the store before you write to it
Every switch in this section only reads. None of them changes anything. Run all of them before you run anything from the next section.
Step 1: get the real size, not the Explorer size
Microsoft documents one command for this, and its output has eight named fields.
That is a genuine run on the device I wrote this on, unedited. Now read it the way Microsoft says to read it.
| Field | What Microsoft says it means | Overhead? |
|---|---|---|
| Windows Explorer Reported Size of Component Store | What Explorer would compute. Does not factor in hard links inside WinSxS. | No, and misleading |
| Actual Size of Component Store | Factors in hard links inside WinSxS. Does not exclude files shared with Windows. | Partly |
| Shared with Windows | Files hard linked so they appear both in the store and elsewhere, for the normal operation of Windows. | No |
| Backups and Disabled Features | Components kept to respond to failures in newer components, or to allow enabling more functionality. Includes store metadata and side-by-side components. | Yes |
| Cache and Temporary Data | Files used internally to make servicing operations faster. | Yes |
| Date of Last Cleanup | Date of the most recently completed component store cleanup. | n/a |
| Number of Reclaimable Packages | Superseded packages that component cleanup can remove. | n/a |
| Component Store Cleanup Recommended | Recommended when a cleanup may reduce the store overhead. | n/a |
Microsoft gives an explicit formula for the real overhead: add "Backups and Disabled Features" to "Cache and Temporary Data". Everything else is either shared with running Windows or double-counted.
On my device that arithmetic is 14.79 GB plus 0 bytes, so 14.79 GB of genuine overhead against an apparent 24.81 GB. In Microsoft's own documented example the same arithmetic turns an apparent 4.98 GB into 507.18 MB. Both numbers are real; they measure different things.
/AnalyzeComponentStore and quote them the "Shared with Windows" line. On my device that is 8.00 GB of files that are hard linked into running Windows and cannot be freed by any means, because deleting them would delete the live operating system. It ends the conversation faster than any explanation.Step 2: understand what each /Cleanup-Image switch does
This is where the folklore does real damage, because two of these switches are not reversible. Here is every documented option, with Microsoft's own description.
| Switch | Documented behaviour | Reversible? |
|---|---|---|
/CheckHealth | "Checks whether the image has been flagged as corrupted by a failed process and whether the corruption can be repaired." Reads a flag. Seconds. | Read only |
/ScanHealth | "Scans the image for component store corruption. This operation will take several minutes." Actually walks the store. | Read only |
/AnalyzeComponentStore | "Creates a report of the component store." | Read only |
/RestoreHealth | "Scans the image for component store corruption, and then performs repair operations automatically." | Repairs; needs a source |
/StartComponentCleanup | "Cleans up the superseded components and reduces the size of the component store." Deletes previous versions immediately, with no 30 day grace period and no one-hour timeout. | No, but update uninstall still works |
/StartComponentCleanup /ResetBase | "Removes all superseded versions of every component in the component store." Microsoft warns: "All existing update packages can't be uninstalled after this command is completed, but this won't block the uninstallation of future update packages." | No. Permanent. |
/SPSuperseded | Removes backup files created during a service pack installation. Documented for Windows 10 only. "The service pack cannot be uninstalled after this command is completed." | No. Permanent. |
/RevertPendingActions | Reverts all pending actions from previous servicing operations, to recover from a boot failure. Microsoft: "not supported on a running operating system" and use it "only in a system-recovery scenario on a Windows image that did not boot." | Offline only |
/ResetBase is the switch people paste from forum posts to reclaim disk space. Microsoft is unambiguous that after it completes, every update currently installed becomes permanently non-removable. If a cumulative update later turns out to break a line-of-business application, the documented rollback path is gone from that device. There is no undo, and no registry value that puts it back. Microsoft documents only how to detect that it happened: check LastResetBase_UTC under the Component Based Servicing key.Step 3: know why CheckHealth and ScanHealth can disagree
This is the single most useful thing in this article, and it comes straight out of the documented wording. /CheckHealth checks whether the image "has been flagged". /ScanHealth "scans the image". Those are different operations, so they can give different answers.
Here is that happening on my device, in one sitting, with nothing changed in between except the scan itself.
Genuine sequence, captured in that order. The practical rule falls out of it directly: never act on /CheckHealth alone. Treat it as a cheap hint that a scan is worth the several minutes, not as a verdict.
/CheckHealth only reads a flag, a device with genuine corruption that has never had a servicing operation fail on it can report "No component store corruption detected" while being thoroughly broken. A monitoring script built on /CheckHealth will report a healthy fleet either way. Only /ScanHealth scans.Step 4: know what SFC does differently
System File Checker is not a smaller DISM. It works on a different set of files, in a different direction.
sfc /scannow | DISM /Cleanup-Image | |
|---|---|---|
| What it inspects | Protected system files in the live Windows directories | The component store itself |
| Where it repairs from | A cached copy in the component store | Windows Update, or a /Source you supply |
| Its log | %windir%\Logs\CBS\CBS.log, lines tagged [SR] | %windir%\Logs\DISM\dism.log, plus CBS.log |
| Microsoft's framing | "a quick check of an online image" | "a more extensive check that can repair issues with the store" |
Row two is the whole reason the folklore order is wrong. SFC repairs live Windows files by copying good versions out of the component store. If the component store is the damaged thing, SFC is copying from the corruption. It will either report that it could not fix some files, or it will succeed and change nothing that mattered.
Microsoft documents four possible SFC outcomes. Learn them, because three of the four are commonly misread as success.
| Message | What it means |
|---|---|
| Windows Resource Protection did not find any integrity violations. | No protected file was missing or corrupt. This says nothing about the store. |
| Windows Resource Protection could not perform the requested operation. | SFC could not run. Microsoft suggests safe mode and checking that PendingDeletes and PendingRenames exist under %WinDir%\WinSxS\Temp. |
| Windows Resource Protection found corrupt files and successfully repaired them. | Repaired from the store. Review CBS.log for what changed. |
| Windows Resource Protection found corrupt files but was unable to fix some of them. | The strongest signal that the store itself is damaged. Go and fix the store. |
Step 5: the log files, and exactly what to grep for
Two logs matter, and Microsoft documents both paths.
Microsoft publishes one exact command for extracting the SFC portion of CBS.log. Use it verbatim.
The other line worth knowing is the session marker. Every servicing operation opens and closes one.
Genuine lines with the session identifier redacted. The client name is useful on its own: DISM Package Manager Provider means somebody ran DISM, CbsTask means the scheduled cleanup task, WindowsUpdateAgent means Windows Update.
Step 6: the registry surface
Microsoft documents comparatively little of the servicing registry, so this table separates what is documented from what is merely observable. That distinction matters: an undocumented value can change in any update.
| Value or subkey | Meaning | Status |
|---|---|---|
LastResetBase_UTC | When /ResetBase last ran. Microsoft names this value explicitly as the way to determine that. | Documented |
Policies\Servicing\LocalSourcePath | Alternate source path or paths for repair and feature payload, semicolon separated. | Documented |
Policies\Servicing\UseWindowsUpdate | Whether Windows Update may be used as an installation and repair source. | Documented |
Policies\Servicing\RepairContentServerSource | Backs the "Contact Windows Update directly instead of WSUS" option. | Documented |
RebootPending subkey | Present when a servicing change needs a restart to commit. | Widely used, not formally documented |
Corrupt, AutoRepairNeeded, LifetimeTimesSuccessfullyRepaired | Present on live devices and readable. My device showed Corrupt as 0 and five lifetime successful repairs. | Observed, undocumented |
TiRunning subkey | Present while a TrustedInstaller transaction is live. | Observed, undocumented |
Corrupt, AutoRepairNeeded, LifetimeTimesSuccessfullyRepaired and TiRunning are things I read off a live device, not things Microsoft publishes. They are interesting for a one-off investigation. Any fleet-wide detection rule built on them can silently invert the day a servicing stack update changes them, and you will not get a deprecation notice.Step 7: Event Viewer, services and scheduled tasks
Microsoft does not publish an event ID reference table for component-based servicing. Saying so is more useful than inventing one. What it does use is a channel, and the events in it are readable and self-describing.
Those three IDs and their exact wording came off my own device, not from a documentation page. Treat them as observed rather than contractual. The reliable reading is the pattern, not the number: an Id 1 that never gets a matching Id 2 for the same KB is a package that started changing state and never arrived.
The service and the task are both documented, and both have a name people get wrong.
| Item | Name | Expected state |
|---|---|---|
| Service, short name | TrustedInstaller | Manual start. Running only during servicing. |
| Service, display name | Windows Modules Installer | Same service. This is the name in services.msc. |
| Scheduled task | \Microsoft\Windows\Servicing\StartComponentCleanup | Ready. Waits at least 30 days after a component update, then removes previous versions. |
Microsoft documents two limits on that task that explain a great deal of confusion. Run automatically, it waits at least 30 days after an updated component is installed before uninstalling previous versions. And "if you choose to run this task, the task will have a 1 hour timeout and may not completely clean up all files."
You can start the task by hand. Microsoft documents both the console route and the command.
- Open Task Scheduler.
- Expand the console tree to Task Scheduler Library › Microsoft › Windows › Servicing › StartComponentCleanup.
- Under Selected Item, click Run.
- Or, from an elevated prompt, run
schtasks.exe /Run /TN "\Microsoft\Windows\Servicing\StartComponentCleanup".
Step 8: the PowerShell equivalents
Everything above has a cmdlet. The DISM module ships in the box, so nothing needs installing.
Repair-WindowsImage exposes -StartComponentCleanup, -ResetBase and -Defer, so the irreversible cleanup is one flag away in a cmdlet whose name says "repair". Repair-WindowsImage -Online -StartComponentCleanup -ResetBase is exactly as permanent as the DISM command line version, with no extra confirmation prompt. There is no -WhatIf that will save you.The fix: the correct order, and the source-file problem
The correct order, from Microsoft's own support article
The folklore says SFC then DISM. Microsoft's support article on using System File Checker says the opposite. Its documented steps run DISM.exe /Online /Cleanup-image /Restorehealth first, and only then sfc /scannow.
The reason is the one from the comparison table above. SFC repairs live Windows files by copying known-good versions out of the component store. DISM repairs the component store. Repair the source of truth first, then repair the files that are restored from it. Doing it the other way round asks SFC to fix Windows using a broken reference.
- Check for a pending reboot, and reboot if there is one. A servicing change waiting to commit makes every result below unreliable.
- Run
Dism /Online /Cleanup-Image /AnalyzeComponentStore. Read the real size. Note whether cleanup is recommended. - Run
Dism /Online /Cleanup-Image /ScanHealth. This is the scan. Allow several minutes. - If, and only if, the scan reports corruption, run
Dism /Online /Cleanup-Image /RestoreHealth. Add/Sourceand/LimitAccessif Windows Update is not reachable. - Now run
sfc /scannow. Let it reach 100 percent before closing the window. - Reboot if either tool asks for one, then re-run
/ScanHealthto confirm. - Only after the store is clean, decide separately whether you want
/StartComponentCleanupfor disk space. Repair and cleanup are different jobs.
/RestoreHealth at all.The source-file problem
Now the part that makes /RestoreHealth fail in managed environments. Microsoft documents the default clearly: "Windows Update is the default repair source." The repair source is the same source used for Features on Demand, and it is determined by Group Policy.
So on a device that cannot reach Windows Update, because a proxy blocks it, or because WSUS is enforced, or because the device is offline, /RestoreHealth has nowhere to get known-good files from. It fails with a documented error code.
| Code | Documented symbol | Documented cause |
|---|---|---|
0x800F0906 | CBS_E_DOWNLOAD_FAILURE | The computer cannot download the required files from Windows Update. Network, proxy, firewall, or a WSUS-only configuration. |
0x800F081F | CBS_E_SOURCE_MISSING | A source was specified but the path does not contain the required files, the user lacks Read access, or the file set is corrupt, incomplete, or invalid for the running version of Windows. |
0x800F0907 | CBS_E_GROUPPOLICY_DISALLOWED | No valid alternative source, and the policy is set to never download payload from Windows Update. |
0x800F0922 | CBS_E_INSTALLERS_FAILED | Processing advanced installers and generic commands failed. Microsoft notes this one is not specific to any feature. |
Microsoft documents four kinds of thing you can hand to /Source.
| Source type | Documented example |
|---|---|
| Mounted Windows image | c:\mount\Windows |
| Running Windows installation shared on the network | the shared c:\Windows folder of another machine |
| Side-by-side folder from media or a share | z:\sources\SxS |
WIM file on a share, with an index and a Wim: prefix | Wim:\\network\images\contoso.wim:3 |
0x800F081F forever, and the error text will keep insisting the files are not there.Setting the repair source with Group Policy
Rather than typing /Source on every device, set it once. There is a real GPO for this, and it is the same setting that governs Features on Demand.
- Open the Local Group Policy Editor (
gpedit.msc) or the Group Policy Management Console. - Expand Computer Configuration, then Administrative Templates, then select System.
- Open Specify settings for optional component installation and component repair.
- Select Enabled.
- In Alternate source file path, enter a fully qualified path. Microsoft's examples are a share such as
\\server_name\share\Win8sxs, or a WIM with an index such asWIM:\\server_name\share\install.wim:3. Separate multiple paths with a semicolon. - Optionally tick Never attempt to download payload from Windows Update to block Windows Update entirely. This is the policy equivalent of
/LimitAccess. - Optionally tick Contact Windows Update directly to download repair content instead of Windows Server Update Services (WSUS). This is the fix for a WSUS-managed fleet that cannot get repair content.
- Click OK, then run
gpupdate /forcefrom an elevated prompt.
The policy writes to three values under HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Servicing: LocalSourcePath, UseWindowsUpdate and RepairContentServerSource. Read them to confirm the policy actually landed.
Setting the same thing from Intune
The policy is ADMX-backed, so it is reachable from Microsoft Intune. Microsoft documents it in the Policy CSP as ADMX_Servicing/Servicing, mapped to the same friendly name as the GPO.
- Sign in to the Microsoft Intune admin center at
intune.microsoft.com. - Go to Devices, then Configuration, then Create, then New policy.
- Set Platform to Windows 10 and later and Profile type to Settings catalog. Click Create.
- Name the profile, for example
Servicing - component repair source. Click Next. - Click Add settings and search the picker for optional component installation.
- Select Specify settings for optional component installation and component repair under the Administrative Templates › System category, then close the picker.
- Set it to Enabled and fill in the alternate source file path and the two checkboxes exactly as in the GPO steps above.
- Click Next through Scope tags, assign to a device group, then Create.
If you would rather use a custom OMA-URI profile, Microsoft documents the path.
<Format>chr</Format>. In practice the Settings Catalog handles that encoding for you, which is why the Settings Catalog route above is the one to reach for. The documented applicability is Windows 11 21H2 and later, and Windows 10 2004 and later with KB5005101 installed.What about Defender, ASR and WDAC?
Genuinely not applicable, and worth saying so rather than padding the article. Component-based servicing has no Defender surface, no attack surface reduction rule, no exploit protection setting, no WDAC policy and no Endpoint Security profile. Store integrity is enforced by Windows Resource Protection and the servicing stack, and the only thing permitted to write to the store is TrustedInstaller. Nothing in the Endpoint Security blade configures any of it. If a vendor tells you their agent "protects WinSxS", ask which documented interface it uses.
Proof it worked: a real read-only store report
The companion script for this article reports component store health without repairing anything. It runs only the two documented read-only DISM reports, /AnalyzeComponentStore and /CheckHealth, then reads the logs, the service, the scheduled task, the documented registry values and the pending-reboot state. It never runs /RestoreHealth, /StartComponentCleanup, /ResetBase or sfc, and it never writes anything.
It needs no PowerShell module. It refuses to run unelevated, because a partial read that looks healthy is worse than no read at all.
Genuine output from the device this article was researched on, with nothing edited except the section spacing. The remaining sections of the same run read as follows.
Two things in that output are worth pointing at, because both are the kind of finding a naive script would get wrong.
The LastResetBase_UTC line reports "absent" rather than blank. Absent is a real finding here: it means /ResetBase has never completed on this device, so every installed update is still removable. A script that printed an empty field would leave you unable to tell that apart from a failed read.
And the task last result of 0x8007042B is reported as a fact with its hex form, not as an interpretation. Microsoft does not document what the cleanup task returns on a partial run, so the script says what it read and points at the documented one-hour timeout as the likely explanation. That is the honest version. It is also the version that stays correct after the next servicing stack update.
Reading list from the community
Both of these were fetched and read before being cited here, and both are genuinely on this topic.
| Author | Article | Why it is worth your time |
|---|---|---|
| Rudy Ooms | Intune Remote Wipe ending up in "Something went wrong" (0x800f0991)? | Traces a failure to a single missing payload file inside a WinSxS component directory, with the servicingPackages metadata still present. The best worked example of the mismatch this article describes. |
| Alok Kumar Mishra, HTMD | How to Analyse and Clean up Component Store WinSxS Folder in Windows 11 | A clean walkthrough of the analyse and cleanup commands with the Task Scheduler route, if you want the same steps with more screenshots. |
References
- Manage the Component Store - what the component store is, the documented dependency list, and the hard link explanation with the directory A example.
- Determine the Actual Size of the WinSxS Folder -
/AnalyzeComponentStore, all eight report fields, and the overhead formula. - Clean Up the WinSxS Folder - the StartComponentCleanup scheduled task, the 30 day wait, the one hour timeout, and the
/ResetBasewarning. - DISM Operating System Package Servicing Command-Line Options - every
/Cleanup-Imageswitch, and theLastResetBase_UTCregistry tip. - Repair a Windows Image - CheckHealth versus ScanHealth versus RestoreHealth, and the
/Sourceand/LimitAccessguidance. - Configure a Windows Repair Source - the four source types, the RTM media and patch level constraints, and the Group Policy route.
- DISM Global Options for Command-Line Syntax - the default
%WINDIR%\Logs\Dism\dism.logpath and the/LogLevelvalues. - Repair-WindowsImage (Dism) - the PowerShell equivalents, including
-ResetBaseand-Defer. - Servicing stack updates - the definition of the servicing stack and CBS, and what depends on it.
- Policy CSP - ADMX_Servicing - the OMA-URI, the registry key name and the applicability.
- .NET Framework 3.5 installation errors - the documented meanings of
0x800F0906,0x800F081F,0x800F0907and0x800F0922, and the Group Policy checkbox names. - Using System File Checker in Windows - the documented order: DISM RestoreHealth first, then
sfc /scannow. - Understanding Component Based Servicing - Microsoft's own background piece on CBS, linked from the servicing stack documentation.
- Get-ComponentStoreHealth.ps1 - the read-only companion script used for the output above.
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.