
Debería ser relativamente sencillo conocer dentro la empresa los equipos que por limitaciones de hardware no son compatibles con la instalación de Windows 11 (recuerda la fecha de fin de soporte), los requisitos de hardware han ido variando… aunque tengamos un listado de los activos con nuestro inventario al día, puede que no estén todos los detalles necesarios, no se trate de una estandarización, diferentes proveedores…
Partiendo de entornos PYME con Directorio Activo local o híbrido podemos establecer una política de grupo (GPO) que se distribuya entre todos los equipos y nos reporte si cumple con los requisitos.
Partimos de un script oficial de Microsoft [HardwareReadiness.ps1], aunque han aparecido otras variantes más amigables de utilizar, crearemos una nueva política desde «Administración de directivas de grupo» que contendrá tres configuraciones básicas:
Ejecutar el script de PowerShell oficial desde un ruta compartida accesible: Configuración del equipo > Directivas > Configuración de Windows > Scripts > Inicio

Retraso de 2 o 4 minutos para ejecutar el script de inicio de sesión: Configuración del equipo > Directivas > Plantillas administrativas > Sistema > Directiva de grupo > Configurar retraso de script de inicio de sesión

Y por último nos aseguramos que se haya iniciado la red: Configuración del equipo > Directivas > Plantillas administrativas > Sistema > Inicio de sesión > Esperar siempre a que se inicialice la red en el inicio del equipo y el inicio de sesión

Conforme los equipos se reinicien y hayamos indicado un directorio compartido, un archivo local, un atributo del Directorio Activo… donde almacenar los resultados podremos ir solucionando las posibles migraciones.
Guardar en unidad de red compartida o directorio local:
.\HardwareReadiness.ps1 > \\miservidor.local\Windows11\$env:computername.json
Modificar script para almacenar en atributo del directorio activo (requiere política de firma):
$outObject = $outObject | ConvertTo-Json -Compress
# Añadir después de esta línea:
$computer = $env:computername
$ComputerSearcher = New-Object DirectoryServices.DirectorySearcher
# Personalizar con el dominio de destino:
$ComputerSearcher.SearchRoot = "LDAP://DC=MiDominio,DC=local"
$ComputerSearcher.Filter = "(&(objectCategory=Computer)(CN=$computer))"
$computerObj = [ADSI]$ComputerSearcher.FindOne().Path
# Campo donde guardar la información:
$computerObj.Put( "Win11", $outObject )
$computerObj.SetInfo()
Get-ADComputer -Filter {enabled -eq "true"} -properties *| Where-Object {$_.Win11 -ne $null}
Ejemplo de resultado almacenado para un equipo:
{"returnCode":1,"returnReason":"TPM, ","logging":"Storage: OSDiskSize=499GB. PASS; Memory: System_Memory=64GB. PASS; TPM: TPMVersion=False. FAIL; Processor: {AddressWidth=64; MaxClockSpeed=2201; NumberOfLogicalCores=24; Manufacturer=GenuineIntel; Caption=Intel64 Family 6 Model 85 Stepping 7; }. PASS; SecureBoot: Capable. PASS; ","returnResult":"NOT CAPABLE"}
Si todo esto te ha sonado complejo, contacta con nosotros y revisamos tu caso específico.