What is the purpose of the DISM /RestoreHealth parameter and SFC?
The Component Store [%WinDir%\WinSxS
] maintains a backup copy of all Windows system files; SFC
and DISM
manage two separate, vital pieces of the Component Store and OS, with SFC
relying entirely upon what DISM
manages.
-
DISM
has two functionsSFC
relies upon,/StartComponentCleanup
and/RestoreHealth
, with/RestoreHealth
relying solely upon/StartComponentCleanup
-
/StartComponentCleanup
: Cleans the Component Store of any broken hard links
(It's imperative folks on Insider Builds run this regularly due to the frequent updates) -
/RestoreHealth
: Verifies and fixes any corruption in the Component Store by verifying it's system file backups against known good copies from the Windows Update servers through hash comparison; while an offline method does exist [below], it may not always fix the corruption-
Windows 7: SUR [System Update Readiness] tool is used in lieu of this, as
Dism
did not have this functionality until Windows 8
-
Windows 7: SUR [System Update Readiness] tool is used in lieu of this, as
-
-
SFC
always assumes the Component Store is not corrupted and is why theDISM
/RestoreHealth
parameter (Windows 7: SUR) should always be run prior toSFC
; not doing so allows a corrupted Component Store to potentially replace a good system file with a corrupted one or fail to fix corruption within%WinDir%
altogether-
/ScanNow
: Verifies and fixes any corruption within%WinDir%
by verifying against the known good copies within the Component Store through hash comparison
-
DISM
and SFC
must be executed in the order listed, as each relies upon what the preceding does:
(Windows 7: skip to #3)
-
+R → Open:
PowerShell
→ Ctrl+Shift+OK
The Component Store should always be cleaned prior to running Windows Update, after an issue with Windows Update, and at least once a month, as it becomes dirty over time from updates occasionally breaking hard links.# Windows ≥8: # Online (while booted to Windows): Dism /Online /Cleanup-Image /StartComponentCleanup # Offline (while booted to WinPE/WinRE): Dism /Image:"D:\Windows" /Cleanup-Image /StartComponentCleanup # C: is usually not the drive letter in WinPE/WinRE # To ascertain: DiskPart → Lis Vol → Exit
-
Requires an internet connection, else the offline method will be required:# Windows ≥8: # Online (while booted to Windows): Dism /Online /Cleanup-Image /RestoreHealth # Offline (while booted to WinPE/WinRE): Dism /Image:"D:\Windows" /Cleanup-Image /RestoreHealth
- Use the
install.esd
||install.wim
from the Windows Install ISO for the installed version (v1909, v2004, etc.):- Create Windows 10 installation media → Download tool now → install on another PC
- Mount the ISO and determine the installed OS index [image] from the
install.esd
||install.wim
:Dism /Get-ImageInfo /ImageFile:"Z:\sources\install.esd"
- Specify the index number at the end of the
/Source
parameter:# Online (while booted to Windows): # ESD: Dism /Online /Cleanup-Image /RestoreHealth /Source:esd:"Z:\sources\install.esd":6 /LimitAccess # WIM: Dism /Online /Cleanup-Image /RestoreHealth /Source:wim:"Z:\sources\install.wim":6 /LimitAccess # Offline (while booted to WinPE/WinRE): Dism /Image:"D:\Windows" /Cleanup-Image /RestoreHealth /Source:esd:"Z:\sources\install.esd":6 /LimitAccess
- Use the
- Windows 7: Run the SUR tool
- Reboot; if errors are found, review
%WinDir%\Logs\DISM\dism.log
from the bottom up
(Log files are easier to read and sift through via the Log syntax in VS Code)-
Windows ≥8:
%WinDir%\Logs\DISM\dism.log
-
Windows 7:
%WinDir%\Logs\CBS\CheckSUR.log
(How to fix SUR errors)
-
Windows ≥8:
-
# Online (while booted to Windows): Sfc /ScanNow # Offline (while booted to WinPE/WinRE): Sfc /ScanNow /OffBootDir=D:\ /OffWinDir=D:\Windows # C: is usually not the drive letter in WinPE/WinRE # To ascertain: DiskPart → Lis Vol → Exit
- Reboot; if errors are found, output to
%UserProfile%\Desktop\SFCdetails.log
and review:# Cmd: FindStr /c:"[SR]" "%WinDir%\Logs\CBS\CBS.log" > "%UserProfile%\Desktop\SFCdetails.log" # PowerShell: FindStr /c:"[SR]" "$env:WinDir\Logs\CBS\CBS.log" > "$env:UserProfile\Desktop\SFCdetails.log"
I run these weekly via Task Scheduler to help prevent random issues from occurring:
-
Dism_ComponentCleanup.xml
Executes weekly on Sundays at 11:30:00 -
Dism_RestoreHealth.xml
Executes weekly on Sundays at 12:00:00 -
Sfc_ScanNow.xml
Executes weekly on Sundays at 13:00:00
To import into Task Scheduler:
-
GUI:
-
+R → Open:
TaskSchd.msc
-
Action → New Folder... → Name:
Custom
-
Action → Import Task... →
<task_name>.xml
-
+R → Open:
-
CLI:
-
Cmd
:SchTasks /Create /Xml "%UserProfile%\Downloads\<task_name>.xml" /Tn "\Custom\Task Name" /Ru "%ComputerName%\%UserName%"
-
Powershell
:Register-ScheduledTask -Xml (Get-Content '$env:UserProfile\Downloads\<task_name>.xml' | Out-String) -TaskName "Task Name" -TaskPath "\Custom\" -User $env:ComputerName\$env:UserName –Force
-