Ce script PowerShell, intitulé WinAutoCheck_AAZ.ps1, est conçu pour automatiser la vérification et la réparation des fichiers système sous Windows (SFC et DSIM), tout en offrant une interface utilisateur conviviale et lisible.
Il s'agit de la version 2.0.4.h de ce script :
viewtopic.php?t=44845
qui intègre maintenant les éléments suivants:
- un log,
- la vérification de la version de Windows (ne fonctionne que pour Windows 10 et Windows 11 derniers builds au 24 janvier 2025)
- la détection d'un environnent professionnel (dans ce cas le script ne s'exécute pas afin de ne pas casser les configurations professionnelles)
Le code commenté
Code : Tout sélectionner
# Nom du logiciel : WinAutoCheck_AAZ
# Auteur : PiB pour TEAM-AAZ
# Version : 2.0.4.h (Janvier 2025)
# --------------------------------------
# Configuration du fichier de log
$scriptPath = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
$scriptFile = $MyInvocation.MyCommand.Definition
$logFile = Join-Path -Path $scriptPath -ChildPath "WAC_AAZ.log" # Nouveau nom du fichier log
# Fonction pour écrire dans le log sans afficher dans la console
function Write-Log {
param (
[string]$message,
[string]$level = "INFO"
)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$logMessage = "[$timestamp] [$level] $message"
Add-Content -Path $logFile -Value $logMessage
}
# Fonction pour capturer et loguer une erreur détaillée
function Log-ErrorDetails {
param (
[System.Management.Automation.ErrorRecord]$errorRecord
)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$errorMessage = "[$timestamp] [ERROR] Une erreur est survenue :"
$errorMessage += "`n Message : $($errorRecord.Exception.Message)"
$errorMessage += "`n Ligne : $($errorRecord.InvocationInfo.ScriptLineNumber)"
$errorMessage += "`n Position : $($errorRecord.InvocationInfo.PositionMessage)"
$errorMessage += "`n Commande : $($errorRecord.InvocationInfo.MyCommand)"
$errorMessage += "`n StackTrace : $($errorRecord.Exception.StackTrace)"
Add-Content -Path $logFile -Value $errorMessage
}
# Vérification de la version de Windows via le numéro de build
function Check-WindowsVersion {
try {
$osInfo = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
$buildNumber = [int]$osInfo.CurrentBuild
$productName = $osInfo.ProductName
# Correction pour détecter Windows 11
if ($buildNumber -ge 22000) {
$productName = $productName -replace "Windows 10", "Windows 11"
}
Write-Log "Vérification de la version de Windows : $productName, Build $buildNumber" "INFO"
# Définir les conditions de compatibilité
if (($productName -like "*Windows 10*" -and $buildNumber -ge 19045) -or
($productName -like "*Windows 11*" -and $buildNumber -ge 22621)) {
Write-Log "Version de Windows compatible détectée : $productName, Build $buildNumber." "INFO"
return $true
} else {
Write-Log "Version de Windows incompatible : Requis Build >= 19045 (Windows 10) ou >= 22621 (Windows 11). Détecté : $buildNumber." "ERROR"
Write-Host "Ce script nécessite Windows 10 (Build 19045 ou supérieur) ou Windows 11 (Build 22621 ou supérieur)." -ForegroundColor Red
return $false
}
} catch {
Log-ErrorDetails $_
return $false
}
}
# Vérification si le script est exécuté dans un domaine autre que WORKGROUP
function Is-ProfessionalEnvironment {
try {
$domain = (Get-WmiObject -Class Win32_ComputerSystem).Domain
if ($domain -eq "WORKGROUP") {
Write-Log "L'ordinateur est dans le domaine WORKGROUP. Exécution autorisée." "INFO"
return $false
} else {
Write-Log "L'ordinateur est dans un domaine non autorisé : $domain." "ERROR"
return $true
}
} catch {
Log-ErrorDetails $_
return $true
}
}
# Vérification des droits administrateurs
function Ensure-AdminPrivileges {
try {
$currentUser = [Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()
if (-not $currentUser.IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
Write-Log "Le script nécessite des privilèges administrateurs pour fonctionner." "ERROR"
Write-Host "Le script va être relancé en mode administrateur..." -ForegroundColor Cyan
# Relancer le script en mode administrateur
Start-Process -FilePath "powershell.exe" -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File `"$scriptFile`"" -Verb RunAs
exit
} else {
Write-Log "Exécution en mode administrateur détectée." "INFO"
}
} catch {
Log-ErrorDetails $_
exit
}
}
Write-Log "Lancement du script WinAutoCheck_AAZ - Version 2.0.4.h." "INFO"
Write-Host "Lancement du script WinAutoCheck_AAZ - Version 2.0.4.h." -ForegroundColor Green
# Vérification des privilèges administrateurs avant de continuer
Ensure-AdminPrivileges
# Vérification de la version de Windows
if (-not (Check-WindowsVersion)) {
Write-Log "Le script a été arrêté en raison d'une version de Windows incompatible." "ERROR"
Write-Host "La version de Windows n'est pas compatible avec ce script." -ForegroundColor Red
Write-Host "Appuyez sur une touche pour fermer le script."
Read-Host
exit
}
# Bloquer si environnement non autorisé détecté
if (Is-ProfessionalEnvironment) {
Write-Log "Le script est bloqué. L'ordinateur n'est pas dans le domaine WORKGROUP." "ERROR"
Write-Host "Ce script ne peut être exécuté que sur un ordinateur dans le domaine WORKGROUP." -ForegroundColor Red
Write-Host "Appuyez sur une touche pour fermer le script."
Read-Host
exit
}
Write-Log "Environnement autorisé détecté. Poursuite du script." "INFO"
# Exécution principale du script : SFC et DISM
Write-Log "Toutes les vérifications ont été passées. Exécution principale du script." "INFO"
Write-Host "Toutes les vérifications ont été passées. Le script continue..." -ForegroundColor Green
try {
# Exécution de SFC
Write-Log "Lancement de la commande SFC /scannow..." "INFO"
$sfcProcess = Start-Process -FilePath "sfc.exe" -ArgumentList "/scannow" -NoNewWindow -Wait -PassThru
if ($sfcProcess.ExitCode -eq 0) {
Write-Log "SFC : Aucun problème détecté ou tous corrigés." "INFO"
Write-Host "SFC : Vérification terminée avec succès." -ForegroundColor Green
} else {
Write-Log "SFC : Des erreurs ont été détectées et n'ont pas pu être corrigées." "ERROR"
Write-Host "SFC : Des erreurs subsistent. Lancement de DISM..." -ForegroundColor Yellow
# Exécution de DISM
Write-Log "Lancement de la commande DISM /Online /Cleanup-Image /RestoreHealth..." "INFO"
$dismProcess = Start-Process -FilePath "dism.exe" -ArgumentList "/online /cleanup-image /restorehealth" -NoNewWindow -Wait -PassThru
if ($dismProcess.ExitCode -eq 0) {
Write-Log "DISM : Réparation de l'image système terminée avec succès." "INFO"
Write-Host "DISM : Réparation de l'image système terminée avec succès." -ForegroundColor Green
} else {
Write-Log "DISM : Échec de la réparation." "ERROR"
Write-Host "DISM : Échec de la réparation. Consultez les logs." -ForegroundColor Red
}
}
} catch {
Log-ErrorDetails $_
Write-Host "Une erreur est survenue lors des vérifications. Consultez les logs pour plus d'informations." -ForegroundColor Red
}
# Menu final
Write-Host "`nLe script est terminé. Que souhaitez-vous faire ?" -ForegroundColor Green
Write-Host "1. Quitter"
Write-Host "2. Afficher les résultats du log"
$response = Read-Host "Entrez le numéro correspondant à votre choix"
if ($response -eq "1") {
Write-Host "Fermeture du script. À bientôt !" -ForegroundColor Cyan
exit
} elseif ($response -eq "2") {
if (Test-Path -Path $logFile) {
Write-Host "`nAffichage des résultats du log : " -ForegroundColor Yellow
Get-Content -Path $logFile | ForEach-Object {
Write-Host $_ -ForegroundColor White
}
Write-Host ""
Read-Host "Appuyez sur Entrée pour quitter"
} else {
Write-Host "`nLe fichier de log n'a pas été trouvé. Vérifiez l'emplacement suivant : $logFile" -ForegroundColor Red
}
} else {
Write-Host "Choix invalide. Fermeture du script." -ForegroundColor Red
exit
}
- Création d'un log d'exécution
- Le script enregistre toutes les actions dans le fichier log "WAC_AAZ.log" situé dans le même répertoire que le script.
- Vérification des droits administratifs :
- Le script s'assure qu'il est exécuté avec les privilèges administratifs nécessaires. Si ce n'est pas le cas, il relance automatiquement le script en mode administrateur.
- Vérification de la stratégie d'exécution PowerShell :
- Le script vérifie la stratégie d'exécution actuelle et la modifie temporairement si nécessaire pour permettre l'exécution de scripts locaux signés (RemoteSigned).
- Vérification de la version de Windows :
- Le script vérifie la version de Windows et n'autorise l'exécution pour Windows 10 22h2 ou supérieure et Windows 11 24h2 ou supérieure).
- Vérification du domaine :
- Le script autorise l’exécution uniquement si le nom de domaine est WORKGROUP (le nom par défaut).
- Analyse et réparation des fichiers système avec SFC et DISM :
- Lance la commande sfc /scannow pour rechercher et corriger les fichiers système corrompus.
=> Si des erreurs sont détectées, il passe automatiquement à des réparations approfondies avec l'outil DISM (/CheckHealth, /ScanHealth, et /RestoreHealth).
- Lance la commande sfc /scannow pour rechercher et corriger les fichiers système corrompus.
- Rétablissement de la stratégie d'exécution initiale :
- Une fois les vérifications terminées, le script restaure la stratégie d'exécution PowerShell initiale pour ne pas impacter d'autres scripts.
- Interface utilisateur
- Le script propose soit de quitter, soit d'afficher le log d'éxéecution WAC_AAZ.log
- Enregistrer le code dans un fichier txt avec l'extension .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'exécution du script
- Le script se ferme à la fin des opérations.