aunt — Auto Unattend

aunt automatise l’installation de Windows avec AutoUnattend.xml et réduit la taille des images.

Dépendances

Utilisation

aunt -h affiche l’aide, aunt sans argument vérifie les dépendances puis affiche l’aide :

usage: aunt [-h] [-aimnqvy] [-e ED] [-k KEY] [-l LANG] [-p NAME] [-s SUF] ISO [FILE] ...

Auto Unattend 0.3

positional arguments:
  ISO                   Windows.iso to be automated
  FILE ...              include custom files and directories

optional arguments:
  -h, --help            show this help message and exit
  -a, --all             flags -mny
  -e ED, --edition ED   Core, CoreN, Professional... not -e: registry
  -i, --inplace         rewrite ISO
  -k KEY, --key KEY     auto-activate... not -k: limited features
  -l LANG, --lang LANG  en-US, fr-FR... not -l: lang.ini
  -m, --microsoft       no Microsoft account
  -n, --network         no network setup
  -p NAME, --pc NAME    computer name... not -p: PC
  -q, --quiet           no output
  -s SUF, --suffix SUF  append to ISO name... not -s: _
  -v, --verbose         detail actions in bash syntax
  -y, --yes             accept license

aunt Windows.iso réécrit le *.iso UDF amorçable et affiche les étapes :

extract Windows.iso to _tmp
query EditionID
read lang.ini
read boot.wim
reduce boot.wim
read install.esd
reduce install.esd
write AutoUnattend.xml
write Windows.iso
delete _tmp

aunt -v Windows.iso détaille les actions en syntaxe bash, les mots grep mv rm sont pratiques pour comprendre ce qui se passe, bien que ces actions soient écrites en Python pur :

find dependencies
  C:\Program Files\7-Zip\7z.exe
  C:\Windows\System32\dism.exe
  C:\Program Files\Quix0\oscdimg.exe

extract Windows.iso to _tmp
  7z x -y -o_tmp Windows.iso bootmgr{,.efi} boot\{bcd,bood.sdi,bootfix.bin,etfsboot.com} efi\microsoft\boot\{bcd,efisys.bin} sources\{boot.wim,compres.dll,install.esd,lang.ini,setup.exe}

query EditionID
  reg query 'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion' /v EditionID
  = Core

read lang.ini
  grep -Eom1 '^([a-z]{2}-[a-zA-Z]{2}) ' lang.ini
  = fr-fr

read boot.wim
  dism /Get-WimInfo /WimFile:boot.wim

reduce boot.wim
  dism /Export-Image /SourceImageFile:boot.wim /SourceIndex:2 /DestinationImageFile:boot.wim_
  mv boot.wim_ boot.wim

read install.esd
  dism /Get-WimInfo /WimFile:install.esd

reduce install.esd
  dism /Export-Image /SourceImageFile:install.esd /SourceIndex:1 /DestinationImageFile:install.esd_
  mv install.esd_ install.esd

write AutoUnattend.xml

write Windows_.iso
  oscdimg -u2 -bootdata:2#p0,e,b_tmp\boot\etfsboot.com#pEF,e,b_tmp\efi\microsoft\boot\efisys.bin _tmp Windows_.iso

delete _tmp
  rm -r _tmp

Les commandes dism ci-dessus suppriment toutes les éditions de Windows autres que celle choisie par l’option -e. Sans -e suppose que l’édition désirée est la même que EditionID de l’hôte.

Il est possible d’inclure des fichiers et dossiers personnels dans l’ISO:

aunt Windows.iso ExecTI.exe python-3.7.2-amd64.exe

-a équivaut à -mny, ce qui génère un AutoUnattend.xml comme ci-dessous :

<?xml encoding="utf-8"?>
<unattend>
    <settings pass="WindowsPE">
        <component name="Microsoft-Windows-International-Core-WinPE" ...>
            <UILanguage>fr-fr</UILanguage>
        </component>
        <component name="Microsoft-Windows-Setup" ...>
            <ImageInstall>
                <OSImage>
                    <InstallFrom>
                        <MetaData>
                            <Key>/IMAGE/INDEX</Key>
                            <Value>1</Value>
                        </MetaData>
                    </InstallFrom>
                </OSImage>
            </ImageInstall>
            <UserData>
                <ProductKey>
                    <Key></Key>
                </ProductKey>
                <AcceptEula>true</AcceptEula>
            </UserData>
        </component>
    </settings>
    <settings pass="specialize">
        <component name="Microsoft-Windows-Shell-Setup" ...>
            <ComputerName>PC</ComputerName>
        </component>
    </settings>
    <settings pass="OOBESystem">
        <component name="Microsoft-Windows-International-Core" ...>
            <SystemLocale>fr-fr</SystemLocale>
        </component>
        <component name="Microsoft-Windows-Shell-Setup" ...>
            <OOBE>
                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
                <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
            </OOBE>
        </component>
    </settings>
</unattend>

État de sortie :

0: succès 1: fichier manquant 2: édition manquante dans le fichier d’image

Écrans

Écran caché, --lang ou lang.ini définit la langue :

_images/00.png

Écran caché :

_images/01.png

Écran caché, --key définit la clé d’activation sinon continue sans clé :

_images/10.png

Écran caché, --edition ou EditionID de l’hôte définit l’édition de Windows :

_images/11.png

--yes accepte la licence et cache cet écran :

_images/12.png

Écran caché, choisit l’installation « Personnalisée » :

_images/13.png

Affiché :

_images/14.png _images/15.png

3 écrans cachés, --lang ou lang.ini définit la langue :

_images/20.png _images/21.png _images/22.png

--network cache ces 2 écrans :

_images/23.png _images/24.png

--microsoft cache ces 2 écrans :

_images/25.png _images/26.png

Affiché :

_images/27.png _images/28.png _images/30.png _images/31.png _images/32.png _images/33.png _images/34.png _images/35.png _images/36.png _images/37.png _images/38.png

Écrire HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableFirstLogonAnimation = 0 dans install.esd est le seul moyen de cacher cette animation, <FirstLogonCommands> s’exécute trop tard :

_images/40.png

Tests

💿 Français x64 💿 Anglais x64 — Famille Pro Éducation [1]VirtualBox 6 — VMware 15 :

1809: 13 novembre 2018 — Redstone 5
[1] L’édition Éducation est l’édition Entreprise sans support à long terme

Versions

0.3: 10 mars 2019 — Inclure fichiers personnels, options -i et -s
0.2: 20 février 2019 — Première version bêta, UEFI
0.1: 16 février 2019 — Première version alpha