Full Windows Update Reset & Clean-Up (Error 0x80070306)

Nero Atreides

Lt. Commander Pro
Registriert
Jan. 2004
Beiträge
1.382
Moin,

nach einem extrem nervigen Karfreitag gibt es nun eine zugegeben komplexe, aber funktionierende Lösung für das jüngste Windows Update Problem (Installationsfehler 0x80070306 bei KB5086672, KB5079473).

Zugegeben, am besten funktioniert das Inplace-Upgrade, das dauert ca. 20 Min und danach ist alles gefixt. ABER nachdem ich mich 9h lang durch alles gepflügt habe, was man so anstellen kann ohne ein Inplace-Upgrade machen zu müssen will ich Euch das nicht vorenthalten. Ich habe es in eine .BAT gepackt, das Skript findet ihr unten. Wenn ihr den Code in eine Datei mit der Endung .bat kopiert, dann habt ihr ein ausführbares Skript für Windows.

Verwendung auf eigene Gefahr - bei mir hat es funktioniert.
Allein den Software Distribution Ordner mit 750.000 Dateien (!) loszuwerden war eine Offenbarung ;)
  • Auf Englisch damit jeder was damit anfangen kann.
  • Bringt etwas Zeit mit - alles in allem kann es länger als 1h dauern.
  • Unbedingt als Admin ausführen!
  • Das Skript setzt zwingend Win 11 x64 25H2 voraus. Mit älteren Versionen kann es funktionieren, muss aber nicht. Insbesondere Schritt 2+4 sind relativ 25H2 spezifisch, weil die WSUS-Architektur sich zwischen den Versionen verändert hat (Win 11 setzt ab 25H2 auf sog. Checkpoints um die Update-Stände zu konsolidieren).
  • Am Anfang wird ein Wiederherstellungspunkt gesetzt um auf Nummer sicher zu gehen.
  • Das Skript fragt Euch vor jeder Aktion ob es weitergehen soll, der Schritt übersprungen werden soll, oder das ganze Skript beendet werden soll.
  • Credits to Manuel F. Gil und Shawn Brink- auch wenn ihr DLL-Voodoo seit Win 11 24H2 gar nicht mehr funktionieren kann, weil es die meisten der DLLs gar nicht mehr gibt oder sie durch die System File Protection nicht mehr manuell registriert werden können...
  • More Credits to Google Gemini...schon krass was da mittlerweile so geht.

Have fun. Und liebe Windows Devs, bitte weniger AI Vibecoding, Eure Qualität ist mittlerweile echt mies wenn sich selbst Amateure wie ich auf diese Art mit Eurem Produkt auseinandersetzen müssen, weil so ziemlich jedes Update mehr Fehler produziert als es behebt.


Code:
@echo off
setlocal enabledelayedexpansion
title Win11 25H2 PC: TOTAL WINDOWS UPDATE RECOVERY | ver. 2604 by RC_2026
color 0b

:: --- ADMIN CHECK ---
net session >nul 2>&1
if %errorLevel% neq 0 (
    echo [!] PLEASE RUN AS ADMINISTRATOR!
    pause
    exit /b
)

:MAIN_MENU
cls
echo ============================================================
echo      Win11 PC: WINDOWS UPDATE REPAIR CONTROL CENTER
echo ============================================================
echo Y = Execute | N = Skip | X = Exit script
echo ============================================================

:: --- 1. BACKUP ---
call :ASK_STEP "1. Create System Restore Point?"
if "!ans!"=="X" goto :EOF
if "!ans!"=="Y" (
    powershell -command "Enable-ComputerRestore -Drive 'C:\'; Checkpoint-Computer -Description 'Before Master-Repair' -RestorePointType 'MODIFY_SETTINGS'"
)

:: --- 2. STOP SERVICES (Deep) ---
call :ASK_STEP "2. Stop all Update Services + Orchestrator?"
if "!ans!"=="X" goto :EOF
if "!ans!"=="Y" (
    echo Stopping services (Soft-Stop)...
    net stop wuauserv /y & net stop bits /y & net stop usosvc /y & net stop appidsvc /y & net stop msiserver /y
    net stop cryptsvc /y
   
    echo Terminating Orchestrator worker...
    taskkill /F /IM MoUsoCoreWorker.exe /T >nul 2>&1
)

:: --- 3. WMI REPAIR ---
call :ASK_STEP "3. Repair WMI Repository?"
if "!ans!"=="X" goto :EOF
if "!ans!"=="Y" (
    net stop winmgmt /y
    winmgmt /resetrepository
    net start winmgmt
)

:: --- 4. REGISTRY & POLICIES RESET ---
call :ASK_STEP "4. Clear Registry cache, locks & update flags?"
if "!ans!"=="X" goto :EOF
if "!ans!"=="Y" (
    reg delete "HKCU\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /f >nul 2>&1
    reg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /f >nul 2>&1
    reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update" /v "PostRebootReporting" /f >nul 2>&1
    reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update" /v "RebootRequired" /f >nul 2>&1
    reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\InProgress" /f >nul 2>&1
    reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Update\Orchestrator" /f >nul 2>&1
    reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\DataStore" /f >nul 2>&1
    reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v "SusClientId" /f >nul 2>&1
    gpupdate /force >nul 2>&1
)

:: --- 5. WSUS CACHE FOLDER DELETION ---
call :ASK_STEP "5. Deep folder reset (SoftwareDist, Catroot2)?"
if "!ans!"=="X" goto :EOF
if "!ans!"=="Y" (
    echo Deleting Volume Shadow Copies (VSS)...
    vssadmin delete shadows /all /quiet >nul 2>&1
    powershell -command "Disable-ComputerRestore -Drive 'C:\'" >nul 2>&1
   
    echo.
    echo [!] START LIGHTSPEED SERVICE KILL (Hard Kill + Rename)
    :: Everything happens extremely fast in sequence here:
    taskkill /F /FI "SERVICES eq cryptsvc" >nul 2>&1
    net stop cryptsvc /y >nul 2>&1
   
    :: Remove older backups (RMDIR)
    if exist "%SYSTEMROOT%\SoftwareDistribution.old" rmdir /s /q "%SYSTEMROOT%\SoftwareDistribution.old"
    if exist "%SYSTEMROOT%\system32\catroot2.old" rmdir /s /q "%SYSTEMROOT%\system32\catroot2.old"
   
    :: Rename current folders (with safety check)
    if exist "%SYSTEMROOT%\SoftwareDistribution" ren "%SYSTEMROOT%\SoftwareDistribution" "SoftwareDistribution.old"
    if exist "%SYSTEMROOT%\system32\catroot2" ren "%SYSTEMROOT%\system32\catroot2" "catroot2.old"
   
    :: Reset Orchestrator & BITS
    if exist "C:\ProgramData\Microsoft\Windows\UpdateOrchestrator" rmdir /s /q "C:\ProgramData\Microsoft\Windows\UpdateOrchestrator"
    del /s /q /f "%ALLUSERSPROFILE%\Application Data\Microsoft\Network\Downloader\qmgr*.dat" >nul 2>&1
   
    echo [+] Lightspeed sequence completed.
)

:: --- 6. SERVICE PERMISSIONS ---
call :ASK_STEP "6. Restore default permissions for services?"
if "!ans!"=="X" goto :EOF
if "!ans!"=="Y" (
    sc.exe sdset bits D:(A;CI;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU) >nul
    sc.exe sdset wuauserv D:(A;;CCLCSWRPLORC;;;AU)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY) >nul
)

:: --- 7. TRANSACTION LOGS ---
call :ASK_STEP "7. Reset file system transaction logs?"
if "!ans!"=="X" goto :EOF
if "!ans!"=="Y" (
    fsutil resource setautoreset true C:\ >nul 2>&1
    del %SystemRoot%\System32\Config\TxR\*.* /q >nul 2>&1
)

:: --- 8. SERVICE START ---
call :ASK_STEP "8. Restart services (and enable System Protection)?"
if "!ans!"=="X" goto :EOF
if "!ans!"=="Y" (
    net start cryptsvc & net start bits & net start wuauserv & net start usosvc & net start appidsvc & net start msiserver
    echo Re-enabling System Protection for drive C: ...
    powershell -command "Enable-ComputerRestore -Drive 'C:\'" >nul 2>&1
)

:: --- 9. DISM REPAIR ---
call :ASK_STEP "9. DISM /RestoreHealth (Online via Windows Update) & Cleanup?"
if "!ans!"=="X" goto :EOF
if "!ans!"=="Y" (
    echo Starting system repair via Windows Update. This may take a while...
    DISM /Online /Cleanup-Image /RestoreHealth
   
    echo Cleaning up WinSxS (StartComponentCleanup)...
    DISM /online /cleanup-image /startcomponentcleanup
   
    set /p rb="Execute ResetBase? WARNING: Uninstallation of old updates will no longer be possible! (y/n): "
    if /i "!rb!"=="y" (
        echo Executing final ResetBase...
        DISM /Online /Cleanup-Image /StartComponentCleanup /ResetBase
    )
)

:: --- 10. SFC & CHKDSK ---
call :ASK_STEP "10. Run SFC Scan and schedule CHKDSK for reboot?"
if "!ans!"=="X" goto :EOF
if "!ans!"=="Y" (
    sfc /scannow
    echo y | chkdsk C: /f /r
)

echo.
echo ============================================================
echo   REPAIR SEQUENCE COMPLETED
echo ============================================================
pause
exit

:ASK_STEP
echo.
set /p userans="[?] %~1 (y/n/x): "
if /i "!userans!"=="y" (set ans=Y & exit /b)
if /i "!userans!"=="n" (set ans=N & exit /b)
if /i "!userans!"=="x" (set ans=X & exit /b)
goto :ASK_STEP
 
  • Gefällt mir
Reaktionen: Apple ][ und BFF
Coole Arbeit. 👍

Nero Atreides schrieb:
Allein den Software Distribution Ordner mit 750.000 Dateien (!) loszuwerden war eine Offenbarung

Fremd booten und weg loeschen.
Mach ich brutal mit einem Live-Linux oder Hiren's Boot CD wenn das laufende Windows partout nicht will.
Vorteil dabei, dass die Dienste welche den Ordner blockieren koennen nicht laufen.

Bei der Zeile wo Du die Dienste stoppst. War da der wuauserv ueberhaupt am laufen?
Weil eigentlich rennt der seit einiger Zeit nicht mehr staendig sondern nur auf Anforderung.
 
BFF schrieb:
Fremd booten und weg loeschen.

wozu ?

Administrative Powershell öffnen und folgende Befehle eingeben

Code:
Stop-Service wuauserv
 
Stop-Service bits
 
Remove-Item $env:windir\softwaredistribution -Recurse -Force
 
Start-Service wuauserv


dazu braucht es kein Fremd System, was erst aufwendig heruntergeladen und auf einen USB Stick etc erstellt werden muss.
Und wenn Dienste sich nicht beenden lassen wollen -> Reboot und gleich nach dem Start durcharbeiten.
 
Sebbi schrieb:

Weil in manchen Faellen das Verzeichnis trotz Stoppversuchen von Wuauserv & bits nicht loeschbar ist.

Und auch die Frage an Dich. Laeuft denn der wuauserv ueberhaupt wenn Du in stoppen willst?
Eigentlich rennt der nicht mehr lange wenn er das automatische Suchen/Installieren etc. abgearbeitet hat.

1775251377022.png


Sebbi schrieb:
was erst aufwendig heruntergeladen und auf einen USB Stick etc erstellt werden muss

Hat man? 🤷‍♂️
Zur Not tut es auch der Stick mit dem MCT. 😉
 
BFF schrieb:
Und auch die Frage an Dich. Laeuft denn der wuauserv ueberhaupt wenn Du in stoppen willst?

Gegenfrage: tut es denn weh, wenn man den Befehl im Script ausführt und die Antwort zurück bekommt, das der Dienst im Moment nicht gestartet ist?

Es würde mehr Probleme bereiten, das NICHT mit im Script zu haben und das der Dienst dann doch zufällig aktiv ist und Probleme beim Löschen veranstaltet.
 
Es geht da nicht wirklich darum das der Dienst versucht wird zu stoppen, das System sagt rennt nicht.
Es ist mir mehrfach schon unter gekommen, dass mein WindowsUpdateReinigerScript an der Stelle nichts tat wo schlussendlich die Verzeichnisse geloescht werden sollten Trotz Behauptung Dienst rennt nicht. Also hier bei mir:

Code:
Remove-Item -Path "$env:systemroot\SoftwareDistribution" -ErrorAction SilentlyContinue -Recurse
Remove-Item -Path "$env:systemroot\System32\Catroot2" -ErrorAction SilentlyContinue -Recurse

Ich verwende meist eine angepasste Version von hier:
https://github.com/Gaz2600/Reset-Windows-Update/blob/main/RstWinUpd.ps1

Aber egal.
Am Ende findet ein Jeder irgendwie seinen Weg.
 
BFF schrieb:
Es ist mir mehrfach schon unter gekommen, dass mein WindowsUpdateReinigerScript an der Stelle nichts tat wo schlussendlich die Verzeichnisse geloescht werden sollten trotz Behauptung Dienst rennt nicht.

ok dann kann man auch mit der administrativen CMD arbeiten, das ist zuverlässiger und

Code:
"Remove-Item $env:windir\softwaredistribution -Recurse -Force"
 
ersetzen mit

rmdir /S /Q "C:\Windows\SoftwareDistribution"
 
Zurück
Oben