Chapitre 319 minIntermédiaire
Fichier de réponses unattend.xml
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- nommer les passes de configuration et dire quand chacune s'exécute ;
- distinguer autounattend.xml et unattend.xml, et savoir où Windows les cherche ;
- lire un fichier de réponses et y repérer les erreurs ;
- joindre un poste au domaine pendant l'installation sans exposer de secret.
3 exercices corrigés1 schéma
Un fichier de réponses est un fichier XML qui répond à l'avance aux questions de l'installation de Windows : langue, partitionnement, nom du poste, domaine, comptes, écrans de l'assistant. Il s'appelle autounattend.xml quand il pilote une installation depuis le média, et unattend.xml quand il accompagne une image généralisée par Sysprep. Ce chapitre explique comment Windows le lit, détaille un fichier complet pour les postes de Sorbier et montre comment ne pas y laisser traîner de secrets.
À quoi sert un fichier de réponses
Sans fichier de réponses, chaque poste déployé s'arrête sur l'assistant de première configuration : choix du pays et du clavier, contrat de licence, réseau, compte. Un technicien doit cliquer, poste par poste, puis joindre le domaine à la main. Avec un fichier de réponses, le poste déployé se configure seul et termine sur l'écran de connexion du domaine, prêt pour l'utilisateur.
Le même mécanisme sert à deux moments :
| Fichier | Quand | Ce qu'il automatise |
|---|---|---|
autounattend.xml | Installation depuis le média de Windows (clé USB, ISO, partage réseau) | Tout : langue de l'installation, partitionnement du disque, choix de l'édition, puis la personnalisation |
unattend.xml | Premier démarrage d'une image généralisée par Sysprep | La personnalisation du poste : nom, domaine, fuseau horaire, langue, comptes, écrans de l'OOBE |
Les passes de configuration
L'installation de Windows se déroule en étapes appelées passes de configuration. Chaque réglage du fichier de réponses est rangé dans la passe où il doit s'appliquer : un réglage placé dans une autre passe est ignoré, ou provoque une erreur de validation.
| Passe | Quand elle s'exécute | Exemples de réglages |
|---|---|---|
windowsPE | Au début d'une installation depuis le média, dans Windows PE | Langue de l'installation, partitions du disque, image à installer, clé de produit |
offlineServicing | Quand l'image est appliquée sur le disque, avant son premier démarrage | Pilotes et mises à jour ajoutés hors ligne |
generalize | Pendant sysprep /generalize | Conserver les pilotes (PersistAllDeviceInstalls), commandes avant la généralisation |
specialize | Au premier démarrage du poste, après la détection du matériel | Nom de l'ordinateur, fuseau horaire, jonction au domaine, réseau, commandes |
auditSystem, auditUser | Seulement si le poste démarre en mode audit | Personnalisation du master, tests |
oobeSystem | Juste avant l'assistant de première configuration (OOBE) | Langue, clavier, écrans masqués, comptes locaux, ouverture de session automatique |
Pour une image généralisée, les passes utiles sont surtout specialize et oobeSystem. Pour un autounattend.xml, on ajoute windowsPE.
Où Windows cherche le fichier
Windows cherche un fichier de réponses au début de chaque passe, dans un ordre précis. Les emplacements à connaître :
| Ordre | Emplacement | Nom attendu |
|---|---|---|
| 1 | La clé de registre HKLM\System\Setup\UnattendFile | Libre |
| 2 | %WINDIR%\Panther\Unattend (seulement si l'installation ne part pas de Windows PE) | Unattend.xml ou Autounattend.xml |
| 3 | %WINDIR%\Panther, où Windows met en cache le fichier en cours d'installation | Ne pas y toucher |
| 4 et 5 | La racine des supports amovibles, en lecture-écriture puis en lecture seule | Autounattend.xml |
| 6 | Le dossier \Sources du média (passes windowsPE et offlineServicing), ou %WINDIR%\System32\Sysprep (autres passes) | Autounattend.xml, ou Unattend.xml dans le dossier de Sysprep |
| 7 et 8 | La racine du lecteur système, puis celle du lecteur d'où setup.exe est lancé | Unattend.xml ou Autounattend.xml |
Deux usages en découlent :
- Installation depuis une clé USB : on copie
Autounattend.xmlà la racine de la clé (ou d'une seconde clé). L'installation le trouve seule. - Image généralisée : on donne le fichier explicitement à Sysprep, ce qui évite toute ambiguïté :
C:\Windows\System32\Sysprep\sysprep.exe /generalize /oobe /shutdown /unattend:C:\Windows\System32\Sysprep\unattend.xml
Le fichier est alors mis en cache dans %WINDIR%\Panther et relu au premier démarrage du poste déployé, pour les passes specialize et oobeSystem.
Créer le fichier avec Windows SIM
On peut écrire le fichier à la main, mais l'outil prévu est Windows System Image Manager (Windows SIM), installé avec les outils de déploiement du Windows ADK. Il connaît tous les composants et réglages de la version de Windows ciblée, et il valide le fichier.
- Copie le fichier
install.wimdu média de Windows 11 (dossiersources) dans un dossier de travail. Si ton média contient uninstall.esd, convertis-le d'abord en WIM avecdism /Export-Image. - Dans Windows SIM, File > Select Windows Image, choisis
install.wimpuis l'édition (Windows 11 Pro). Windows SIM propose de créer un catalogue (.clg) : accepte, l'opération prend quelques minutes. - File > New Answer File. Le volet de gauche liste les composants (
Microsoft-Windows-Shell-Setup,Microsoft-Windows-UnattendedJoin…). - Clic droit sur un composant, Add Setting to Pass 4 specialize (ou à la passe voulue), puis renseigne les valeurs dans le volet des propriétés.
- Tools > Validate Answer File : les erreurs (réglage dans une mauvaise passe, valeur invalide) s'affichent en bas.
- File > Save Answer File As
unattend.xml.
Des générateurs en ligne produisent aussi des fichiers de réponses complets. Ils dépannent, mais relis chaque ligne : un fichier de réponses s'exécute avec tous les droits, et tu dois savoir expliquer chacun de ses réglages.
Le fichier unattend.xml des postes de Sorbier
Voici le fichier que Sorbier donne à Sysprep pour son master. Il ne contient que les passes specialize et oobeSystem : l'image est déjà installée, il reste à la personnaliser sur chaque poste.
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
<!-- Passe specialize : au premier démarrage du poste déployé -->
<settings pass="specialize">
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- * : Windows tire un nom au hasard ; FOG ou un script le renomme ensuite -->
<ComputerName>*</ComputerName>
<TimeZone>Romance Standard Time</TimeZone>
</component>
<component name="Microsoft-Windows-UnattendedJoin" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Identification>
<Credentials>
<Domain>ad.sorbier.example</Domain>
<Username>svc-jonction</Username>
<Password>MotDePasseDuCompteDeJonction</Password>
</Credentials>
<JoinDomain>ad.sorbier.example</JoinDomain>
<MachineObjectOU>OU=Postes-fixes,OU=Ordinateurs,OU=Sorbier,DC=ad,DC=sorbier,DC=example</MachineObjectOU>
</Identification>
</component>
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RunSynchronous>
<RunSynchronousCommand wcm:action="add">
<Order>1</Order>
<Description>Dossier des journaux de déploiement</Description>
<Path>cmd /c mkdir C:\Sorbier\Logs</Path>
</RunSynchronousCommand>
</RunSynchronous>
</component>
</settings>
<!-- Passe oobeSystem : juste avant l'assistant de première configuration -->
<settings pass="oobeSystem">
<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<InputLocale>040c:0000040c</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" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<OOBE>
<HideEULAPage>true</HideEULAPage>
<HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
<HideOnlineAccountScreens>true</HideOnlineAccountScreens>
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
<ProtectYourPC>3</ProtectYourPC>
</OOBE>
<UserAccounts>
<LocalAccounts>
<LocalAccount wcm:action="add">
<Name>adminsorbier</Name>
<Group>Administrators</Group>
<Password>
<Value>RQB4AGUAbQBwAGwAZQAtAGEALQBjAGgAYQBuAGcAZQByACEAMgAwADIANgBQAGEAcwBzAHcAbwByAGQA</Value>
<PlainText>false</PlainText>
</Password>
</LocalAccount>
</LocalAccounts>
</UserAccounts>
</component>
</settings>
</unattend>
Ce que fait chaque bloc :
L'en-tête des composants. Chaque <component> porte le nom du composant de Windows qu'il règle et des attributs fixes : l'architecture (amd64 pour un Windows 64 bits sur processeur x86 ; arm64 pour un PC à processeur ARM), la clé publique de Microsoft, language="neutral". Une erreur d'architecture et tout le composant est ignoré : c'est une cause fréquente de « mon fichier ne fait rien ».
ComputerName. Le nom NetBIOS du poste, 15 caractères au maximum, sans espace. L'étoile * demande un nom aléatoire (du type DESKTOP-7Q2K1RF). Un nom fixe n'a pas de sens dans un fichier partagé par vingt postes : soit l'outil de déploiement renomme le poste (FOG le fait, chapitre 5), soit on génère un fichier par poste, soit un script renomme le poste d'après son numéro de série.
TimeZone. L'identifiant Windows du fuseau horaire de Paris est Romance Standard Time (la commande tzutil /l affiche la liste).
Microsoft-Windows-UnattendedJoin. La jonction au domaine pendant la passe specialize : le domaine, le compte qui a le droit de joindre des machines, et l'OU où créer le compte d'ordinateur (MachineObjectOU, en notation LDAP). Sans MachineObjectOU, le compte arrive dans le conteneur Computers, où aucune GPO d'OU ne l'atteint (cours Windows Server).
RunSynchronous. Des commandes lancées dans l'ordre, sous le compte système, pendant specialize. Ici, un simple dossier pour les journaux des scripts de post-installation.
InputLocale et les paramètres régionaux. 040c:0000040c est le clavier AZERTY français ; fr-FR règle la langue de l'interface (elle doit être installée dans l'image), les formats de date et de nombres.
OOBE. Masque les écrans de l'assistant : contrat de licence, enregistrement du fabricant, création d'un compte Microsoft, choix du Wi-Fi. ProtectYourPC à 3 ne valide pas les réglages de confidentialité recommandés par Microsoft (les réglages de diagnostic seront imposés par GPO). Les anciens réglages SkipMachineOOBE et SkipUserOOBE sont dépréciés : ne les utilise plus.
LocalAccounts. Crée un compte administrateur local, adminsorbier, dans le groupe Administrators. Le nom du groupe s'écrit en anglais, même sur un Windows français : le composant le traduit lui-même. Ce compte sert au dépannage si le poste perd sa relation avec le domaine ; son mot de passe est ensuite changé et géré par Windows LAPS, différent sur chaque poste, sauvegardé dans l'annuaire.
Ne pas laisser de secrets dans le fichier
Le fichier de Sorbier contient en clair le mot de passe de svc-jonction : le réglage Credentials/Password n'a même pas d'option d'encodage. Or ce fichier est dans le master, donc sur chaque poste déployé. Windows efface les données sensibles de la copie en cache dans %WINDIR%\Panther à la fin de chaque passe, mais pas le fichier d'origine que tu as laissé dans le dossier de Sysprep. Les parades :
- Un compte de jonction aux droits minimaux.
svc-jonctionn'est membre d'aucun groupe d'administration. Il a seulement reçu, par délégation, le droit de créer et supprimer des objets ordinateur dans les OUPostes-fixesetPortables. Si son mot de passe fuit, l'attaquant peut créer des comptes d'ordinateur dans ces OU, pas administrer le domaine. On change son mot de passe après chaque campagne de déploiement. - Supprimer le fichier après usage, par le script de post-installation ou un script de démarrage. Attention : le script
SetupComplete.cmd(dans%WINDIR%\Setup\Scripts), souvent cité pour ce ménage, ne s'exécute pas quand Windows est activé par une clé OEM, sauf sur les éditions Entreprise. Les postes Professionnel de Sorbier, activés par la clé du fabricant, ne l'exécuteraient pas. - Ne pas mettre la jonction dans le fichier du tout : laisser l'outil de déploiement joindre le poste (le client FOG le fait avec un compte dont le mot de passe est stocké chiffré sur le serveur ; c'est le choix final de Sorbier), ou préparer une jonction hors ligne. Avec
djoin.exe /provision, un administrateur crée à l'avance le compte d'ordinateur et obtient un fichier de provisionnement, sans mot de passe d'utilisateur, que le poste applique pour rejoindre le domaine :
rem Sur un poste d'administration du domaine : crée le compte PC-LYO-0142 et son fichier de provisionnement
djoin.exe /provision /domain ad.sorbier.example /machine PC-LYO-0142 /machineou "OU=Postes-fixes,OU=Ordinateurs,OU=Sorbier,DC=ad,DC=sorbier,DC=example" /savefile C:\Temp\PC-LYO-0142.txt
rem Sur le poste, en administrateur : applique le fichier, puis redémarrer
djoin.exe /requestODJ /loadfile C:\Temp\PC-LYO-0142.txt /windowspath %SystemRoot% /localos
Nommer les postes
Le nom d'un poste se voit partout : dans l'annuaire, l'inventaire, les journaux, les tickets. Une convention claire évite bien des erreurs :
| Convention | Exemple | Avantages | Limites |
|---|---|---|---|
| Type, site, numéro d'inventaire | PC-LYO-0142 | Lien direct avec l'étiquette et GLPI, le nom ne change pas avec l'utilisateur | Il faut tenir la numérotation |
| Numéro de série | PF3K9XQ2 | Unique, lu automatiquement par un script | Peu parlant pour un humain |
| Service et utilisateur | COMPTA-JLEFEVRE | Parlant | À changer à chaque mutation, et révèle des informations utiles à un attaquant |
Sorbier retient PC-LYO- suivi du numéro d'inventaire à quatre chiffres. Le nom fait 11 caractères, sous la limite de 15. Le cours Poste de travail détaille l'étiquetage et la fiche d'inventaire.
Exercices
Exercice 1 sur 3 Lire un unattend.xml Réussi À revoir
Un stagiaire a écrit ce fichier pour les postes de la comptabilité. Le poste déployé reste dans le conteneur Computers, garde un nom aléatoire et n'est pas à l'heure de Paris. Lis-le et trouve quatre erreurs.
<settings pass="specialize">
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<ComputerName>SORBIER-COMPTA-PC07</ComputerName>
<TimeZone>Paris</TimeZone>
</component>
<component name="Microsoft-Windows-UnattendedJoin" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<Identification>
<Credentials>
<Domain>ad.sorbier.example</Domain>
<Username>Administrateur</Username>
<Password>P@ssw0rd</Password>
</Credentials>
<JoinDomain>ad.sorbier.example</JoinDomain>
</Identification>
</component>
</settings>
<settings pass="oobeSystem">
<component name="Microsoft-Windows-UnattendedJoin" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<Identification>
<MachineObjectOU>OU=Postes-fixes,OU=Ordinateurs,OU=Sorbier,DC=ad,DC=sorbier,DC=example</MachineObjectOU>
</Identification>
</component>
</settings>
Voir la réponseMasquer la réponse de l'exercice 1
processorArchitecture="x86"sur le composantMicrosoft-Windows-Shell-Setup: Windows 11 est en 64 bits, l'architecture doit êtreamd64. Tout le composant est ignoré, d'où le nom aléatoire et le mauvais fuseau horaire.ComputerNametrop long :SORBIER-COMPTA-PC07fait 19 caractères, la limite est de 15. Même avec la bonne architecture, ce nom serait refusé. Et un nom fixe dans un fichier commun donnerait le même nom à tous les postes.TimeZoneinvalide : l'identifiant de Paris estRomance Standard Time, pasParis.MachineObjectOUdans la passeoobeSystem: ce réglage n'est valide que dansspecialize, où se fait la jonction. Il est ignoré, d'où le poste dansComputers. Il faut le déplacer dans le composantUnattendedJoinde la passespecialize.
Erreur de sécurité en plus : le compte Administrateur du domaine et son mot de passe sont en clair dans un fichier copié sur chaque poste. Il faut un compte dédié comme svc-jonction, qui n'a que le droit de créer des objets ordinateur dans les OU des postes.
Tu avais trouvé ?
Exercice 2 sur 3 Ranger les réglages dans les passes Réussi À revoir
Dans quelle passe places-tu chaque réglage ? (a) le partitionnement du disque avant l'installation ; (b) la jonction au domaine ; (c) le clavier AZERTY ; (d) masquer l'écran du compte Microsoft ; (e) le nom de l'ordinateur ; (f) conserver les pilotes pendant la généralisation, pour des postes identiques.
Voir la réponseMasquer la réponse de l'exercice 2
(a) windowsPE, seulement dans un autounattend.xml d'installation depuis le média. (b) specialize. (c) oobeSystem (composant Microsoft-Windows-International-Core) ; il existe aussi un composant Microsoft-Windows-International-Core-WinPE pour le clavier de l'installation elle-même, en windowsPE. (d) oobeSystem (HideOnlineAccountScreens). (e) specialize (ComputerName). (f) generalize (composant Microsoft-Windows-PnpSysprep, réglage PersistAllDeviceInstalls à true).
Tu avais trouvé ?
Exercice 3 sur 3 Décoder un mot de passe « masqué » Réussi À revoir
Dans un fichier de réponses trouvé sur un poste, tu lis <Value>cwBvAHIAYgBpAGUAcgBQAGEAcwBzAHcAbwByAGQA</Value> et <PlainText>false</PlainText> pour un compte local.
- Quel est le mot de passe ?
- Que dois-tu en conclure, et que proposes-tu ?
Voir la réponseMasquer la réponse de l'exercice 3
- Décodée en Base64 puis lue en UTF-16, la valeur donne
sorbierPassword. Windows SIM ajoute le motPasswordà la fin : le mot de passe estsorbier. En PowerShell :[Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('cwBvAHIAYgBpAGUAcgBQAGEAcwBzAHcAbwByAGQA')). - L'encodage n'est pas un chiffrement : toute personne qui lit le fichier connaît le mot de passe administrateur local de tous les postes déployés avec ce fichier. C'est aussi un mot de passe très faible. Il faut supprimer le fichier des postes, activer Windows LAPS pour que chaque poste ait un mot de passe administrateur local unique, changé régulièrement et stocké dans l'annuaire, et signaler l'incident au responsable.
Tu avais trouvé ?