Installation sans surveillance
Il est possible d'automatiser le processus d'installation de Windows à l'aide d'un fichier XML nommé "autounattend.xml" situé à la racine d'un lecteur accessible par WinPE au moment de l'installation. Celui-ci peut être sur une clé USB supplémentaire, sur un CD supplémentaire ou même sur le média d'installation lui-même. Ce fichier peut être préparé par l'application WSIM (Windows System Image Manager). Cette application peut être installée par la suite d'outils Windows ADK.
Processus d'installation de Windows
Le processus d'installation de Windows est composé de différentes "passes". Le fichier d'installation sans surveillance permet d'automatiser l'ensemble des passes incluant même une généralisation d'image (sysprep). Les passes communément exécutées lors d'une installation manuelle simple de Windows sont les passes windowsPE, specialize et oobeEnvironment.
WindowsPE
La phase WindowsPE est lorsque l'on démarre à partir d'un média d'installation de Windows. L'environnement qui nous est présenté se nomme WinPE (Windows Preinstallation Environment) et a pour rôle de formater le ou les disques sur lesquels Windows sera installé, y décompresser les fichier qui composent le système d'exploitation et installer un gestionnaire de démarrage, qu'il s'agisse de bootmgr (MBR) ou Windows Boot Manager (EFI).
Il est à noter ici que Powershell n'est pas accessible, toute action entreprise doit être effectuée avec les exécutables accessibles dans WinPE.
Specialize
La phase de spécialisation sert à la configuration initiale en arrière plan du système. Il s'agit du moment ou "Installation en cours" nous est présenté suite au redémarrage suivant la passe WindowsPE. Cette phase est utilisée pour appliquer des configurations en arrière plan avant la création des comptes d'utilisateur. C'est généralement ici que l'environnement sera personnalisé et que des applications seront déployées. Généralement, à cette étape, le média d'installation a pour lettre de lecteur "D" et le système a pour lettre de lecteur "C".
OOBEEnvironment
La passe "OOBEEnvironment" ou "Out-of-box Experience" représente le dernier redémarrage avant de pouvoir accéder au système. C'est ici que l'utilisateur est invité à se connecter à un réseau sans-fil, se connecter à son compte Microsoft, accepter les termes et conditions d'utilisation et configurer les options de son compte telles que la langue d'affichage, la disposition du clavier, les options de télémétrie, etc.
C'est dans cette passe de configuration que l'on peut automatiser de joindre une machine à un domaine Active Directory ou créer des comptes d'utilisateurs locaux en contournant la connexion à un compte Microsoft pour la configuration initiale du système.
OfflineServicing
La passe d'OfflineServicing est la deuxième passe suite à la passe de WindowsPE. Elle sert à appliquer automatiquement des modifications à un système déjà installé sans le démarrer.
Generalize
La passe de généralisation permet de sysprep un système déjà installé à partir du WindowsPE.
auditSystem / auditUser
Les passes d'auditSystem et auditUser permettent l'automatisation de tâches en vue d'un sysprep. Ces passes sont exécutées suite à la spécialisation du système et avant l'Out-of-box-experience. Elles sont généralement utilisées pour effectuer un "build and capture" automatique en prévision de la mise à jour d'un média d'installation personnalisé.
Exemple
Voici un exemple de fichier XML qui serait suffisant pour automatiser l'installation de Windows 11 24H2 de A à Z en mode de démarrage MBR/BIOS (pas EFI). À la fin de son exécution, un utilisateur local "Info" avec le mot de passe "info" serait créé.
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
<!-- Passe de configuration windowsPE -->
<settings pass="windowsPE">
<component name="Microsoft-Windows-International-Core-WinPE" 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">
<!-- Spécification de la langue d'affichage lors du processus d'installation -->
<SetupUILanguage>
<UILanguage>fr-CA</UILanguage>
</SetupUILanguage>
<InputLocale>0c0c:00001009</InputLocale>
<SystemLocale>fr-CA</SystemLocale>
<UILanguage>fr-CA</UILanguage>
<UserLocale>fr-CA</UserLocale>
</component>
<component name="Microsoft-Windows-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">
<!-- Spécification du stockage de destination pour l'installation du système -->
<ImageInstall>
<OSImage>
<InstallTo>
<DiskID>0</DiskID>
<PartitionID>2</PartitionID>
</InstallTo>
<WillShowUI>OnError</WillShowUI>
</OSImage>
</ImageInstall>
<RunSynchronous>
<!-- Contournement des pré-requis pour l'installation de Windows 11 -->
<RunSynchronousCommand wcm:action="add">
<Order>1</Order>
<Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassTPMCheck /t REG_DWORD /d 1 /f</Path>
<Description>Bypass TPM Check</Description>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassSecureBootCheck /t REG_DWORD /d 1 /f</Path>
<Order>2</Order>
<Description>Bypass SecureBoot Check</Description>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassRAMCheck /t REG_DWORD /d 1 /f</Path>
<Order>3</Order>
<Description>Bypass RAM Check</Description>
</RunSynchronousCommand>
<!-- Formatage du stockage en prévision de l'installation -->
<RunSynchronousCommand wcm:action="add">
<Order>4</Order>
<Path>cmd.exe /c ">>"X:\diskpart.txt" (echo SELECT DISK=0&echo CLEAN&echo CREATE PARTITION PRIMARY SIZE=100&echo FORMAT QUICK FS=NTFS LABEL="System Reserved"&echo ACTIVE&echo CREATE PARTITION PRIMARY)"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>5</Order>
<Path>cmd.exe /c ">>"X:\diskpart.txt" (echo FORMAT QUICK FS=NTFS LABEL="Windows")"</Path>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>6</Order>
<Path>cmd.exe /c "diskpart.exe /s "X:\diskpart.txt" >>"X:\diskpart.log" || ( type "X:\diskpart.log" & echo diskpart encountered an error. & pause & exit /b 1 )"</Path>
</RunSynchronousCommand>
</RunSynchronous>
<!-- Contournement de la clé de produit demandée -->
<UserData>
<ProductKey>
<Key></Key>
<WillShowUI>OnError</WillShowUI>
</ProductKey>
<AcceptEula>true</AcceptEula>
</UserData>
<!-- Configuration de la journalisation de l'installation -->
<LogPath>C:\Logs</LogPath>
<UseConfigurationSet>false</UseConfigurationSet>
</component>
</settings>
<!-- Passe de configuration de l'out-of-box experience -->
<settings pass="oobeSystem">
<!-- Configuration d'options régionales du système -->
<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>0c0c:00001009</InputLocale>
<SystemLocale>fr-CA</SystemLocale>
<UILanguage>fr-CA</UILanguage>
<UserLocale>fr-CA</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">
<!-- Configuration de la connexion automatique de l'utilisateur au démarrage -->
<AutoLogon>
<Password>
<Value>aQBuAGYAbwBQAGEAcwBzAHcAbwByAGQA</Value>
<PlainText>false</PlainText>
</Password>
<Username>info</Username>
<Enabled>true</Enabled>
</AutoLogon>
<!-- Masquer les fenêtres de licence et de compte Microsoft -->
<OOBE>
<HideEULAPage>true</HideEULAPage>
<HideLocalAccountScreen>true</HideLocalAccountScreen>
<HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
<HideOnlineAccountScreens>true</HideOnlineAccountScreens>
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
<SkipMachineOOBE>true</SkipMachineOOBE>
<SkipUserOOBE>true</SkipUserOOBE>
</OOBE>
<!-- Création du compte local info avec le mot de passe info -->
<UserAccounts>
<LocalAccounts>
<LocalAccount wcm:action="add">
<Password>
<Value>aQBuAGYAbwBQAGEAcwBzAHcAbwByAGQA</Value>
<PlainText>false</PlainText>
</Password>
<DisplayName>Info</DisplayName>
<Name>info</Name>
<Group>Administrators</Group>
</LocalAccount>
</LocalAccounts>
</UserAccounts>
</component>
</settings>
</unattend>
L'exemple de script suivant ferait la même chose pour un système UEFI avec une table de partition GUID (GPT)
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
<settings pass="windowsPE">
<component name="Microsoft-Windows-International-Core-WinPE" 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">
<SetupUILanguage>
<UILanguage>fr-CA</UILanguage>
</SetupUILanguage>
<InputLocale>0c0c:00001009</InputLocale>
<SystemLocale>fr-CA</SystemLocale>
<UILanguage>fr-CA</UILanguage>
<UserLocale>fr-CA</UserLocale>
</component>
<component name="Microsoft-Windows-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">
<DynamicUpdate>
<WillShowUI>Never</WillShowUI>
</DynamicUpdate>
<ImageInstall>
<OSImage>
<InstallTo>
<DiskID>0</DiskID>
<PartitionID>3</PartitionID>
</InstallTo>
<WillShowUI>OnError</WillShowUI>
</OSImage>
</ImageInstall>
<RunSynchronous>
<RunSynchronousCommand wcm:action="add">
<Order>1</Order>
<Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassTPMCheck /t REG_DWORD /d 1 /f</Path>
<Description>Bypass TPM Check</Description>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassSecureBootCheck /t REG_DWORD /d 1 /f</Path>
<Order>2</Order>
<Description>Bypass SecureBoot Check</Description>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassRAMCheck /t REG_DWORD /d 1 /f</Path>
<Order>3</Order>
<Description>Bypass RAM Check</Description>
</RunSynchronousCommand>
</RunSynchronous>
<UserData>
<ProductKey>
<Key></Key>
<WillShowUI>OnError</WillShowUI>
</ProductKey>
<AcceptEula>true</AcceptEula>
</UserData>
<LogPath>C:\Logs</LogPath>
<UseConfigurationSet>false</UseConfigurationSet>
<DiskConfiguration>
<Disk wcm:action="add">
<CreatePartitions>
<CreatePartition wcm:action="add">
<Order>1</Order>
<Size>100</Size>
<Type>EFI</Type>
</CreatePartition>
<CreatePartition wcm:action="add">
<Order>3</Order>
<Extend>true</Extend>
<Type>Primary</Type>
</CreatePartition>
<CreatePartition wcm:action="add">
<Order>2</Order>
<Size>4096</Size>
<Type>MSR</Type>
</CreatePartition>
</CreatePartitions>
<ModifyPartitions>
<ModifyPartition wcm:action="add">
<Format>FAT32</Format>
<Label>System</Label>
<Order>1</Order>
<PartitionID>1</PartitionID>
</ModifyPartition>
<ModifyPartition wcm:action="add">
<Order>2</Order>
<PartitionID>3</PartitionID>
<Label>Windows</Label>
<Format>NTFS</Format>
<Letter>C</Letter>
</ModifyPartition>
</ModifyPartitions>
<DiskID>0</DiskID>
<WillWipeDisk>true</WillWipeDisk>
</Disk>
</DiskConfiguration>
</component>
</settings>
<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>0c0c:00001009</InputLocale>
<SystemLocale>fr-CA</SystemLocale>
<UILanguage>fr-CA</UILanguage>
<UserLocale>fr-CA</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">
<AutoLogon>
<Password>
<Value>aQBuAGYAbwBQAGEAcwBzAHcAbwByAGQA</Value>
<PlainText>false</PlainText>
</Password>
<Username>info</Username>
<Enabled>true</Enabled>
</AutoLogon>
<OOBE>
<HideEULAPage>true</HideEULAPage>
<HideLocalAccountScreen>true</HideLocalAccountScreen>
<HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
<HideOnlineAccountScreens>true</HideOnlineAccountScreens>
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
<SkipMachineOOBE>true</SkipMachineOOBE>
<SkipUserOOBE>true</SkipUserOOBE>
</OOBE>
<UserAccounts>
<LocalAccounts>
<LocalAccount wcm:action="add">
<Password>
<Value>aQBuAGYAbwBQAGEAcwBzAHcAbwByAGQA</Value>
<PlainText>false</PlainText>
</Password>
<DisplayName>Info</DisplayName>
<Name>info</Name>
<Group>Administrators</Group>
</LocalAccount>
</LocalAccounts>
</UserAccounts>
<ConfigureChatAutoInstall>false</ConfigureChatAutoInstall>
</component>
</settings>
<cpi:offlineImage cpi:source="wim:d:/automatisation/lab-automatedsetup/install.wim#Windows 11 Pro" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
</unattend>
Exécution de script post-installation
Suite à l'installation avant l'affichage de l'écran de connexion ou la connexion du premier utilisateur, Windows cherche le script batch "SetupComplete.cmd" dans le dossier %WINDIR%\Setup\Scripts. Si vous devez effectuer certaines actions ne pouvant être effectuées lors du Specialize ou OOBESystem tel qu'installer un MSI, vous pourriez y ajouter ces actions. Les commandes suivantes au bon endroit permettraient de copier un dossier de scripts d'installation à cet endroit pour appliquer des actions du genre d'installer des applications.
<RunSynchronous>
<RunSynchronousCommand wcm:action="add">
<Order>1</Order>
<Path>powershell -c "New-Item -Type Directory -Path "$env:windir\Setup\Scripts" -Force"</Path>
<Description>Créer le dossier de post-installation</Description>
</RunSynchronousCommand>
<RunSynchronousCommand wcm:action="add">
<Order>2</Order>
<Path>powershell -c "Expand-Archive -Path D:\SetupScrips.zip -DestinationPath $env:WinDir\Setup\Scripts"</Path>
<Description>Placer les scripts dans le dossier de post-installation</Description>
</RunSynchronousCommand>
</RunSynchronous>

