Created
September 17, 2025 12:19
-
-
Save cicorias/9094452537daf1759857e4a97f7455a1 to your computer and use it in GitHub Desktop.
Because windows 11 sucks i need this all the time
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <# | |
| Reset-WindowsUpdate.ps1 (fixed interpolation) | |
| Run from an elevated PowerShell window. | |
| #> | |
| # --- Guard: must be admin --- | |
| if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent() | |
| ).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)) { | |
| Write-Error "Run this script from an elevated PowerShell (Run as administrator)." | |
| exit 1 | |
| } | |
| $ErrorActionPreference = 'Stop' | |
| Write-Host "Creating a system restore point (can take a minute)..." -ForegroundColor Cyan | |
| try { Checkpoint-Computer -Description "Pre Windows Update reset" -RestorePointType "MODIFY_SETTINGS" } catch { } | |
| # --- Services we’ll stop/start --- | |
| $services = @("wuauserv","bits","cryptsvc","appidsvc","msiserver") | |
| function Stop-Services { | |
| Write-Host "Stopping services..." -ForegroundColor Cyan | |
| foreach ($svc in $services) { | |
| try { | |
| if (Get-Service $svc -ErrorAction SilentlyContinue) { | |
| Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue | |
| sc.exe config $svc start= demand | Out-Null | |
| Write-Host " Stopped ${svc}" | |
| } | |
| } catch { | |
| Write-Warning " Could not stop ${svc}: $($_.Exception.Message)" | |
| } | |
| } | |
| } | |
| function Start-Services { | |
| Write-Host "Starting services..." -ForegroundColor Cyan | |
| foreach ($svc in $services) { | |
| try { | |
| if (Get-Service $svc -ErrorAction SilentlyContinue) { | |
| sc.exe config $svc start= demand | Out-Null | |
| Start-Service -Name $svc -ErrorAction SilentlyContinue | |
| Write-Host " Started ${svc}" | |
| } | |
| } catch { | |
| Write-Warning " Could not start ${svc}: $($_.Exception.Message)" | |
| } | |
| } | |
| } | |
| Stop-Services | |
| # --- Clear BITS transfer queue files (qmgr*.dat) --- | |
| Write-Host "Clearing BITS transfer queue..." -ForegroundColor Cyan | |
| $bitsPath1 = Join-Path $env:ALLUSERSPROFILE "Microsoft\Network\Downloader" | |
| $bitsPath2 = "C:\ProgramData\Microsoft\Network\Downloader" | |
| Get-ChildItem -Path $bitsPath1,$bitsPath2 -Filter "qmgr*.dat" -ErrorAction SilentlyContinue | ForEach-Object { | |
| try { Remove-Item $_.FullName -Force -ErrorAction Continue; Write-Host " Deleted $($_.Name)" } catch {} | |
| } | |
| # --- Rename SoftwareDistribution and Catroot2 (Windows rebuilds them) --- | |
| $sd = Join-Path $env:SystemRoot "SoftwareDistribution" | |
| $sdOld = "$sd.old_$(Get-Date -Format 'yyyyMMdd_HHmmss')" | |
| $cr = Join-Path $env:SystemRoot "System32\catroot2" | |
| $crOld = "$cr.old_$(Get-Date -Format 'yyyyMMdd_HHmmss')" | |
| Write-Host "Resetting SoftwareDistribution and Catroot2..." -ForegroundColor Cyan | |
| try { | |
| if (Test-Path $sd) { Rename-Item -Path $sd -NewName $sdOld -ErrorAction Stop; Write-Host " Renamed SoftwareDistribution -> $sdOld" } | |
| } catch { Write-Warning " Could not rename SoftwareDistribution: $($_.Exception.Message)" } | |
| try { | |
| if (Test-Path $cr) { Rename-Item -Path $cr -NewName $crOld -ErrorAction Stop; Write-Host " Renamed catroot2 -> $crOld" } | |
| } catch { Write-Warning " Could not rename catroot2: $($_.Exception.Message)" } | |
| # --- Re-register core Windows Update DLLs --- | |
| Write-Host "Re-registering Windows Update components..." -ForegroundColor Cyan | |
| $dlls = @( | |
| "atl.dll", | |
| "urlmon.dll","mshtml.dll","shdocvw.dll","browseui.dll","jscript.dll","vbscript.dll", | |
| "scrrun.dll","msxml.dll","msxml3.dll","msxml6.dll", | |
| "wintrust.dll","cryptdlg.dll","cryptui.dll","rsaenh.dll","wuapi.dll","wuaueng.dll", | |
| "wuaueng1.dll","wucltux.dll","wudriver.dll","wups.dll","wups2.dll","wuwebv.dll", | |
| "qmgr.dll","qmgrprxy.dll" | |
| ) | Sort-Object -Unique | |
| foreach ($dll in $dlls) { | |
| $full = Join-Path $env:SystemRoot "System32\$dll" | |
| if (Test-Path $full) { | |
| try { | |
| Start-Process -FilePath "$env:SystemRoot\System32\regsvr32.exe" -ArgumentList "/s `"$full`"" -Wait -WindowStyle Hidden | |
| Write-Host " Registered ${dll}" | |
| } catch { | |
| Write-Warning " Failed to register ${dll}: $($_.Exception.Message)" | |
| } | |
| } | |
| } | |
| # --- Reset network stacks relevant to Windows Update --- | |
| Write-Host "Resetting WinHTTP proxy and Winsock..." -ForegroundColor Cyan | |
| try { netsh winhttp reset proxy | Out-Null } catch {} | |
| try { netsh winsock reset | Out-Null } catch {} | |
| # --- Restart services --- | |
| Start-Services | |
| Write-Host "`nOptional: you can now run component repairs (commented out by default):" -ForegroundColor Yellow | |
| Write-Host " # sfc /scannow" | |
| Write-Host " # DISM /Online /Cleanup-Image /RestoreHealth" | |
| Write-Host "`nAll done. Reboot recommended." -ForegroundColor Green |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment