[PowerShell] Réinitialisation des Composants de Mise à Jour de Windows

Vous trouverez ici des scripts pour faciliter la gestion de votre ordinateur. Ils sont proposés tels quels par le rédacteur du message. La team ne vérifie pas la qualité de ces éléments et n'assure pas le support ni la maintenance. Vous les utilisez sous votre seule responsabilité.
Règles du forum
Pour les créateurs de scripts

Veuillez noter que les scripts que vous partagez ici sont proposés tels quels et la team ne vérifie pas leur qualité.
Nous vous rappelons que nous n'assurons ni le support ni la maintenance des scripts publiés.

Pour faciliter leur utilisation par les autres membres de la communauté, respectez ces consignes :
.
  • Utilisez les préfixes de langage pour taguer les messages.
  • Assurez-vous que vos scripts sont clairs et bien documentés
.
Merci de votre compréhension et de votre contribution.
Répondre
Avatar du membre
pboulanger
Administrateur du site
Administrateur du site
Messages : 1132
Enregistré le : mar. 17 mars 2020 11:49
A remercié : 108 fois
A été remercié : 111 fois
    Windows 10 Firefox

[PowerShell] Réinitialisation des Composants de Mise à Jour de Windows

Message par pboulanger »

Bonjour à tous,

Script PowerShell de Réinitialisation des Composants de Mise à Jour de Windows

Ce script PowerShell est un outil puissant conçu pour diagnostiquer et résoudre les problèmes liés aux mises à jour de Windows. En arrêtant les services critiques, en nettoyant et en renommant les répertoires associés aux mises à jour, ce script permet de réinitialiser le mécanisme de mise à jour de Windows de manière sécurisée et contrôlée.

Important
  • Sauvegarde :
    Avant d'exécuter le script, assurez-vous d'avoir sauvegardé vos données importantes, car le script peut supprimer ou renommer des dossiers critiques du système.
     
  • Précautions :
    Ce script est destiné aux administrateurs système ou aux utilisateurs expérimentés qui comprennent les implications de la gestion des services et répertoires système de Windows.
En suivant ces instructions, le script peut être exécuté efficacement pour gérer et résoudre les problèmes de mise à jour de Windows.


Le code

Code : Tout sélectionner

# Vérifier si le script est exécuté avec les privilèges d'administrateur
if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
    echo "Ce script doit être exécuté en tant qu'administrateur. Veuillez relancer le script avec les droits appropriés.`n"
    
    # Proposer de relancer le script avec les privilèges élevés
    Write-Host "Voulez-vous relancer le script avec les privilèges d'administrateur ?"
    Write-Host "Tapez 'O' pour Oui ou 'N' pour Non."
    $response = Read-Host
    Clear-Host  # Efface l'écran après la réponse
    if ($response -eq 'O') {
        # Relancer le script avec élévation des privilèges
        Start-Process PowerShell -ArgumentList "-ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs
    }
    exit
}

# Définir le chemin du fichier log sur le bureau de l'utilisateur
$desktopPath = [System.Environment]::GetFolderPath('Desktop')
$logFile = "$desktopPath\log_raz_wu.txt"

# Fonction pour écrire dans le fichier log
function Write-Log {
    param (
        [string]$message
    )
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    "$timestamp - $message" | Out-File -FilePath $logFile -Append
}

# Vérification de la présence du fichier de log
if (Test-Path $logFile) {
    # Si le fichier de log existe, demander à l'utilisateur s'il souhaite le supprimer ou ajouter les nouvelles entrées
    Write-Host "Le fichier de log '$logFile' existe déjà."
    Write-Host "Voulez-vous le supprimer ou ajouter à la suite ?"
    Write-Host "Tapez 'S' pour supprimer, 'A' pour ajouter."
    $logChoice = Read-Host
    Clear-Host  # Efface l'écran après la réponse
    if ($logChoice -eq 'S') {
        Remove-Item $logFile -Force
        Write-Host "Fichier de log supprimé."
        # Initialiser un nouveau fichier de log
        Write-Log "Nouveau fichier de log créé."
    } elseif ($logChoice -eq 'A') {
        Write-Log "Ajout au fichier de log existant."
    } else {
        Write-Host "Choix invalide. Le script va ajouter au fichier de log existant par défaut."
        Write-Log "Ajout au fichier de log existant par défaut."
    }
} else {
    # Initialiser un nouveau fichier de log s'il n'existe pas
    Write-Log "Nouveau fichier de log créé."
}

# Début du script et initialisation du log
Write-Log "Début du script de gestion des dossiers de mise à jour Windows."

# Étape de confirmation avant d'arrêter les services
Write-Host "Le script va arrêter les services de cryptographie et de mise à jour Windows."
Write-Host "Voulez-vous continuer ?"
Write-Host "Tapez 'O' pour Oui ou 'N' pour Non."
$confirmStop = Read-Host
Clear-Host  # Efface l'écran après la réponse
if ($confirmStop -ne 'O') {
    Write-Log "L'utilisateur a annulé l'arrêt des services. Fin du script."
    exit
}

# Arrêt du service de cryptographie
echo "Arrêt du fournisseur de services cryptographiques.`n"
net stop cryptsvc
if ($LASTEXITCODE -eq 0) {
    Write-Log "Service de cryptographie (cryptsvc) arrêté avec succès."
} else {
    Write-Log "Erreur lors de l'arrêt du service de cryptographie (cryptsvc). Code d'erreur : $LASTEXITCODE"
}

# Arrêt du service de mise à jour Windows
echo "Arrêt du service de mise à jour Windows.`n"
net stop wuauserv
if ($LASTEXITCODE -eq 0) {
    Write-Log "Service de mise à jour Windows (wuauserv) arrêté avec succès."
} else {
    Write-Log "Erreur lors de l'arrêt du service de mise à jour Windows (wuauserv). Code d'erreur : $LASTEXITCODE"
}

# Vérification de la présence des répertoires .old
echo "Vérification de la présence des répertoires .old.`n"
if ((Test-Path C:\Windows\SoftwareDistribution.old) -eq $true) {
    Write-Host "Le script doit supprimer C:\Windows\SoftwareDistribution.old, qui est probablement une sauvegarde du dossier SoftwareDistribution."
    Write-Host "Tapez 'O' pour supprimer ou 'N' pour annuler."
    $delSD = Read-Host
    Clear-Host  # Efface l'écran après la réponse
    if ($delSD -eq 'N') {
        Write-Log "Suppression de SoftwareDistribution.old annulée par l'utilisateur."
    } else {
        Remove-Item C:\Windows\SoftwareDistribution.old -Force -Recurse
        Write-Log "Répertoire SoftwareDistribution.old supprimé."
    }
}

if ((Test-Path C:\Windows\System32\catroot2.old) -eq $true) {
    Write-Host "Le script doit supprimer C:\Windows\System32\catroot2.old, qui est probablement une sauvegarde du dossier catroot2."
    Write-Host "Tapez 'O' pour supprimer ou 'N' pour annuler."
    $delCR = Read-Host
    Clear-Host  # Efface l'écran après la réponse
    if ($delCR -eq 'N') {
        Write-Log "Suppression de catroot2.old annulée par l'utilisateur."
    } else {
        Remove-Item C:\Windows\System32\catroot2.old -Force -Recurse
        Write-Log "Répertoire catroot2.old supprimé."
    }
}

# Renommer le dossier SoftwareDistribution en SoftwareDistribution.old
echo "Renommage de SoftwareDistribution en SoftwareDistribution.old.`n"
$SD = $true
try {
    Rename-Item -Path C:\Windows\SoftwareDistribution -NewName C:\Windows\SoftwareDistribution.old -ErrorAction Stop
    Write-Log "Renommage de SoftwareDistribution en SoftwareDistribution.old réussi."
}
catch {
    echo "Le dossier n'existe pas, impossible de le renommer.`n"
    Write-Log "Échec du renommage de SoftwareDistribution : le dossier n'existe pas."
    $SD = $false
}

# Renommer le dossier catroot2 en catroot2.old
echo "Renommage de catroot2 en catroot2.old.`n"
$CR = $true
try {
    Rename-Item -Path C:\Windows\System32\catroot2 -NewName C:\Windows\System32\catroot2.old -ErrorAction Stop
    Write-Log "Renommage de catroot2 en catroot2.old réussi."
}
catch {
    echo "Le dossier n'existe pas, impossible de le renommer.`n"
    Write-Log "Échec du renommage de catroot2 : le dossier n'existe pas."
    $CR = $false
    if ($SD -eq $false -And $CR -eq $false) {
        echo "Les deux dossiers sont manquants. Abandon.`n"
        Write-Log "Abandon du script : les deux dossiers sont manquants."
        exit
    }
}

# Demande de suppression des anciens dossiers
Write-Host "Voulez-vous supprimer les anciens dossiers ?"
Write-Host "Le script ne le fera que si vous répondez 'O'."
$delYN = Read-Host
Clear-Host  # Efface l'écran après la réponse
if ($delYN -eq 'O') {
    if ($SD -eq $true) {
        Remove-Item C:\Windows\SoftwareDistribution.old -Force -Recurse
        Write-Log "Répertoire SoftwareDistribution.old supprimé après renommage."
    }
    if ($CR -eq $true) {
        Remove-Item C:\Windows\System32\catroot2.old -Force -Recurse
        Write-Log "Répertoire catroot2.old supprimé après renommage."
    }
}

# Redémarrage des services
echo "Redémarrage des services arrêtés précédemment.`n"
net start cryptsvc
if ($LASTEXITCODE -eq 0) {
    Write-Log "Service de cryptographie (cryptsvc) redémarré avec succès."
} else {
    Write-Log "Erreur lors du redémarrage du service de cryptographie (cryptsvc). Code d'erreur : $LASTEXITCODE"
}

net start wuauserv
if ($LASTEXITCODE -eq 0) {
    Write-Log "Service de mise à jour Windows (wuauserv) redémarré avec succès."
} else {
    Write-Log "Erreur lors du redémarrage du service de mise à jour Windows (wuauserv). Code d'erreur : $LASTEXITCODE"
}

# Fin du script
echo "Terminé.`n"
Write-Log "Script terminé avec succès."
Ce que fait le script

Voici ce que fait le script étape par étape :
  • Vérification des Privilèges d'Administrateur :
    • Le script vérifie d'abord s'il est exécuté avec des privilèges d'administrateur.
    • Si ce n'est pas le cas, il propose de se relancer avec les droits appropriés.
  • Gestion du Fichier de Log :
    • Le script crée ou met à jour un fichier journal nommé log_raz_wu.txt sur le bureau de l'utilisateur.
    • Si le fichier de log existe déjà, il propose de le supprimer ou d'ajouter les nouvelles entrées à la suite du fichier existant.
  • Arrêt des Services Windows Critiques :
    Le script arrête deux services importants de Windows, mais avant d'arrêter ces services, l'utilisateur doit confirmer l'opération.
    • Service de Cryptographie (cryptsvc)
    • Service de Mise à Jour Windows (wuauserv)
  • Gestion des Répertoires de Mise à Jour :
    Le script vérifie la présence des répertoires de sauvegarde .old associés aux mises à jour Windows et demande à l'utilisateur s'il souhaite supprimer ces répertoires s'ils existent.
    • SoftwareDistribution.old
    • catroot2.old
  • Renommage des Répertoires de Mise à Jour :
    Renomme le répertoire SoftwareDistribution en SoftwareDistribution.old et catroot2 en catroot2.old.
    Cela est utile pour réinitialiser les composants de mise à jour de Windows.
     
  • Suppression des Anciens Répertoires Renommés :
    Après le renommage, le script demande à l'utilisateur s'il souhaite supprimer les anciens répertoires .old créés.
     
  • Redémarrage des Services :
    Les services de cryptographie et de mise à jour Windows, arrêtés au début, sont redémarrés.
     
  • Journalisation détaillée des Actions :
    Toutes les actions, y compris les erreurs, les confirmations de l'utilisateur et les résultats des opérations, sont enregistrées dans le journal sur le bureau de l'utilisateur sous le nom log_raz_wu.txt.

Comment s'en servir ?
  • Enregistrer le code dans un fichier txt avec l'extension .ps1 par exemple Raz-wu.ps1
  • Clic droit sur l'icône du fichier et commande Exécuter avec PowerShell
  • Des messages de confirmation apparaissent au fur et à mesure de l'éxecution du script
  • Le script se ferme automatiquement à la fin des opérations.
  • Le fichier log est affiché sur le bureau
 ! Message de : pboulanger
ATTENTION ! ce script est livré tel quel. Je l'ai juste testé sur mon windows 11 pro 23h2 build 22631.4112.
Vous pouvez le modifier comme vous le souhaitez.
Il vous appartient de prendre toutes les précautions de sauvegarde avant de l'exécuter.
Amicalement,

Pierre
Répondre