Este artículo detalla el proceso para verificar qué dispositivos Windows 10 son elegibles para una actualización a Windows 11 e iniciar automáticamente esa actualización mediante políticas de FleetDM y scripts de PowerShell .
El procedimiento incluye:
- Detectar y almacenar los componentes del sistema necesarios (TPM 2.0 y Arranque seguro) en el registro
- Validar los requisitos de hardware y software para determinar la elegibilidad de la actualización
- Ejecutar una descarga automatizada e instalación silenciosa de Windows 11 en dispositivos compatibles
Clasificar dispositivos con TPM y arranque seguro presentes
Crear la política de detección (registro FleetDM)
Utilice la siguiente consulta para verificar la presencia de claves de registro que almacenarán el estado de TPM y Arranque seguro :
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' );Ejecutar el script asociado (rellenar el registro)
Adjunte este script de PowerShell a la política anterior. Detecta la versión de TPM y el estado de Arranque seguro, y los escribe en el registro de Windows para 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 $SecureBootEnabledResultado esperado: se crean/actualizan HKLM\Software\FleetDM\TPMVersion y HKLM\Software\FleetDM\SecureBoot.
Evaluar la elegibilidad de un dispositivo Windows 10 para Windows 11
Cree la siguiente política para validar los requisitos mínimos (RAM, núcleos de CPU, arquitectura, TPM 2.0, arranque seguro) y excluir los dispositivos no compatibles.
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' );Interpretación: la consulta devuelve 1 si el dispositivo no es compatible con Windows 10. Úselo como una política de incumplimiento para mantener solo los dispositivos elegibles (aquellos para los que la consulta no devuelve 1).
Activar la actualización a Windows 11 (dispositivos elegibles)
Adjunte el siguiente script de implementación a los dispositivos compatibles. Este descarga la ISO de Windows 11, monta la imagen, copia los orígenes localmente y programa una configuración silenciosa en 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