Poste admin Windows 11 — clé USB unattended
Étape zéro de la reconstruction. On part d’un poste d’admin neuf ou wipé. À la fin de cette fiche : Windows 11 Pro fr-FR installé, compte
sachacréé, WinRM + RDP + Chocolatey + outillage de base présents. Ensuite :01-prerequis-contextepour mise/task/ansible/sops.
Contexte
Pourquoi automatiser ? Reconstruction DR (Disaster Recovery) doit être reproductible et rapide. Un flash de clé + 15 min de boot UEFI = poste admin opérationnel, sans clic dans Setup Windows.
Le fichier autounattend.xml + le script PowerShell vivent dans
infra/bare-metal/win11/. Le script construit la clé USB depuis un host
Windows existant (pas besoin de Linux). Idempotent : on peut reflasher
autant qu’on veut.
Hypothèses :
- Tu disposes d’un host Windows existant (pour flasher la clé)
- Tu disposes d’une clé USB ≥ 16 GB (sera entièrement effacée)
- Tu disposes d’une ISO Windows 11 24H2 fr-FR
taskn’est pas requis — un appel PowerShell direct est documenté
Récupérer le repo minfra-v2
Cloner le repo sur le host flasheur pour accéder à autounattend.xml +
script. PowerShell, pas WSL.
# === Windows (PowerShell) ===
# Git portable si pas encore installé (cf. 01-prerequis)
winget install --id Git.Git -e --source winget --silent
git clone https://github.com/sminard38/minfra-v2.git D:\git\minfra-v2
cd D:\git\minfra-v2\infra\bare-metal\win11
Verify: Test-Path D:\git\minfra-v2\infra\bare-metal\win11\autounattend.xml
Télécharger ISO Windows 11
ISO officielle Microsoft. Vérifier en-US (English International) + x64. Le clavier FR azerty est appliqué par autounattend.xml indépendamment de la langue de l’ISO.
# Ouvre la page officielle (saisir région + édition)
Start-Process "https://www.microsoft.com/software-download/windows11"
# Sauvegarder sous : D:\iso\Win11_24H2_English_x64.iso
Verify: Test-Path D:\iso\Win11_24H2_English_x64.iso Verify: (Get-Item D:\iso\Win11_24H2_English_x64.iso).Length -gt 5GB
Identifier la clé USB
Brancher la clé USB sur le host flasheur. Lister disques pour repérer le numéro. Attention au mauvais disque : la commande de flash wipe TOUT.
Get-Disk | Format-Table Number, FriendlyName, @{N='Size(GB)';E={[math]::Round($_.Size/1GB,1)}}, BusType, PartitionStyle -AutoSize
Repérer la ligne BusType=USB + taille cohérente. Noter Number (ex : 2).
Verify: (Get-Disk | Where-Object BusType -eq ‘USB’).Count -ge 1
Préparer / formater la clé USB
Sanity check avant flash : retirer toute protection lecture seule, wiper
partitions résiduelles, vérifier que le disque est bien accessible en
écriture. Le script Build-Win11Usb.ps1 refait ce nettoyage, mais le
faire ici permet de détecter les problèmes tôt (clé write-protected,
disque verrouillé par antivirus, etc.).
⚠ Adapter $DiskNumber au numéro repéré à l’étape précédente. Cette
commande efface TOUT le contenu de la clé.
# PowerShell admin — sélection + wipe en un bloc
$d = @(Get-Disk | Where-Object { $_.BusType -eq 'USB' -or $_.MediaType -eq 'Removable Media' })
if (-not $d) { Write-Host "❌ Aucun disque amovible. Brancher la clé." -ForegroundColor Red; return }
$d | Format-Table Number, FriendlyName, @{N='GB';E={[math]::Round($_.Size/1GB,1)}}, BusType, PartitionStyle -AutoSize
$t = if ($d.Count -eq 1) { $d[0] } else { $d | Where-Object Number -eq [int](Read-Host "Numéro") }
if (-not $t -or (Read-Host "⚠ Wipe $($t.Number) ($($t.FriendlyName), $([math]::Round($t.Size/1GB,1)) GB) ? Taper WIPE") -ne 'WIPE') { return }
Set-Disk -Number $t.Number -IsReadOnly $false -ErrorAction SilentlyContinue
Set-Disk -Number $t.Number -IsOffline $false -ErrorAction SilentlyContinue
Clear-Disk -Number $t.Number -RemoveData -RemoveOEM -Confirm:$false
if ((Get-Disk -Number $t.Number).PartitionStyle -eq 'RAW') {
Initialize-Disk -Number $t.Number -PartitionStyle GPT
} else {
Set-Disk -Number $t.Number -PartitionStyle GPT -ErrorAction SilentlyContinue
}
$Global:DiskNumber = $t.Number
Write-Host "✓ Disque $($t.Number) prêt (GPT vide, sans partition). `$DiskNumber = $($t.Number)" -ForegroundColor Green
Write-Host " Pas de lettre Explorer = normal. Build-Win11Usb.ps1 va créer les partitions." -ForegroundColor DarkGray
Verify: (Get-Disk -Number 2).PartitionStyle -eq ‘GPT’ Verify: (Get-Disk -Number 2).IsReadOnly -eq $false Verify: (Get-Partition -DiskNumber 2 -ErrorAction SilentlyContinue).Count -eq 0
Valider autounattend.xml
XML doit être well-formed avant flash. Erreur = boot bloque sur écran Setup.
cd D:\git\minfra-v2\infra\bare-metal\win11
[xml](Get-Content .\autounattend.xml) | Out-Null
Write-Host "XML OK" -ForegroundColor Green
Verify: powershell -Command “[xml](Get-Content D:\git\minfra-v2\infra\bare-metal\win11\autounattend.xml) | Out-Null”
Personnaliser autounattend.xml (optionnel)
Éditer si besoin avant flash. Valeurs par défaut :
| Param | Valeur | Balise XML |
|---|---|---|
| UI Windows | en-US (anglais) | <UILanguage> / <SystemLocale> |
| Formats régionaux | fr-FR (dates, monnaie EU) | <UserLocale> |
| Clavier | FR azerty (040C:0000040C) | <InputLocale> |
| Timezone | Romance Standard Time (Paris) | <TimeZone> |
| Utilisateur | sacha | <Name> + <RegisteredOwner> |
| Mdp initial | ChangeMe!2026 | <Password><Value> |
| Hostname | WIN11 | <ComputerName> |
| Workgroup | WORKGROUP | <JoinWorkgroup> |
| Édition | Windows 11 Pro | <MetaData> (clé générique W269N-…) |
| Post-install | git, openssh, mise, task, bw, age | <FirstLogonCommands> |
Édition directe via notepad ou VSCode :
notepad D:\git\minfra-v2\infra\bare-metal\win11\autounattend.xml
Verify: Select-String -Path D:\git\minfra-v2\infra\bare-metal\win11\autounattend.xml -Pattern '
'
Flasher la clé USB (méthode standard, sans task)
Méthode par défaut quand on reconstruit de zéro : appel direct du
script PowerShell. Pas besoin de task installé sur le host flasheur.
⚠ DESTRUCTIF : le disque cible est wipé. Le script demande de taper
WIPE pour confirmer.
# PowerShell admin
cd D:\git\minfra-v2\infra\bare-metal\win11
.\scripts\Build-Win11Usb.ps1 -IsoPath "D:\iso\Win11_24H2_English_x64.iso" -DiskNumber 2
Adapter -DiskNumber au numéro repéré plus haut. Le script :
- Wipe disque cible + partitionne GPT
- Crée FAT32 boot 1 GB + NTFS data
- Monte ISO + copie fichiers
- Split
install.wim(>4 GB) en.swmvia DISM si nécessaire - Dépose
autounattend.xmlà la racine de la partition FAT32
Verify: (Get-Volume | Where-Object FileSystemLabel -eq ‘WIN11_BOOT’).Count -eq 1 Verify: Test-Path ”$((Get-Volume | Where-Object FileSystemLabel -eq ‘WIN11_BOOT’).DriveLetter):\autounattend.xml”
Flasher via Taskfile (alternative, si task installé) {os:windows}
Raccourci une fois task présent (cf. 01-prerequis-contexte). Strictement
équivalent à l’appel direct ci-dessus.
⚠ Piège Smart App Control : si Task installé via winget install Task.Task,
Windows peut bloquer le binaire (Une stratégie de contrôle d'application a bloqué ce fichier).
Préférer Chocolatey (binaire signé Choco passe le filtre) :
winget uninstall Task.Task -e --silent
choco install go-task -y
refreshenv
task --version
Puis :
cd D:\git\minfra-v2\infra\bare-metal\win11
task list-disks
task build-usb DISK_NUM=2 ISO_PATH="D:/iso/Win11_24H2_English_x64.iso"
Verify: task —version
Booter la machine cible en UEFI
Insérer clé USB sur machine cible éteinte. Allumer puis spammer immédiatement la touche du Boot Menu (tap répété dès l’écran logo constructeur, avant que Windows démarre).
| Constructeur | Boot Menu | BIOS/UEFI Setup |
|---|---|---|
| Dell | F12 | F2 |
| HP / HPE | F9 | F10 / Esc |
| Lenovo / ThinkPad | F12 / Enter+F12 | F1 |
| ASUS | F8 / Esc | F2 / Del |
| Acer | F12 | F2 / Del |
| MSI | F11 | Del |
| Gigabyte / AsRock | F12 | Del |
| Intel NUC | F10 | F2 |
| Surface | maintenir Vol- + power | Vol+ + power |
| Mac (Boot Camp) | maintenir Option (⌥) | - |
Si tu rates le timing : reboot et retente. Si Boot Menu indisponible,
passer par le BIOS/UEFI Setup → onglet Boot → réordonner pour mettre
USB en premier.
Dans le Boot Menu, sélectionner l’entrée préfixée UEFI : (pas
Legacy / CSM / sans préfixe). Exemple :
- ✅
UEFI : VendorCo ProductCode, Partition 1 - ❌
VendorCo ProductCode(mode Legacy BIOS, install échouera)
Si seule l’entrée Legacy apparaît : entrer dans BIOS/UEFI Setup,
activer UEFI Boot Mode / désactiver CSM / Legacy Support, sauver,
rebooter.
Setup Windows démarre automatiquement, sans saisie. Phases :
- WindowsPE : applique bypass TPM/SecureBoot/RAM, wipe disque 0, partitionne GPT
- Specialize : hostname + locale + timezone
- OOBE skip : pas d’écran EULA / compte Microsoft / Cortana
- AutoLogon sacha (1 fois) → lance
FirstLogonCommands - Install Chocolatey + git, openssh, mise, go-task, bitwarden-cli, age.portable
- Reboot final → écran de login
Durée totale : 10-20 min selon vitesse disque cible + connexion (pour Choco).
Verify: machine cible boote sur écran login sacha
Premier login + sécurisation
Login sacha / ChangeMe!2026. Changer immédiatement le mot de
passe (en clair dans autounattend.xml).
# PowerShell admin sur machine cible
# Changer mdp depuis Bitwarden (préféré)
$newPw = bw get password "win-sacha-$(hostname)"
$secure = ConvertTo-SecureString $newPw -AsPlainText -Force
Set-LocalUser -Name sacha -Password $secure
# Effacer marqueur unattend
Remove-Item C:\autounattend-done.txt -ErrorAction SilentlyContinue
Verify: Test-Path C:\autounattend-done.txt # doit retourner True juste après install Verify: (Get-LocalUser sacha).Enabled
Vérifier services post-install
# WinRM (Ansible)
Test-WSMan -ComputerName localhost
# RDP
(Get-ItemProperty 'HKLM:\System\CurrentControlSet\Control\Terminal Server').fDenyTSConnections
# Outillage installé via Choco
choco list --local-only
Verify: Test-WSMan -ComputerName localhost Verify: choco —version Verify: git —version
Retirer / chiffrer la clé USB
Le fichier autounattend.xml sur la clé contient le mot de passe initial
en clair. Deux options :
# === Option A : effacer la clé après usage ===
$usb = Get-Disk | Where-Object BusType -eq 'USB' | Select-Object -First 1
Clear-Disk -Number $usb.Number -RemoveData -Confirm:$false
# === Option B : retirer juste le XML, garder clé bootable ===
$bootLetter = (Get-Volume | Where-Object FileSystemLabel -eq 'WIN11_BOOT').DriveLetter
Remove-Item "${bootLetter}:\autounattend.xml" -Force
Remove-Item "${bootLetter}:\sources\autounattend.xml" -Force -ErrorAction SilentlyContinue
Verify: -not (Test-Path ”$((Get-Volume | Where-Object FileSystemLabel -eq ‘WIN11_BOOT’).DriveLetter):\autounattend.xml”)
Suite logique
Machine cible up. Prochaines étapes :
01-prerequis-contexte— installer mise, task, ansible (WSL), sops, age, bitwarden-cli02-cablage— vérifier câblage physique + VLANs switchs- Puis suite plateforme : step-ca → Traefik → Authentik…
Hors périmètre
- Joindre AD Authentik — différé après stack platform up (Phase 2)
- Push SSH pubkey sacha — pré-staging via
authorized_keysdansFirstLogonCommandsà ajouter une fois Authentik up - Image Packer Win11 pour VMs Proxmox — variante future, même
autounattend.xmlpartagé via fichier ISO secondaire - BitLocker disque OS — chiffrement post-install via Ansible
- Driver pack réseau/GPU constructeur — pull depuis NAS jedha en post-OOBE (Phase 2)