SCVMM : corriger le blocage de la personnalisation (étape 1.7) lors du déploiement de Windows Server 2022

Dans SCVMM, le déploiement d’une VM Windows Server 2022 peut se bloquer sur « Personnalisation » (étape 1.7) pendant 60 min. Voici une méthode éprouvée, complète et actionnable pour diagnostiquer et corriger la cause, côté VMM, template et Hyper‑V.

Sommaire

Symptômes et périmètre

Lors du déploiement à partir d’un modèle sysprepé, le job VMM reste figé sur Personnalisation (sous‑étape 1.7) puis échoue par dépassement de délai. La VM boote mais n’applique pas (ou partiellement) le Guest OS Profile : nom d’ordinateur, domaine, réseau, clés produit, et autres paramètres OOBE ne sont pas injectés correctement. Les hôtes Hyper‑V sont en 2019, la cible est Windows Server 2022 (Gen 2 recommandé).

Ce qui se passe réellement à l’étape 1.7

SCVMM personnalise un VHDX généralisé en procédant, dans les grandes lignes, ainsi :

  1. Montage hors ligne du disque : VMM injecte un Unattend.xml minimal compilé à partir du Guest OS Profile (nom, langue, product key, domaine/OU, paramètres réseau).
  2. Validation matériel : cohérence du contrôleur (SCSI), génération de VM (Gen 2), Secure Boot, services d’intégration.
  3. Démarrage et phase Windows : la VM entre dans les passes specialize puis oobeSystem. Si un blocage intervient (pilote, script, réseau, clé invalide, paramètre unattend obsolète…), VMM attend le signal de fin et finit par « timeout ».

Autrement dit, un gel sur 1.7 indique quasi toujours un problème invité (image/template, unattend, réseau) ou un écosystème VMM (version/UR, caches, agent d’hôte).

Plan d’attaque rapide (15 minutes)

  1. Tester le template sans personnalisation : déployez une VM sans Guest OS Profile. Si la VM arrive à OOBE proprement, l’image n’est pas cassée et l’erreur vient de la personnalisation (unattend/profil).
  2. Désactiver scripts et GPO post‑déploiement : retirez toute exécution automatique et tout agent AV/EDR le temps du test.
  3. Basculer le réseau sur un VLAN « neutre » ou une logique simple avec DHCP fonctionnel ; vérifiez que l’IP est fournie pendant specialize.
  4. Redémarrer les services VMM et agents hôtes (purge de caches) puis relancer un déploiement minimaliste.

Checklist exhaustive et actions correctives

Axe de vérificationActions recommandéesCommandes & points de contrôleObjectif
Prérequis SCVMMConfirmer que VMM, SQL et la bibliothèque sont supportés pour Windows Server 2022. Appliquer le dernier Update Rollup de SCVMM 2019 ou migrer vers SCVMM 2022 si possible.# Sur le serveur VMM Get-Service SCVMMService | fl Name,Status # Version produit via registre Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft System Center Virtual Machine Manager Server\Setup' | Select-Object DisplayVersion Vérifiez aussi que la console et le serveur VMM sont au même niveau de patch.Compatibilité complète Windows Server 2022 / SCVMM
Modèle (template) 2022Créez le VHDX à partir d’une VM de référence généralisée : sysprep /oobe /generalize /shutdown. Le template doit cibler explicitement « Windows Server 2022 » dans le Guest OS Profile. Supprimez toute clé produit ou fragment Unattend obsolète. Ne laissez aucun agent VMM dans l’image ; seuls les services d’intégration Hyper‑V natifs.# Sur la VM de référence avant sysprep Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Guest-Services # Sysprep C:\Windows\System32\Sysprep\Sysprep.exe /oobe /generalize /shutdown Après sysprep, montez le VHDX en lecture seule pour contrôle : absence d’agents non‑Microsoft, de scripts d’amorçage, etc.Éviter les incohérences pendant l’injection
Services VMMRedémarrez System Center Virtual Machine Manager sur le serveur VMM. Redémarrez l’agent VMM sur les hôtes Hyper‑V concernés.# Serveur VMM Restart-Service -Name SCVMMService -Force # Sur hôtes Hyper-V Invoke-Command -ComputerName (Get-SCVMHost | Select -ExpandProperty Name) \` -ScriptBlock { Restart-Service -Name vmmagent -Force } Optionnel : redémarrer le service WinRM si des jobs restent « stuck ».Réinitialiser moteur et agent de déploiement
Logs & journalisationCorrélez l’horodatage du job VMM avec les journaux de l’hôte et de l’invité. Inspectez setupact.log et setuperr.log pendant specialize/oobeSystem.# Serveur VMM \$today = Get-Date -Format yyyyMMdd Get-ChildItem "C:\ProgramData\VMMLogs\*\${today}\*.log" # Hôte Hyper-V Get-ChildItem "C:\ProgramData\VMMLogs" -Recurse # À l'intérieur de la VM (via console): type C:\Windows\Panther\UnattendGC\setupact.log type C:\Windows\Panther\UnattendGC\setuperr.log Cherchez : clé produit invalide, échec de jonction domaine, composant unattend inconnu, délai réseau.Isoler la cause exacte
Pilotes & services d’intégrationMettez à jour la VM de référence 2022 via Windows Update avant sysprep. Assurez-vous que les services d’intégration essentiels sont actifs (Heure, KVP, Services invités). Gen 2 + contrôleur SCSI pour le disque système ; Secure Boot « Microsoft Windows ».# Sur l'hôte, après création de la VM Get-VMIntegrationService -VMName "NomDeVM" | Format-Table Name, Enabled, PrimaryStatusDescription # Contrôle Secure Boot Get-VMFirmware -VMName "NomDeVM" | fl SecureBoot, SecureBootTemplateAssurer la détection correcte du matériel virtuel
Scripts personnalisésDésactivez provisoirement toute post‑personnalisation (scripts, GPO, agents AV/EDR). Réactivez par paliers pour trouver le coupable.# Dans le Guest OS Profile, supprimez les scripts post-déploiement # ou ajoutez un "sleep" pour laisser OOBE finir Start-Sleep -Seconds 120Écarter un blocage externe à SCVMM
DNS & réseauAssociez l’adaptateur virtuel au bon réseau logique/VM Network et à un pool IP valide. Vérifiez DHCP ou l’accessibilité de l’IP statique pendant specialize. Évitez l’« old Legacy Adapter » ; utilisez l’adaptateur synthétique.# Côté VMM : contrôle du VM Network & du pool IP Get-SCStaticIPAddressPool | Select Name,AddressFamily,Subnet Get-SCVMNetwork | Select Name,LogicalNetwork # Dans la VM (console) ipconfig /all Test-NetConnection dc01 -Port 389Empêcher un time‑out dû à l’inaccessibilité réseau

Unattend : modèle minimaliste et pièges fréquents

Lorsque la personnalisation échoue, 70 % des cas proviennent d’un Unattend.xml implicite (généré par VMM) qui se heurte à des paramètres invalides ou hérités d’anciennes versions. Conseils :

  • Commencez par un profil minimal : nom de machine, langue, fuseau, AdministratorPassword, configuration réseau basique.
  • Évitez de graver une clé produit générique non conforme à 2022.
  • Différez la jonction domaine si vos DC/GPO sont stricts ; joignez via script au premier démarrage.
  • Respectez la limite NetBIOS (15 caractères) pour ComputerName.
<unattend xmlns="urn:schemas-microsoft-com:unattend">
  <settings pass="specialize">
    <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64"
               publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
      <ComputerName>WS22-%RAND%</ComputerName>
      <TimeZone>Romance Standard Time</TimeZone>
      <RegisteredOrganization>VotreOrg</RegisteredOrganization>
    </component>
  </settings>
  <settings pass="oobeSystem">
    <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64"
               publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
      <InputLocale>fr-FR</InputLocale>
      <SystemLocale>fr-FR</SystemLocale>
      <UILanguage>fr-FR</UILanguage>
      <UserLocale>fr-FR</UserLocale>
    </component>
    <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64"
               publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
      <OOBE>
        <HideEULAPage>true</HideEULAPage>
        <NetworkLocation>Work</NetworkLocation>
        <ProtectYourPC>3</ProtectYourPC>
      </OOBE>
      <AutoLogon>
        <Username>Administrator</Username>
        <Password><Value>PasswordCh@ngeMe!</Value></Password>
        <Enabled>true</Enabled>
        <LogonCount>1</LogonCount>
      </AutoLogon>
    </component>
  </settings>
</unattend>

Ajoutez ensuite, par incréments, les blocs (jonction domaine, scripts, rôles) ; si un ajout réintroduit le blocage, vous avez la cause.

Hyper‑V : matériel virtuel cohérent pour 2022

  • Génération 2, disque OS sur SCSI, démarrage UEFI.
  • Secure Boot réglé sur Microsoft Windows.
  • RAM dynamique : laissez une marge ; certains antivirus/EDR n’aiment pas le mémoire trop juste durant OOBE.
  • vCPU : au moins 2 vCPU pour accélérer specialize.
  • Intégration : services « Heure », « KVP », « Guest Services » activés.

Réseau et DNS : éviter les faux positifs

L’étape 1.7 échoue souvent car la VM ne peut pas joindre le domaine pendant specialize. Recommandations :

  • DNS : le template doit pointer vers les DNS internes (DC) si l’on joint le domaine.
  • DHCP vs IP statique : préférez DHCP pour valider rapidement ; si IP statique, vérifiez que l’adresse est dans le pool et non déjà utilisée.
  • VLAN & VM Network : définissez le VLAN dans le Hardware Profile ; évitez de dépendre d’un paramétrage « à la main » post‑création.

SCVMM : services, caches et jobs

Un cache VMM ou un agent d’hôte en décalage de version peut figer la personnalisation. Procédez ainsi :

  1. Redémarrez SCVMMService côté serveur.
  2. Redémarrez vmmagent sur chaque hôte Hyper‑V participant.
  3. Relancez le job avec journalisation verbeuse (panneau Jobs).

Si des jobs restent en état « Not Responding », videz les caches temporaires, puis redémarrez le serveur VMM en dehors des heures de pointe.

Augmenter parfois le délai de personnalisation

Si la cause est identifiée (par exemple un script de conformité long) mais acceptable, augmentez temporairement le délai de personnalisation côté VMM via les paramètres internes (exposés par WMI/DB). La clé souvent mentionnée est VmmVmConfigUpdateTimeout. N’appliquez cette modification qu’avec prudence, change freeze validé et retour arrière documenté.

Procédure pas‑à‑pas : de l’hypothèse à la preuve

  1. Contrôler le template : démarrer la VM de référence sysprepée sans unattend. Si elle arrive à l’écran OOBE sans erreur, l’image de base est saine.
  2. Déployer avec un Guest OS Profile minimal (nom, langue, fuseau). Si OK, ajouter la jonction domaine. Si l’échec réapparaît, creuser DNS/Kerberos/pare‑feu.
  3. Vérifier le réseau logique : VM Network → IP Pool → VLAN. Un pool vide ou mal scindé (v4/v6) suffit à figer 1.7.
  4. Inspecter setupact.log : erreurs typiques :
    • ProductKey invalid : supprimez la clé du profil ou injectez la bonne.
    • JoinDomain/Unattend : compte non autorisé, OU inexistante, temps système décalé.
    • Component not found : un bloc unattend incompatible avec 2022.
  5. Rejouer avec scripts/GPO désactivés. Si le déploiement passe, introduisez les composants un à un.

Cartographie causes ↔ corrections

SymptômeIndicateursCause probableCorrectif
1.7 « Personnalisation » dépasse 60 minAucun log d’erreur VMM, setupact.log silencieuxVMM/agent hôte en défaut, cacheRedémarrage services VMM + agent host, rejouer
Erreur de jonction domainesetupact.log montre NetJoin 0x xxxxxDNS/ACL/horloge, compte Join non autoriséCorriger DNS, NTP, privilèges, tester Add-Computer en local
OOBE demande une interactionConsole voit un écran bloquantUnattend incomplet (HideEULA, etc.)Compléter oobeSystem dans Unattend (voir modèle)
BSOD au premier bootEventID Kernel-Boot/DriverPilote tiers dans l’imageNettoyer le VHDX, ne garder que composants Microsoft
IP non attribuéeipconfig montre APIPADHCP/pool IP indispo, VLAN erronéCorriger VM Network/pool, valider DHCP/VLAN

Scripts pratiques

Collecte éclair des journaux

$ts = Get-Date -Format yyyyMMdd_HHmm
$dest = "C:\Temp\VMM_WS2022_$ts"
$new = New-Item -ItemType Directory -Path $dest

# VMM server

Copy-Item "C:\ProgramData\VMMLogs\*.log" -Destination \$dest -ErrorAction SilentlyContinue

# Hôtes Hyper-V (adapter la liste)

\$hosts = @("HV01","HV02")
foreach(\$h in \$hosts){
Invoke-Command -ComputerName \$h -ScriptBlock {
param(\$d)
\$p = "C:\ProgramData\VMMLogs"
if(Test-Path \$p){ Compress-Archive -Path "\$p\*" -DestinationPath "\$env\:TEMP\VMMLogs\_\$env\:COMPUTERNAME.zip" -Force }
} -ArgumentList \$dest
Copy-Item "\\\$h\C\$\Users\Public\VMMLogs\_\$h.zip" -Destination \$dest -ErrorAction SilentlyContinue
}

# Empaquetage final

Compress-Archive -Path "\$dest\*" -DestinationPath "\$dest.zip" -Force
Write-Host "Bundle prêt :" "\$dest.zip" 

Déploiement de test « zéro fioriture »

# Exemple illustratif : remplacer les noms par vos objets VMM
$tpl = Get-SCVMTemplate -Name "WS2022-REF"
$host = Get-SCVMHost -ComputerName "HV01"
$cloud = Get-SCCloud -Name "PrivateCloud"
$hw = Get-SCVirtualHardwareProfile -Name "Gen2-Base"
$os = Get-SCGuestOSProfile -Name "WS2022-Minimal"

New-SCVirtualMachine -Name "WS22-Test-\$((Get-Random))" `  -VMHost $host -Cloud $cloud -VMTemplate $tpl`
-VirtualHardwareProfile \$hw -GuestOSProfile \$os \`
-StartVM 

Bonnes pratiques de construction d’image 2022

  • Pas d’agents tiers : évitez d’injecter AV/EDR/gestion dès l’image. Installez‑les après stabilisation du déploiement.
  • Windows Update : appliquez les CU sur la VM de référence avant sysprep.
  • Nettoyage : Dism /Online /Cleanup-Image /StartComponentCleanup /ResetBase pour réduire la taille.
  • Réseau : gardez un seul NIC dans le template jusqu’à validation de la personnalisation.
  • Langues : alignez UILanguage, SystemLocale et UserLocale (ex. fr-FR).

Observabilité pendant OOBE

Activez la console série Hyper‑V ou la session améliorée pour « voir » la VM pendant OOBE et détecter un prompt bloquant (licence, compte, erreur de pilote). Un simple screenshot à ce moment suffit souvent à trancher entre unattend et problème réseau.

Quand augmenter le délai… et quand ne pas le faire

Augmenter le délai global (par ex. via VmmVmConfigUpdateTimeout) ne doit pas masquer un incident structurel. Utilisez‑le seulement si vous avez une raison valable (scripts de durcissement qui prennent du temps, latence spécifique), et uniquement après validation que le processus finit correctement au‑delà de 60 minutes.

FAQ ciblée

Faut‑il un agent VMM dans l’invité ? Non. L’agent VMM est pour les hôtes (Hyper‑V). L’invité n’a besoin que des services d’intégration Hyper‑V.

La jonction domaine bloque‑t‑elle vraiment 1.7 ? Oui, si DNS/NTP/ACL ne sont pas alignés. Faites un test workgroup d’abord, puis joignez après.

Secure Boot peut‑il empêcher OOBE ? Oui, si le mauvais template de certificats est appliqué. Pour Windows, utilisez « Microsoft Windows ».

Legacy Network Adapter ? À proscrire en Gen 2. Utilisez l’adaptateur synthétique.

Checklist finale de validation

  • SCVMM au dernier UR, console = serveur, agent hôte à jour.
  • Template WS 2022 propre, sysprepé, sans agents tiers, services d’intégration OK.
  • Guest OS Profile minimal validé ; unattend enrichi par étapes.
  • VM Network et pool IP opérationnels ; DNS internes utilisés.
  • Aucun script/GPO/AV ne s’exécute avant la fin d’OOBE.
  • Personnalisation passe en moins de 10 minutes sur un réseau sain.

Conclusion

Un blocage sur l’étape 1.7 est rarement « magique » : il reflète un conflit précis entre le template, l’unattend et l’environnement VMM/Hyper‑V. En partant d’un profil minimal, en réinitialisant services et agents, et en observant setupact.log au bon moment, on ramène le déploiement Windows Server 2022 à un processus fiable et reproductible. Si vos besoins imposent des scripts lourds en post‑déploiement, envisagez un délai de personnalisation plus élevé — mais uniquement une fois la chaîne de base parfaitement saine.

Réponse & Solutions — récapitulatif en un tableau

AxeActionsObjectif
Prérequis SCVMMVérifier versions minimales, appliquer dernier UR, aligner console/serveurCompatibilité totale 2022/SCVMM
Template 2022VHDX généralisé, Guest OS Profile Windows Server 2022, pas d’Unattend obsolèteInjection sans conflit
Services VMMRedémarrer SCVMMService et vmmagent, purger les cachesMoteur de déploiement propre
LogsJobs VMM, VMMLogs, Panther/UnattendGCIsoler l’erreur exacte
IntégrationMAJ services d’intégration, Secure Boot cohérent, SCSIMatériel virtuel reconnu
ScriptsDésactiver scripts, AV/EDR, GPO durant la validationÉcarter un blocage externe
RéseauVM Network/pool IP valides, DHCP ou IP statique accessibleÉviter time‑out réseau
TimeoutAu besoin, ajuster prudemment VmmVmConfigUpdateTimeoutAutoriser des personnalisation longues

Annexes — commandes utiles

Validation DNS/NTP dans l’invité

w32tm /query /status
Resolve-DnsName _ldap._tcp.dc._msdcs.votre-domaine.local
Test-NetConnection votre-dc -Port 88    # Kerberos
Test-NetConnection votre-dc -Port 389   # LDAP

Jonction domaine différée (après OOBE)

$sec = Read-Host "Mot de passe du compte Join" -AsSecureString
$cred = New-Object System.Management.Automation.PSCredential("DOMAINE\CompteJoin",$sec)
Add-Computer -DomainName "votre-domaine.local" -Credential $cred -OUPath "OU=Serveurs,DC=votre-domaine,DC=local" -Restart

Contrôle de l’adaptateur réseau dans VMM

$vm = Get-SCVirtualMachine -Name "WS22-Test"
$nic = $vm | Get-SCVirtualNetworkAdapter
$nic | Select-Object VMNetwork, IPv4AddressType, IPv6AddressType, VlanEnabled, VlanID

Avec ces vérifications et mises à jour, la personnalisation d’une VM Windows Server 2022 devrait s’achever sans rester bloquée à l’étape 1.7.

Sommaire