#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : 0x800f0831 -- an update in the chain is missing from the store Fix : Find the missing package in CBS.log and install it by hand Source: https://jbtecwiz.com/support/win-0x800f0831 Run as : Elevated PowerShell Expect : 45 minutes Risk : low Reversible : yes WHEN THIS IS THE RIGHT FIX The standard DISM repair has already failed or is not available. The log names exactly what is missing, which turns this from guesswork into a single download. HOW TO UNDO IT wusa /uninstall /kb:5005539 removes a package installed this way. This script walks the fix one step at a time and asks before each one. Steps with no command are things you do yourself -- it prints those and waits. Run with -DryRun to print without executing. -------------------------------------------------------------------- NO WARRANTY - USE AT YOUR OWN RISK This script is provided by JbTecWiz as-is and with no warranty of any kind, express or implied. You run it entirely at your own risk. JbTecWiz accepts no liability for any loss or damage arising from its use, including but not limited to data loss, downtime, or configuration changes that turn out to be wrong for your system. You are responsible for reading this script before running it, for satisfying yourself that it suits the machine in front of you, and for having a working backup first. Some steps cannot be undone. -------------------------------------------------------------------- #> [CmdletBinding()] param( # Print every step and command without running anything. [switch]$DryRun, # Do not ask before each step. Read the script first if you use this. [switch]$Unattended ) $ErrorActionPreference = 'Stop' $script:Failed = 0 function Write-Rule { param([string]$Text) Write-Host '' Write-Host ('-' * 70) -ForegroundColor DarkGray if ($Text) { Write-Host $Text -ForegroundColor Cyan } } function Show-Prose { param([string]$Text, [string]$Colour = "Gray") if (-not $Text) { return } $words = $Text -split "\s+"; $line = " " foreach ($w in $words) { if (($line.Length + $w.Length) -gt 74) { Write-Host $line -ForegroundColor $Colour; $line = " " } $line += "$w " } if ($line.Trim()) { Write-Host $line -ForegroundColor $Colour } } function Invoke-Step { param( [int]$Number, [string]$Do, [string]$Why, [scriptblock]$Command, [switch]$Manual, [string]$Shell = "powershell" ) Write-Rule " Step $Number of 6" Show-Prose $Do "White" if ($Why) { Write-Host ""; Show-Prose $Why "DarkGray" } if ($Manual) { Write-Host '' Write-Host ' -> Do this yourself, then press Enter to carry on.' -ForegroundColor Yellow if (-not $Unattended -and -not $DryRun) { [void](Read-Host) } return } Write-Host '' foreach ($l in ($Command.ToString().Trim() -split "`n")) { Write-Host (" " + $l.Trim()) -ForegroundColor Green } Write-Host '' if ($DryRun) { Write-Host " (dry run -- not executed)" -ForegroundColor DarkGray; return } if (-not $Unattended) { $a = Read-Host " Run this step? [Y]es / [S]kip / [Q]uit" if ($a -match "^[Qq]") { Write-Host " Stopped at your request."; exit 0 } if ($a -match "^[Ss]") { Write-Host " Skipped." -ForegroundColor DarkGray; return } } try { & $Command } catch { $script:Failed++ Write-Host (" Step $Number failed: " + $_.Exception.Message) -ForegroundColor Red Show-Prose "The rest of the fix may depend on this. Read the write-up before carrying on." "Red" if (-not $Unattended) { $c = Read-Host " Carry on anyway? [y/N]" if ($c -notmatch "^[Yy]") { exit 1 } } } } Write-Rule Write-Host ' 0x800f0831 -- an update in the chain is missing from the store' -ForegroundColor White Write-Host ' Find the missing package in CBS.log and install it by hand' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: low Reversible 45 minutes' Write-Host '' Show-Prose 'No warranty. Use at your own risk - JbTecWiz accepts no liability. Read it before you run it, and have a backup.' 'DarkYellow' Write-Rule if (-not $Unattended -and -not $DryRun) { $go = Read-Host ' Ready? [y/N]' if ($go -notmatch "^[Yy]") { Write-Host " Nothing was changed."; exit 0 } } Invoke-Step -Number 1 -Do 'Pull the missing package name out of the servicing log.' -Why 'The entry looks like Package_for_RollupFix~31bf3856ad364e35~amd64~~19041.1234.1.5. The number after the tilde is the build the machine is missing.' -Command { Select-String -Path C:\Windows\Logs\CBS\CBS.log -Pattern 'Package_for_|does not have the required' | Select-Object -Last 25 } Invoke-Step -Number 2 -Do 'Note the build number and the architecture.' -Manual Invoke-Step -Number 3 -Do 'Download that exact cumulative update from the Microsoft Update Catalog as an .msu.' -Manual Invoke-Step -Number 4 -Do 'Install it directly, bypassing Windows Update.' -Command { cmd.exe /c 'wusa.exe C:\temp\windows10.0-kb5005539-x64.msu /quiet /norestart' } Invoke-Step -Number 5 -Do 'Restart, then run the newer update again.' -Manual Invoke-Step -Number 6 -Do 'If the log names a servicing stack update (SSU), install that first and restart before anything else.' -Why 'An SSU updates the code that installs updates. A cumulative update that needs a newer SSU cannot install itself out of the problem.' -Manual Write-Rule " Confirm it worked" Show-Prose 'The package is now present and the failing update installs.' 'White' Write-Host '' if (-not $DryRun) { DISM /Online /Get-Packages /Format:Table | Select-String 'RollupFix' } Write-Rule if ($script:Failed -gt 0) { Write-Host (" Finished with " + $script:Failed + " failed step(s).") -ForegroundColor Yellow Show-Prose 'Read the full write-up at https://jbtecwiz.com/support/win-0x800f0831' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: wusa /uninstall /kb:5005539 removes a package installed this way.' 'DarkGray' Write-Rule