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.
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."
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