Démarrage PXE à distance depuis Windows : Guide de l’administrateur système utilisant PowerShell, SSH et BCDEdit (2026)
Imaginez la situation : il est 9 h du matin, un poste de travail dans un autre bâtiment présente une installation Windows corrompue et votre emploi du temps est déjà surchargé. Vous n’avez pas une heure à consacrer à vous déplacer, brancher une clé USB et superviser une réinstallation. C’est là que le démarrage PXE à distance change la donne. En combinant OpenSSH sous Windows , le démarrage à distance PowerShell et l’outil BCDEdit , vous pouvez forcer la machine cible à démarrer depuis votre serveur PXE/WDS au prochain redémarrage, sans intervention physique. Dans les grandes entreprises comptant 50, 100 ou plus de 500 machines, ce processus peut à lui seul faire gagner des dizaines d’heures par an à votre équipe. Ce guide vous accompagne pas à pas : activation de SSH sous Windows, prise en main de BCDEdit, configuration d’une séquence de démarrage PXE unique et automatisation du processus grâce à un script PowerShell réutilisable.
Section 1 : Prérequis
Avant de pouvoir déclencher un démarrage PXE à distance, votre environnement doit disposer de quelques éléments. Rien d'exotique : la plupart des configurations d'entreprise les possèdent déjà, ou leur configuration ne prend pas plus de cinq minutes.
1.1 Un serveur PXE/WDS fonctionnel sur votre réseau
Il vous faut un serveur capable de répondre aux requêtes de démarrage PXE. Deux options courantes :
- Services de déploiement Windows (WDS) — Intégrés à Windows Server, ils sont étroitement liés à Active Directory. Ils sont idéaux pour les environnements Windows purs. Documentation Microsoft WDS .
- Projet FOG — Logiciel libre, basé sur Linux, gratuit et idéal pour les environnements mixtes. fogproject.org .
Assurez-vous que votre serveur DHCP est configuré pour distribuer le serveur suivant correct (option 66) et le nom de fichier de démarrage (option 67) pour les clients PXE.
1.2 Serveur OpenSSH sur la machine Windows cible
Windows 10 (version 1809 et ultérieures) et Windows Server (version 2019 et ultérieures) intègrent OpenSSH en option. Voici comment l'installer et le démarrer :
# Check current OpenSSH state
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
# Install the SSH server if not present
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
# Start the service and set it to auto-start
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
# Allow SSH through Windows Firewall
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server' `
-Enabled True -Direction Inbound -Protocol TCP `
-Action Allow -LocalPort 221.3 Droits d'administrateur local
BCDEdit requiert des privilèges d'administrateur. Votre session SSH doit être exécutée avec un compte administrateur local ou un compte de domaine disposant de droits d'administrateur local sur la machine cible. Si vous utilisez l'authentification SSH par clé (recommandée), assurez-vous que la clé publique se trouve dans le bloc C:ProgramDatasshadministrators_authorized_keys pour les comptes administrateurs.
1.4 Firmware UEFI avec entrée de démarrage réseau
L'ordinateur doit être équipé d'un firmware UEFI (et non d'un BIOS classique) avec une option de démarrage réseau/PXE enregistrée. La plupart des ordinateurs professionnels (Dell OptiPlex, HP EliteDesk, Lenovo ThinkCentre) en sont dotés. Ce n'est pas toujours le cas pour le matériel grand public.
Section 2 : Comprendre BCDEdit — L’éditeur de données de configuration de démarrage
BCDEdit est l'outil en ligne de commande officiel de Microsoft pour la gestion du magasin de données de configuration de démarrage (BCD). Le BCD peut être comparé au menu de démarrage UEFI/BIOS : il répertorie toutes les options de démarrage (Windows, récupération, démarrage réseau, etc.) et leurs priorités. BCDEdit permet de lire et de modifier ces options par programmation, ce qui est exactement ce dont nous avons besoin.
2.1 Commandes de base de BCDEdit
# List every boot entry in the store
bcdedit /enum all
# Show only the Windows Boot Manager
bcdedit /enum {bootmgr}
# Show current OS loader entry
bcdedit /enum {current}
# List firmware (UEFI) boot entries — this is where PXE lives
bcdedit /enum firmware
# List the EFI firmware boot manager
bcdedit /enum {fwbootmgr}2.2 Anatomie d'une entrée de gilet stabilisateur
Lorsque vous exécutez bcdedit /enum all, chaque entrée affiche plusieurs champs :
- identifiant — Un GUID comme
{a1b2c3d4-e5f6-7890-abcd-ef1234567890}ou un alias bien connu comme{current},{bootmgr}. - description — Nom lisible par l'homme (par exemple, « UEFI : Contrôleur Ethernet Intel(R) — PXE »).
- périphérique — Le périphérique de microprogramme à partir duquel cette entrée démarre.
- chemin — Le chemin d'accès à l'application EFI sur le périphérique de firmware.
Point clé : {fwbootmgr} possède un ordre d’affichage (ordre de démarrage permanent) et une séquence de démarrage (surcharge ponctuelle, consommée au prochain démarrage). Nous utiliserons bootsequence pour déclencher PXE une seule fois.
Section 3 : Connexion via SSH et inspection des entrées de démarrage
Une fois SSH activé sur la machine cible, la connexion est simple. Ouvrez un terminal PowerShell sur votre machine locale :
# Connect to the remote machine
ssh admin@192.168.1.50
# Once connected, list all boot entries with key fields
bcdedit /enum all | Select-String -Pattern "description|identifier|path"
# Focus on firmware entries (UEFI network boot entries are here)
bcdedit /enum firmware
# Check the EFI firmware boot manager order
bcdedit /enum {fwbootmgr}Recherchez une entrée dont la description contient des mots clés tels que « réseau », « PXE », « Ethernet » ou « LAN ». Sur les ordinateurs Dell, elle se présente souvent sous la forme « UEFI : Contrôleur Realtek PCIe GbE Family » . Sur les ordinateurs HP, vous pourriez trouver « Démarrage réseau IPv4 » . Notez le GUID ; vous en aurez besoin dans la section suivante.
Exemple d'extrait de résultat :
Firmware Boot Manager
---------------------
identifier {fwbootmgr}
displayorder {current}
{a1b2c3d4-1111-2222-3333-abcdef012345}
{b2c3d4e5-4444-5555-6666-bcdef0123456}
timeout 2
Firmware Application (101fffff)
--------------------------------
identifier {a1b2c3d4-1111-2222-3333-abcdef012345}
description Windows Boot Manager
Firmware Application (101fffff)
--------------------------------
identifier {b2c3d4e5-4444-5555-6666-bcdef0123456}
description UEFI: Intel Ethernet I219-LM PXEDans cet exemple, le GUID de l'entrée PXE est {b2c3d4e5-4444-5555-6666-bcdef0123456}.
Section 4 : Configurer un démarrage PXE unique
Il existe trois méthodes pour forcer le démarrage PXE au prochain démarrage. La méthode 1 est la plus fiable sur les systèmes UEFI modernes.
Méthode 1 : Séquence de démarrage BCDEdit (Recommandée)
# Set the PXE entry as a one-time boot override
# Replace the GUID with the one you found in Section 3
bcdedit /set {fwbootmgr} bootsequence {b2c3d4e5-4444-5555-6666-bcdef0123456}
# Verify the change
bcdedit /enum {fwbootmgr}
# Reboot the machine — it will PXE boot once, then revert to normal order
Restart-Computer -ForceLa valeur bootsequence est automatiquement supprimée du BCD après le prochain démarrage, de sorte que la machine reviendra à son ordre de démarrage normal même si le processus PXE échoue.
Méthode 2 : Options de démarrage WMI (Héritée / Alternative)
# Works on older systems; less reliable on modern UEFI
$cs = Get-WmiObject -Class Win32_ComputerSystem
$cs.SetSystemBootOptions('PxeBoot', $true)
# Check current boot options
$cs | Select-Object BootOptionOnLimit, BootOptionOnWatchDogMéthode 3 : Étiqueter l’entrée actuelle (usage diagnostique)
# Useful for labelling/debugging — does not change boot order
bcdedit /set {current} description "PXE Boot - RootPilot"Section 5 : Script de démarrage PXE à distance complet (PowerShell)
Ce script réutilisable se connecte à la machine distante via SSH (PowerShell Remoting over SSH), détecte automatiquement l'entrée du firmware PXE, la configure pour un démarrage unique et redémarre la machine. Aucune recherche manuelle de GUID n'est nécessaire.
# Invoke-RemotePXEBoot.ps1
# Usage: .Invoke-RemotePXEBoot.ps1 -TargetHost 192.168.1.50 -Username admin
param(
[Parameter(Mandatory)]
[string]$TargetHost,
[Parameter(Mandatory)]
[string]$Username,
[switch]$WhatIf
)
Write-Host "[*] Connecting to $TargetHost as $Username..." -ForegroundColor Cyan
$session = New-PSSession -HostName $TargetHost -UserName $Username -SSHTransport
Invoke-Command -Session $session -ScriptBlock {
param($WhatIf)
Write-Host "[*] Enumerating firmware boot entries..." -ForegroundColor Cyan
# Get all firmware entries as raw text
$fwEntries = bcdedit /enum firmware 2>&1
Write-Output $fwEntries
# Parse entries: build a list of {identifier, description} pairs
$entries = @()
$currentId = $null
foreach ($line in $fwEntries) {
if ($line -match 'identifiers+({[^}]+})') {
$currentId = $matches[1]
}
if ($line -match 'descriptions+(.+)$' -and $currentId) {
$entries += [PSCustomObject]@{ Id = $currentId; Desc = $matches[1].Trim() }
$currentId = $null
}
}
# Find PXE / network entry
$pxeEntry = $entries | Where-Object {
$_.Desc -match 'network|pxe|ethernet|lan|ipv4|ipv6'
} | Select-Object -First 1
if (-not $pxeEntry) {
Write-Host "[!] No PXE/network firmware entry found. Aborting." -ForegroundColor Red
Write-Host " Available entries:" -ForegroundColor Yellow
$entries | Format-Table -AutoSize
return
}
Write-Host "[+] Found PXE entry: $($pxeEntry.Id) — $($pxeEntry.Desc)" -ForegroundColor Green
if ($WhatIf) {
Write-Host "[WhatIf] Would run: bcdedit /set {fwbootmgr} bootsequence $($pxeEntry.Id)" -ForegroundColor Yellow
return
}
# Set one-time boot to PXE
$result = bcdedit /set `{fwbootmgr`} bootsequence $pxeEntry.Id 2>&1
Write-Host "[*] BCDEdit result: $result"
# Confirm
$confirm = bcdedit /enum `{fwbootmgr`} 2>&1
Write-Host "[*] Current fwbootmgr state:" -ForegroundColor Cyan
Write-Output $confirm
Write-Host "[+] Rebooting $env:COMPUTERNAME now..." -ForegroundColor Green
Restart-Computer -Force
} -ArgumentList $WhatIf
Remove-PSSession $session
Write-Host "[*] Session closed. Machine should be PXE booting." -ForegroundColor CyanEnregistrez ce fichier sous le nom Invoke-RemotePXEBoot.ps1. Exécutez-le d'abord avec -WhatIf pour valider sans redémarrer :
# Dry run — shows what would happen without rebooting
.Invoke-RemotePXEBoot.ps1 -TargetHost 192.168.1.50 -Username admin -WhatIf
# Live run
.Invoke-RemotePXEBoot.ps1 -TargetHost 192.168.1.50 -Username adminSection 6 : Dépannage
Aucune entrée PXE trouvée dans BCDEdit
Deux causes fréquentes :
- La carte réseau ne prend pas en charge PXE — vérifiez ses spécifications. Les cartes réseau professionnelles Intel et Realtek sont presque toujours compatibles PXE. Certaines cartes réseau d'entrée de gamme ou USB ne le sont pas.
- Le démarrage sécurisé bloque l'entrée — il peut masquer les applications de microprogramme non signées lors de l'analyse par BCDEdit. Essayez de désactiver temporairement le démarrage sécurisé dans les paramètres UEFI, puis relancez l'analyse. Vous pouvez également vérifier via la commande :
Confirm-SecureBootUEFIdans PowerShell.
Connexion SSH refusée
# Verify the SSH service is running on the target
Invoke-Command -ComputerName target-pc -ScriptBlock { Get-Service sshd }
# Check the firewall rule exists
Get-NetFirewallRule -Name sshd
# Add firewall rule if missing
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server' `
-Enabled True -Direction Inbound `
-Protocol TCP -Action Allow -LocalPort 22Le démarrage PXE ne se déclenche pas après le redémarrage.
- Vérifiez que le serveur DHCP distribue les options PXE (options 66 et 67).
- Vérifiez que le serveur WDS/FOG est en cours d'exécution et répond aux requêtes TFTP.
- Certains firmwares UEFI ignorent le
bootsequence— dans ce cas, vous devrez peut-être utiliser la gestion hors bande iDRAC (Dell), iLO (HP) ou AMT (Intel) pour définir l'ordre de démarrage à distance.
WinRM ou SSH : quand utiliser lequel ?
- WinRM (Windows Remote Management) — Natif de toutes les versions de Windows, utilise HTTP/HTTPS (ports 5985/5986) et s'intègre à Active Directory et Kerberos. Idéal pour les environnements de domaine nécessitant une authentification Active Directory transparente.
- OpenSSH — Multiplateforme, utilise le port 22, prend en charge l'authentification par clé, fonctionne hors domaine, plus facile à utiliser depuis les postes d'administration Linux/macOS. Idéal pour les environnements modernes et mixtes.
Pour l'automatisation du démarrage PXE en particulier, la communication à distance SSH + PowerShell fonctionne parfaitement puisque BCDEdit est disponible dans n'importe quelle session PowerShell, quelle que soit la configuration WinRM.
Conclusion
Le démarrage PXE à distance via SSH et PowerShell fait partie de ces techniques qui peuvent paraître complexes, mais qui se révèlent étonnamment simples une fois le paramètre bootsequence de BCDEdit compris. Le script de la section 5 est prêt pour la production : il détecte automatiquement l’entrée du firmware PXE, prend en charge un mode de test (-WhatIf) et préserve l’ordre de démarrage permanent de la machine. Dans un environnement d’entreprise comptant plus de 50 machines Windows, ce processus élimine complètement les déplacements physiques pour les réinstallations du système d’exploitation. Associé à WDS ou FOG pour un déploiement sans surveillance, il vous permet de disposer d’un pipeline de réinstallation entièrement automatisé, déclenchable depuis votre poste de travail. Enregistrez le script dans le dépôt partagé de votre équipe, documentez la configuration de la clé SSH dans votre manuel d’exploitation et gagnez un temps précieux en évitant les allers-retours inutiles dans les locaux.