Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

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 :

FichierQuandCe qu'il automatise
autounattend.xmlInstallation 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.xmlPremier démarrage d'une image généralisée par SysprepLa 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.

PasseQuand elle s'exécuteExemples de réglages
windowsPEAu début d'une installation depuis le média, dans Windows PELangue de l'installation, partitions du disque, image à installer, clé de produit
offlineServicingQuand l'image est appliquée sur le disque, avant son premier démarragePilotes et mises à jour ajoutés hors ligne
generalizePendant sysprep /generalizeConserver les pilotes (PersistAllDeviceInstalls), commandes avant la généralisation
specializeAu premier démarrage du poste, après la détection du matérielNom de l'ordinateur, fuseau horaire, jonction au domaine, réseau, commandes
auditSystem, auditUserSeulement si le poste démarre en mode auditPersonnalisation du master, tests
oobeSystemJuste 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.

Installation depuis le média (autounattend.xml)windowsPElangue, disque,éditionofflineServicingpilotes et misesà jour hors ligneMaster généralisé (unattend.xml)auditSystemauditUsermode auditgeneralizesysprep, puiscapture, déploiementpremier démarragespecializenom, fuseau,jonction au domaineoobeSystemlangue, comptes,écrans masquésécran de connexionspecialize et oobeSystem servent dans les deux cas :ce sont les passes d'un unattend.xml de master.
Les passes de configuration : specialize et oobeSystem servent dans tous les cas

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 :

OrdreEmplacementNom attendu
1La clé de registre HKLM\System\Setup\UnattendFileLibre
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'installationNe pas y toucher
4 et 5La racine des supports amovibles, en lecture-écriture puis en lecture seuleAutounattend.xml
6Le 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 8La 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é :
bat
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.

  1. Copie le fichier install.wim du média de Windows 11 (dossier sources) dans un dossier de travail. Si ton média contient un install.esd, convertis-le d'abord en WIM avec dism /Export-Image.
  2. Dans Windows SIM, File > Select Windows Image, choisis install.wim puis l'édition (Windows 11 Pro). Windows SIM propose de créer un catalogue (.clg) : accepte, l'opération prend quelques minutes.
  3. File > New Answer File. Le volet de gauche liste les composants (Microsoft-Windows-Shell-Setup, Microsoft-Windows-UnattendedJoin…).
  4. 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.
  5. Tools > Validate Answer File : les erreurs (réglage dans une mauvaise passe, valeur invalide) s'affichent en bas.
  6. 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
<?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 :

  1. Un compte de jonction aux droits minimaux. svc-jonction n'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 OU Postes-fixes et Portables. 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.
  2. 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.
  3. 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 :
bat
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 :

ConventionExempleAvantagesLimites
Type, site, numéro d'inventairePC-LYO-0142Lien direct avec l'étiquette et GLPI, le nom ne change pas avec l'utilisateurIl faut tenir la numérotation
Numéro de sériePF3K9XQ2Unique, lu automatiquement par un scriptPeu parlant pour un humain
Service et utilisateurCOMPTA-JLEFEVREParlantÀ 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.

xml
<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
  1. processorArchitecture="x86" sur le composant Microsoft-Windows-Shell-Setup : Windows 11 est en 64 bits, l'architecture doit être amd64. Tout le composant est ignoré, d'où le nom aléatoire et le mauvais fuseau horaire.
  2. ComputerName trop long : SORBIER-COMPTA-PC07 fait 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.
  3. TimeZone invalide : l'identifiant de Paris est Romance Standard Time, pas Paris.
  4. MachineObjectOU dans la passe oobeSystem : ce réglage n'est valide que dans specialize, où se fait la jonction. Il est ignoré, d'où le poste dans Computers. Il faut le déplacer dans le composant UnattendedJoin de la passe specialize.

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.

  1. Quel est le mot de passe ?
  2. Que dois-tu en conclure, et que proposes-tu ?
Voir la réponseMasquer la réponse de l'exercice 3
  1. Décodée en Base64 puis lue en UTF-16, la valeur donne sorbierPassword. Windows SIM ajoute le mot Password à la fin : le mot de passe est sorbier. En PowerShell : [Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('cwBvAHIAYgBpAGUAcgBQAGEAcwBzAHcAbwByAGQA')).
  2. 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é ?

Chapitre terminé !

Fais les 3 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Démarrage PXE et WDS : déployer par le réseauRevoir le sommaire du cours