/>

Sysprep et Finalisation

Master Windows 11 25H2 Optimisé

Auteur : Ayi NEDJIMI Consultants

Mises à jour Windows

Installez toutes les mises à jour Windows disponibles avant de finaliser le master :

# Installer le module PSWindowsUpdate si nécessaire
Install-Module PSWindowsUpdate -Force -SkipPublisherCheck

# Installer toutes les mises à jour disponibles
Import-Module PSWindowsUpdate
Get-WindowsUpdate -Install -AcceptAll -IgnoreReboot

# Vérifier l'état des mises à jour
Get-WindowsUpdate

# Installer uniquement les mises à jour de sécurité
Get-WindowsUpdate -Install -MicrosoftUpdate -Category "Security Updates" -AcceptAll

# Nettoyer les fichiers de mise à jour après installation
DISM /Online /Cleanup-Image /StartComponentCleanup /ResetBase

Assurez-vous que Windows Update est bien configuré pour les futures installations :

# Configurer Windows Update pour installation automatique
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" -Force
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Force
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoUpdate" -Value 0 -Force
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUOptions" -Value 4 -Force
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "ScheduledInstallDay" -Value 0 -Force
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "ScheduledInstallTime" -Value 3 -Force

# Activer les mises à jour des autres produits Microsoft
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AllowMUUpdateService" -Value 1 -Force

Optimisations finales avant Sysprep

Script de finalisation complet

Voici un script PowerShell complet qui regroupe toutes les opérations de finalisation avec logging :

# Script de finalisation du Master Windows 11 25H2
# Activer la journalisation complète
Start-Transcript -Path "C:\MasterBuild_$(Get-Date -Format 'yyyyMMdd_HHmmss').log" -Append

Write-Host "=== Début de la finalisation du master ===" -ForegroundColor Green
Write-Host "Date: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -ForegroundColor Cyan

# Vérification finale de l'intégrité système
Write-Host "`nVérification de l'intégrité système..." -ForegroundColor Yellow
DISM /Online /Cleanup-Image /RestoreHealth
sfc /scannow

# Nettoyage final des fichiers temporaires
Write-Host "`nNettoyage des fichiers temporaires..." -ForegroundColor Yellow
Remove-Item -Path "$env:windir\Temp\*" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "$env:TEMP\*" -Recurse -Force -ErrorAction SilentlyContinue
Clear-RecycleBin -Force -ErrorAction SilentlyContinue

# Nettoyage du dossier Prefetch pour optimiser le démarrage
Write-Host "`nNettoyage du dossier Prefetch..." -ForegroundColor Yellow
Remove-Item -Path "$env:windir\Prefetch\*" -Force -ErrorAction SilentlyContinue

# Nettoyage des logs
Write-Host "`nNettoyage des journaux d'événements..." -ForegroundColor Yellow
wevtutil el | ForEach-Object {wevtutil cl "$_"}

# Désactiver l'hibernation pour libérer de l'espace
Write-Host "`nDésactivation de l'hibernation..." -ForegroundColor Yellow
powercfg /hibernate off

# Vider le cache DNS
Write-Host "`nNettoyage du cache DNS..." -ForegroundColor Yellow
Clear-DnsClientCache

# Supprimer les points de restauration système
Write-Host "`nSuppression des points de restauration..." -ForegroundColor Yellow
vssadmin delete shadows /all /quiet

# Afficher les statistiques finales
Write-Host "`n=== Statistiques du système ===" -ForegroundColor Green
$volume = Get-Volume -DriveLetter C
Write-Host "Espace libre : $([math]::Round($volume.SizeRemaining/1GB, 2)) GB"
Write-Host "Espace utilisé : $([math]::Round(($volume.Size - $volume.SizeRemaining)/1GB, 2)) GB"
Write-Host "Taille totale : $([math]::Round($volume.Size/1GB, 2)) GB"

Write-Host "`n=== Finalisation terminée ===" -ForegroundColor Green
Write-Host "Le système est prêt pour Sysprep." -ForegroundColor Cyan

Stop-Transcript

Préparation finale du master

Sysprep et généralisation

Avant de capturer l'image, le système doit être généralisé avec Sysprep pour supprimer les informations spécifiques à l'ordinateur.

Sysprep (System Preparation Tool) est l'outil qui prépare l'installation Windows à être généralisée et déployée sur plusieurs machines. C'est l'étape la plus importante pour garantir que chaque déploiement reçoit un SID (Security Identifier) unique et redémarre en mode OOBE (Out-of-Box Experience).

Options Sysprep et leurs fonctions

Option Fonction Description détaillée
/oobe Mode OOBE Configure Windows pour démarrer en mode Out-of-Box Experience au prochain démarrage (configuration régionale, création utilisateur, etc.)
/generalize Généralisation Supprime les informations uniques spécifiques à l'installation (SID, pilotes matériels spécifiques, activation). Crucial pour le déploiement multi-matériel
/shutdown Arrêt Éteint la machine après l'exécution de Sysprep, la laissant prête à être capturée
/mode:vm Mode VM Optimise Sysprep pour les machines virtuelles (réduit le temps de généralisation)
/unattend Fichier de réponses Utilise un fichier XML pour automatiser l'OOBE et personnaliser le déploiement
💡 Important : Si vous avez utilisé le mode Audit (Ctrl+Shift+F3), vous êtes déjà dans l'environnement idéal pour finaliser. Sinon, assurez-vous d'être en mode Administrateur.
# Nettoyer les profils utilisateurs temporaires
Get-ChildItem "C:\Users" -Exclude "Public","Default","Administrator" | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue

# Supprimer les fichiers Panther (logs d'installation)
Remove-Item -Path "$env:windir\Panther\*" -Recurse -Force -ErrorAction SilentlyContinue

Exécution de Sysprep

Pour une machine physique :

C:\Windows\System32\Sysprep\sysprep.exe /oobe /generalize /shutdown

Pour une machine virtuelle (recommandé pour VM) :

C:\Windows\System32\Sysprep\sysprep.exe /oobe /generalize /shutdown /mode:vm
⚠️ Attention : Sysprep ne peut être exécuté qu'un nombre limité de fois (8 fois maximum depuis Windows 8.1). Ne sysprepiez que lorsque votre master est définitivement prêt.
💡 Astuce : Avant d'exécuter Sysprep, créez un snapshot Hyper-V ou un checkpoint VMware pour pouvoir revenir en arrière en cas d'ajustements nécessaires.
⚠️ AVERTISSEMENT CRITIQUE ⚠️

Une fois que Sysprep a été exécuté et que l'ordinateur s'est éteint, NE LE REDÉMARREZ PLUS. Le système est maintenant dans un état généralisé et prêt à être capturé. Tout redémarrage déclencherait le processus OOBE et compromettrait la généralisation.

L'image est maintenant prête à être capturée par votre outil de déploiement (MDT, WDS, DISM, etc.) pour devenir votre master optimisé.

Capture de l'image

Une fois le système éteint après Sysprep, démarrez sur un environnement Windows PE et capturez l'image avec DISM :

# Depuis Windows PE, capturer la partition système
DISM /Capture-Image /ImageFile:"D:\Windows11-25H2-Master.wim" /CaptureDir:"C:\" /Name:"Windows 11 25H2 Master" /Description:"Master Windows 11 25H2 optimisé et sécurisé - $(Get-Date -Format 'yyyy-MM-dd')" /Compress:max /Verify

# Alternative : Capture au format ESD (plus compressé)
DISM /Capture-Image /ImageFile:"D:\Windows11-25H2-Master.esd" /CaptureDir:"C:\" /Name:"Windows 11 25H2 Master" /Compress:recovery /Verify

Options de compression :

Vérifications post-déploiement

Après avoir déployé votre master sur un poste de production, effectuez les vérifications suivantes :

Vérification de la sécurité

# Vérifier l'état de Device Guard et Credential Guard
Get-ComputerInfo | Select-Object DeviceGuardSmartStatus, DeviceGuardSecurityServicesConfigured

# Vérifier l'état de Windows Defender
Get-MpComputerStatus | Select-Object AntivirusEnabled, RealTimeProtectionEnabled

# Vérifier le TPM
Get-Tpm | Select-Object TpmPresent, TpmReady, TpmEnabled, TpmActivated

# Vérifier Secure Boot
Confirm-SecureBootUEFI

Vérification des performances

# Vérifier l'utilisation mémoire
Get-Process | Sort-Object WS -Descending | Select-Object -First 10 ProcessName, @{Name="Memory (MB)";Expression={[math]::Round($_.WS/1MB,2)}}

# Vérifier les services en cours d'exécution
$runningServices = Get-Service | Where-Object {$_.Status -eq "Running"}
Write-Host "Nombre de services en cours d'exécution : $($runningServices.Count)"

# Vérifier l'utilisation du disque
Get-Volume | Select-Object DriveLetter, FileSystemLabel, @{Name="Size (GB)";Expression={[math]::Round($_.Size/1GB,2)}}, @{Name="Free (GB)";Expression={[math]::Round($_.SizeRemaining/1GB,2)}}

# Vérifier les performances de démarrage
Get-CimInstance Win32_OperatingSystem | Select-Object LastBootUpTime

Test de connectivité et fonctionnalités

# Vérifier la connectivité réseau
Test-Connection -ComputerName "8.8.8.8" -Count 4
Test-Connection -ComputerName "google.com" -Count 4

# Vérifier la résolution DNS
Resolve-DnsName google.com
Resolve-DnsName microsoft.com

# Vérifier l'activation Windows
slmgr /xpr
slmgr /dli

# Vérifier le pare-feu Windows
Get-NetFirewallProfile | Select-Object Name, Enabled

# Vérifier Windows Defender
Get-MpComputerStatus