Cet article décrit en détail le processus permettant de vérifier quels appareils Windows 10 sont éligibles à une mise à niveau vers Windows 11 et d'initier automatiquement cette mise à niveau à l'aide des stratégies FleetDM et des scripts PowerShell .
La procédure comprend :
- Détection et stockage des composants système requis (TPM 2.0 et Secure Boot) dans le registre
- Valider les exigences matérielles et logicielles pour déterminer l'éligibilité à la mise à niveau
- Exécution d'un téléchargement automatisé et d'une installation silencieuse de Windows 11 sur des appareils compatibles
Classer les appareils dotés d'une puce TPM et du démarrage sécurisé.
Créer la politique de détection (registre FleetDM)
Utilisez la requête suivante pour vérifier la présence des clés de registre qui stockent l'état du TPM et du démarrage sécurisé :
SELECT 1 WHERE EXISTS ( SELECT 1 FROM registry WHERE path = 'HKEY_LOCAL_MACHINE\Software\FleetDM\TPMVersion' ) AND EXISTS ( SELECT 1 FROM registry WHERE path = 'HKEY_LOCAL_MACHINE\Software\FleetDM\SecureBoot' );Exécutez le script associé (remplissez le registre)
Joignez ce script PowerShell à la stratégie ci-dessus. Il détecte la version du module TPM et l'état du démarrage sécurisé, puis les enregistre dans le registre Windows pour FleetDM.
$TPM = Get-WmiObject -Namespace "Root\CIMv2\Security\MicrosoftTpm" -Class Win32_Tpm$SecureBoot = Confirm-SecureBootUEFI$TPMVersion = $TPM.SpecVersion$SecureBootEnabled = if ($SecureBoot) { 1 } else { 0 }# Write values to the registry (example)New-Item -Path "HKLM:\Software\FleetDM" -Force | Out-NullSet-ItemProperty -Path "HKLM:\Software\FleetDM" -Name "TPMVersion" -Value $TPMVersionSet-ItemProperty -Path "HKLM:\Software\FleetDM" -Name "SecureBoot" -Value $SecureBootEnabledRésultat attendu : les clés HKLM\Software\FleetDM\TPMVersion et HKLM\Software\FleetDM\SecureBoot sont créées/mises à jour.
Évaluer l'éligibilité d'un appareil Windows 10 à Windows 11
Créez la politique suivante pour valider les exigences minimales (RAM, cœurs de processeur, architecture, TPM 2.0, démarrage sécurisé) et exclure les appareils non conformes.
SELECT 1 FROM os_version as os JOIN system_info as si WHERE os.name NOT LIKE 'Microsoft Windows 10%' OR si.physical_memory < 4 * 1024 * 1024 * 1024 OR si.cpu_physical_cores < 2 OR si.cpu_type NOT LIKE '%x86_64%' OR NOT EXISTS ( SELECT * FROM registry WHERE path = 'HKEY_LOCAL_MACHINE\Software\FleetDM\TPMVersion' AND data LIKE '2%' ) OR NOT EXISTS ( SELECT * FROM registry WHERE path = 'HKEY_LOCAL_MACHINE\Software\FleetDM\SecureBoot' AND data = '1' );Interprétation : la requête renvoie 1 si l’appareil n’est pas un Windows 10 conforme. Utilisez-la comme politique de non-conformité pour ne conserver que les appareils éligibles (ceux pour lesquels la requête ne renvoie pas 1).
Déclencher la mise à niveau vers Windows 11 (appareils compatibles)
Joignez le script de déploiement ci-dessous aux appareils compatibles. Il télécharge l'ISO de Windows 11, monte l'image, copie les sources localement et planifie une installation silencieuse sous SYSTEM .
# ImportsImport-Module BitsTransfer# Variables$uri = "https://production-bucket-public-files.s3.eu-west-3.amazonaws.com/Win11_24H2_French_x64.iso"$destination = "C:\Win11.iso"$log = "C:\logs\download_win11_iso.log"# Create the logs folder if it doesn't existif (-not (Test-Path -Path "C:\logs")) { New-Item -Path "C:\logs" -ItemType Directory | Out-Null}# Start the downloadtry { "`n[$(Get-Date)] Starting download..." | Out-File -Append $log if (-not (Test-Path $destination)){ Start-BitsTransfer -Source $uri -Destination $destination } "`n[$(Get-Date)] Download completed successfully." | Out-File -Append $log} catch { "`n[$(Get-Date)] Error during download: $_" | Out-File -Append $log}# Additional variables$isoPath = "C:\Win11.iso"$setupFolder = "C:\Temp\Win11Files"$taskName = "Win11SilentUpgrade"# Step 1 - Mount the ISOMount-DiskImage -ImagePath $isoPath -PassThru | Out-NullStart-Sleep -Seconds 2$vol = Get-Volume -DiskImage (Get-DiskImage -ImagePath $isoPath)$driveLetter = $vol.DriveLetter# Step 2 - Copy ISO content locallyNew-Item -ItemType Directory -Force -Path $setupFolder | Out-NullCopy-Item "$driveLetter`:\*" -Destination $setupFolder -Recurse# Unmount the ISODismount-DiskImage -ImagePath $isoPath# Step 3 - Create and schedule the installation task$action = New-ScheduledTaskAction -Execute "C:\Temp\Win11Files\setup.exe" -Argument "/auto upgrade /migratedrivers none /resizerecoverypartition enable /dynamicupdate disable /eula accept /quiet /noreboot /uninstall disable /compat ignorewarning /copylogs C:\logs\WinSetup.log"$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest$task = New-ScheduledTask -Action $action -Principal $principal -Trigger (New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(1))Register-ScheduledTask -TaskName $taskName -InputObject $task -Force# Step 4 - Start the task immediatelyStart-ScheduledTask -TaskName $taskName