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.
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 :
- 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). - Validation matériel : cohérence du contrôleur (SCSI), génération de VM (Gen 2), Secure Boot, services d’intégration.
- 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)
- 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).
- Désactiver scripts et GPO post‑déploiement : retirez toute exécution automatique et tout agent AV/EDR le temps du test.
- Basculer le réseau sur un VLAN « neutre » ou une logique simple avec DHCP fonctionnel ; vérifiez que l’IP est fournie pendant specialize.
- 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érification | Actions recommandées | Commandes & points de contrôle | Objectif |
---|---|---|---|
Prérequis SCVMM | Confirmer 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) 2022 | Cré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 VMM | Redé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 & journalisation | Corré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égration | Mettez à 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, SecureBootTemplate | Assurer la détection correcte du matériel virtuel |
Scripts personnalisés | Dé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éseau | Associez 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 389 | Empê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 :
- Redémarrez
SCVMMService
côté serveur. - Redémarrez
vmmagent
sur chaque hôte Hyper‑V participant. - 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
- 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.
- 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.
- Vérifier le réseau logique : VM Network → IP Pool → VLAN. Un pool vide ou mal scindé (v4/v6) suffit à figer 1.7.
- 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.
- Rejouer avec scripts/GPO désactivés. Si le déploiement passe, introduisez les composants un à un.
Cartographie causes ↔ corrections
Symptôme | Indicateurs | Cause probable | Correctif |
---|---|---|---|
1.7 « Personnalisation » dépasse 60 min | Aucun log d’erreur VMM, setupact.log silencieux | VMM/agent hôte en défaut, cache | Redémarrage services VMM + agent host, rejouer |
Erreur de jonction domaine | setupact.log montre NetJoin 0x xxxxx | DNS/ACL/horloge, compte Join non autorisé | Corriger DNS, NTP, privilèges, tester Add-Computer en local |
OOBE demande une interaction | Console voit un écran bloquant | Unattend incomplet (HideEULA, etc.) | Compléter oobeSystem dans Unattend (voir modèle) |
BSOD au premier boot | EventID Kernel-Boot/Driver | Pilote tiers dans l’image | Nettoyer le VHDX, ne garder que composants Microsoft |
IP non attribuée | ipconfig montre APIPA | DHCP/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
etUserLocale
(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
Axe | Actions | Objectif |
---|---|---|
Prérequis SCVMM | Vérifier versions minimales, appliquer dernier UR, aligner console/serveur | Compatibilité totale 2022/SCVMM |
Template 2022 | VHDX généralisé, Guest OS Profile Windows Server 2022, pas d’Unattend obsolète | Injection sans conflit |
Services VMM | Redémarrer SCVMMService et vmmagent, purger les caches | Moteur de déploiement propre |
Logs | Jobs VMM, VMMLogs, Panther/UnattendGC | Isoler l’erreur exacte |
Intégration | MAJ services d’intégration, Secure Boot cohérent, SCSI | Matériel virtuel reconnu |
Scripts | Désactiver scripts, AV/EDR, GPO durant la validation | Écarter un blocage externe |
Réseau | VM Network/pool IP valides, DHCP ou IP statique accessible | Éviter time‑out réseau |
Timeout | Au besoin, ajuster prudemment VmmVmConfigUpdateTimeout | Autoriser 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.