Page 1 sur 1

Désinstaller proprement les SSU (ServicingStackUpdate) accumulés v.1.1

Posté : sam. 28 juin 2025 04:27
par acideburn
En faisant des mises a jour régulièrement, les SSU s'accumulent au fur et a mesure et un RESET BASE avec W10UI de chez MDL n'est pas encore fonctionnel selon les versions de windows.

Le mieux, bien sûr, est de faire ses updates sur une fresh install clean à chaque fois pour éviter ces accumulations.
Avant:
Image

Après le script pour exemple mais tout ce fera automatisé en gardant le dernier update:
Image

--Cependant ils sont en mode "permanent" .
Elles sont situés dans \Windows\servicing\Packages dans les fichiers .mum :
Avec le nom de: Package_for_ServicingStack_ puis le numéro de version (sauf pour la version d'origine 1220= 1288 qui n'avait pas la meme terminologie)
exemple : Package_for_ServicingStack_4892~31bf3856ad364e35~amd64~~19041.4892.1.0.mum

--Ils sont protéger en Trusted
Vous pouvez les modifier avec Notepad++ via PowerRun ou Nsudo

--Pour voir ses mises a jours installées en commande batch ou PowerShell ou avec DISM++ ou autre:

Code : Tout sélectionner

Get-HotFix
control /name Microsoft.WindowsUpdate /page History
appwiz.cpl
wmic qfe list
===> Pour les désinstallés proprement j'ai donc creer un script batch .cmd:
Edit: Ajout du numéro de version donc la v 1.0
Edit : Grosse Amélioration faite en v.1.1 du 27/06/2025 tout automatisé:


Le code en batch .cmd

Code : Tout sélectionner

@set ver=1.1 du 27-06-2025
@echo off

rem == Gérer les caractères spéciaux en UTF-8 ==
chcp 65001 >nul
color b0

mkdir temp 2>nul

echo ------------------------------------------------------------------------------------------
echo ================ del_SSU_modif_permanent_Script version %ver% ================
echo ------------------------------------------------------------------------------------------
setlocal enabledelayedexpansion

:askPath
REM Demande à l'utilisateur de spécifier le dossier de montage
set /p "mountDir=Entrez le chemin du dossier de montage : "

REM Vérifie si le chemin est "C:" sans antislash
if /i "%mountDir%"=="C:" (
    echo Erreur : le chemin "C:" est incomplet. Il manque un "\". Utilisez "C:\" si c'est une image Online.
    echo Appuyez sur une touche pour réessayer ou fermez la fenêtre pour quitter.
    pause >nul
    echo.
    goto askPath
)

REM Vérifie si le dossier de montage existe
if not exist "%mountDir%" (
    echo Le dossier de montage "%mountDir%" n'existe pas.
    echo Appuyez sur une touche pour réessayer ou fermez la fenêtre pour quitter.
    pause >nul
    echo.
    goto askPath
)

REM Chemin vers le dossier de Packages
set "packageDir=%mountDir%Windows\servicing\Packages"
if not exist "%packageDir%" (
    echo Le dossier "%packageDir%" n'existe pas.
    echo Appuyez sur une touche pour réessayer ou fermez la fenêtre pour quitter.
    pause >nul
    echo.
    goto askPath
)



REM Initialisation
set "files="
set "maxVer=0"
set "minVer=99999"
set "latestPkg="
set "oldestPkg="

REM Récupération des fichiers et extraction des versions
for %%f in ("%packageDir%\Package_for_ServicingStack*.mum") do (
    set "fname=%%~nxf"
    set "files=!files! %%~nxf"
    
    REM Extraire la version en fonction du séparateur (_ ou ~)
    set "verNum="
    set "str=!fname:Package_for_ServicingStack_=!"
    if "!str!"=="!fname!" (
        REM Pas de underscore, essayer avec tilde
        set "str=!fname:Package_for_ServicingStack~=!"
        REM Si toujours pas modifié, ignorer
        if "!str!"=="!fname!" (
            set "str="
        )
    )
    
    if defined str (
        set "verNum=!str:~0,4!"
        
        REM Vérifier si verNum est numérique
        for /f "delims=0123456789" %%a in ("!verNum!") do set "verNum="
        
        if defined verNum (
            REM Mise à jour du plus récent
            if !verNum! gtr !maxVer! (
                set "maxVer=!verNum!"
                set "latestPkg=!fname!"
            )
            REM Mise à jour du plus ancien
            if !verNum! lss !minVer! (
                set "minVer=!verNum!"
                set "oldestPkg=!fname!"
            )
        )
    )
)

echo ------------------------------------------------------------------------------------------
echo ================ Modification des SSU en "removable" pour leurs suppressions ================ 
echo ------------------------------------------------------------------------------------------

REM Cas particulier : si on détecte un package avec tilde 1220, forcer oldestPkg à celui-ci
for %%f in (!files!) do (
    echo %%f | findstr /i /c:"Package_for_ServicingStack~" >nul
    if !errorlevel! == 0 (
        set "oldestPkg=%%f"
        goto skipOldestCheck
    )
)
:skipOldestCheck

echo.
echo Package le plus ancien (conservé en permanent) : !oldestPkg!
echo Package le plus récent (conservé en permanent) : !latestPkg!
echo.

REM Modification des fichiers sauf les deux extrêmes
for %%f in (!files!) do (
    if /i not "%%f"=="!latestPkg!" if /i not "%%f"=="!oldestPkg!" (
        set "inputFile=%packageDir%\%%f"
        set "tempFile=!inputFile!.tmp"

        if exist "!inputFile!" (
            (
                for /f "usebackq delims=" %%a in ("!inputFile!") do (
                    setlocal enabledelayedexpansion
                    set "line=%%a"
                    set "line=!line:permanent=removable!"
                    echo !line!
                    endlocal
                )
            ) > "!tempFile!"

            move /y "!tempFile!" "!inputFile!" >nul
            echo Modifié : %%f
        )
    )
)

echo ------------------------------------------------------------------------------------------
echo ================ Suppression Ancien SSU modifié ================ 
echo ------------------------------------------------------------------------------------------

REM Définir la variable dismImageOption selon mountDir
if /i "%mountDir%"=="C:\" (
    set "dismImageOption=/Online"
) else (
    set "dismImageOption=/Image:%mountDir%"
)

REM Suppression sauf le plus ancien et le plus récent
for %%f in (!files!) do (
    if /i not "%%f"=="!latestPkg!" if /i not "%%f"=="!oldestPkg!" (
        set "pkgName=%%f"
        setlocal enabledelayedexpansion
        set "pkgName=!pkgName:.mum=!"
        dism /scratchdir:temp !dismImageOption! /Remove-Package /PackageName:!pkgName!
        endlocal
    )
)


echo ------------------------------------------------------------------------------------------
echo ================ Nettoyage fichiers sauvegarde de Windows Update via DISM ================
echo ------------------------------------------------------------------------------------------

dism !dismImageOption! /Cleanup-Image /StartComponentCleanup

rd /s /q temp 2>nul

pause
exit

Comment s'en servir ?
  1. Ouvrir le script avec les autorisations Trusted via PowerRun (juste a glisser votre fichier .cmd dedans) ou avec Nsudo
    Il vous demandera d' Entrer votre chemin "path" de votre dossier de montage de l'Iso
Que fait le script :
Release v1.1
  • Il modifie la valeur (permanence="permanent">) en (permanence="removable">) de plusieurs fichier en même temps dans un dossier de montage extrait d'un Iso.
  • Accessible en Online et en Offline et correction du bon chemin avec \ si erroné
  • Prends en compte la version minimale installé sans la modifié (idéal pour du propre, la SSU 1220=1288 pour du LTSC d'origine) pour pas faire planté le système
  • Prends en compte la version Updaté la plus récente sans la modifié en "removable" pour pas faire planté le système
  • Effectue un nettoyage Dism /Cleanup-Image /StartComponentCleanup à la suite
A chacun d'effectuer les sauvegardes nécessaires avant d'effectuer ce script (pour utilisateur Avancé :lol: )
Lien PowerRun 1.7: power run 1.7 à jour du 17/07/2024 chez sordum