Votre PC Windows 11 reste coincé sur le build 22000.2538 et chaque tentative de mise à niveau échoue (0x8007001F, 0x8007000D) ? Voici une méthode éprouvée pour diagnostiquer les journaux Setup, nettoyer les profils dupliqués/orphelins dans ProfileList et finaliser l’upgrade en sécurité.
Problème et symptômes observés
Un poste Windows 11 continuellement bloqué sur la version 22000.2538 refuse d’installer un build plus récent, que ce soit via Windows Update, l’Assistant d’installation ou une mise à niveau sur place. Les logs setupact.log et setuperr.log révèlent notamment :
- Codes d’erreur 0x8007001F et 0x8007000D durant les phases Gather ou Finalize.
- Messages récurrents du type Duplicate profile detected et échec d’accès à CSIDL_PRINTHOOD.
- Incapacité à interroger les groupes locaux pour certains comptes IIS APPPOOL\*.
Pris ensemble, ces indices orientent vers des profils utilisateurs orphelins ou dupliqués dans le Registre, ce qui bloque le moteur de migration des profils pendant la mise à niveau.
Ce que fait réellement l’installateur pendant la phase Gather
Pendant Gather, Windows collecte les informations de comptes, profils et paramètres. Les incohérences suivantes provoquent couramment l’arrêt prématuré :
| Phase | Action de Setup | Impact des profils corrompus |
|---|---|---|
| Gather | Inventaire des comptes/SID, lecture de ProfileList, mappage vers C:\Users\*. | SID en double, ProfileImagePath invalide, profils .bak → Duplicate profile detected, erreurs 0x8007000D/0x8007001F. |
| Finalize | Application des migrations et renommages de profils. | Entrées incohérentes → rollback, maintien sur l’ancien build. |
Procédure rapide validée
- Sauvegarder la clé Registre
ProfileList. - Supprimer uniquement les sous-clés SID orphelines/dupliquées identifiées.
- Relancer l’upgrade (Assistant d’installation ou Windows Update).
Dans le cas réel à l’origine de cet article, la suppression des SIDs incriminés a immédiatement levé le blocage ; la phase Gather s’est déroulée sans détection de doublons et l’installation est allée au bout.
Avant de toucher au Registre
- Créer un point de restauration système ou une image.
- Exporter la clé
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileListdans un fichier.reg. - Vérifier la correspondance entre comptes réels et SIDs avec
whoami /user,whoami /all,wmic useraccount(ou PowerShell). - Ne supprimer que ce qui est manifestement invalide (voir les critères décisionnels plus bas).
Où lire les bons journaux
| Emplacement | Quand l’utiliser | Ce que l’on cherche |
|---|---|---|
C:\$WINDOWS.~BT\Sources\Panther\setupact.log | Après un échec d’upgrade | Phases Gather/Finalize, lignes Duplicate profile, erreurs 0x8007001F/0x8007000D. |
C:\Windows\Panther\setuperr.log | Résumé des erreurs | Entrées Failed to access CSIDL_PRINTHOOD, échecs de requêtes de groupes. |
C:\Windows\Panther (autres fichiers) | Analyse plus fine | Détails de migration des profils, détection de doublons, comptes de service. |
Pour filtrer rapidement :
findstr /i /c:"duplicate profile" /c:"printhood" /c:"iis apppool" /c:"0x8007001f" /c:"0x8007000d" "C:\$WINDOWS.~BT\Sources\Panther\setupact.log"
Étapes détaillées pas à pas
Sauvegarder la clé ProfileList
- Ouvrir Regedit.exe.
- Naviguer vers
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList. - Fichier → Exporter → nommer par exemple
ProfileList_backup.reg.
En ligne de commande :
reg export "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" "%USERPROFILE%\Desktop\ProfileList_backup.reg" /y
Lister les SIDs présents et les profils réellement utilisés
Commandes utiles :
wmic useraccount get name,sid,localaccount
whoami /user
whoami /all
Alternative PowerShell (précise et moderne) :
# Toutes les entrées ProfileList
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' |
ForEach-Object {
[pscustomobject]@{
SID = $_.PSChildName
ProfileImagePath = (Get-ItemProperty $_.PsPath -Name ProfileImagePath -ErrorAction SilentlyContinue).ProfileImagePath
}
} | Format-Table -AutoSize
# Profils réellement connus par Windows (chargés, chemins valides)
Get-CimInstance Win32_UserProfile | Select-Object SID, LocalPath, Loaded | Format-Table -AutoSize
Identifier ce qui est orphelin, en double ou incohérent
Vérifier chaque sous-clé SID sous ProfileList :
- Chemin invalide : la valeur
ProfileImagePathpointe vers un dossier inexistant. - Profil en double : deux SIDs différents référencent le même
ProfileImagePath. - Suffixe .bak : ancien profil rebaptisé après échec de chargement.
- Comptes de service (ex. IIS APPPOOL\*) sans profil utilisateur valide.
| Condition détectée | Interprétation | Action recommandée |
|---|---|---|
ProfileImagePath inexistant | Profil orphelin | Supprimer la sous-clé SID correspondante (après backup) |
| Deux SIDs → même chemin | Doublon de profil | Conserver l’entrée du SID actif, supprimer l’autre |
Sous-clé avec .bak | Résidu d’un ancien chargement | Si inutilisée, supprimer la clé .bak |
| Entrée pour IIS APPPOOL\* | Compte de pool IIS sans profil | Supprimer l’entrée si pas de site IIS actif sur la machine |
Supprimer uniquement les SIDs invalides
Dans l’incident traité, les SIDs ci-dessous n’avaient plus de profil valide et figuraient dans les logs comme doublons ; ils ont été retirés :
S-1-5-21-3344152010-2776688820-2241573616-1106
S-1-5-21-3344152010-2776688820-2241573616-1113
S-1-5-21-3344152010-2776688820-2241573616-1114
... (liste complète propre à votre poste)
Suppression manuelle via Regedit : clic droit sur la sous-clé → Supprimer.
Suppression scriptée et ciblée (PowerShell) :
$SidsARevoquer = @(
'S-1-5-21-3344152010-2776688820-2241573616-1106',
'S-1-5-21-3344152010-2776688820-2241573616-1113',
'S-1-5-21-3344152010-2776688820-2241573616-1114'
)
$base = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
foreach ($sid in $SidsARevoquer) {
$key = Join-Path $base $sid
if (Test-Path $key) {
Write-Host "Suppression $key"
Remove-Item -Path $key -Recurse -Force
} else {
Write-Host "Absent: $key"
}
}
À ne jamais supprimer : les SIDs des comptes intégrés S-1-5-18 (SYSTEM), S-1-5-19 (LocalService), S-1-5-20 (NetworkService), ni le SID de l’utilisateur courant ou de l’Administrateur en usage.
Relancer la mise à niveau
Après nettoyage :
- Redémarrer la machine.
- Relancer Windows Update ou exécuter l’Assistant d’installation / setup.exe depuis un ISO récent.
- Vérifier que la phase Gather ne remonte plus de doublons ; l’installation doit se poursuivre jusqu’à Finalize.
Résultat attendu : l’upgrade aboutit et la machine quitte le build 22000.2538.
Comprendre les messages particuliers des journaux
Duplicate profile detected
Le moteur de migration a trouvé deux identités différentes pointant vers le même dossier de profil. Cela arrive après des restaurations, des renames manuels ou des profils itinérants. La résolution consiste à ne garder qu’un seul SID par dossier et supprimer les clés superflues.
Impossible d’accéder à CSIDL_PRINTHOOD
CSIDL_PRINTHOOD désigne le dossier « Raccourcis d’imprimantes » dans le profil. L’erreur survient si le ProfileImagePath n’existe plus, si le profil est redirigé vers un chemin réseau indisponible, ou si des valeurs erronées sont enregistrées dans User Shell Folders.
Vérifications rapides :
- Confirmer l’existence de
C:\Users\<Profil>\AppData\Roaming\Microsoft\Windows\Printer Shortcutspour les profils actifs. - Contrôler
HKU\<SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folderset Shell Folders pour détecter des chemins non résolus. - Si le profil n’existe plus → supprimer l’entrée SID correspondante dans
ProfileList.
Échecs liés aux comptes IIS APPPOOL
Les comptes virtuels IIS APPPOOL\* n’ont généralement pas de profil utilisateur. Si IIS n’est plus utilisé, leur présence résiduelle dans ProfileList ou dans certains groupes locaux peut perturber la collecte.
Contournements possibles :
- Supprimer les sous-clés SID des app pools dépourvues de
ProfileImagePathvalide. - Temporiser les services IIS si encore installés :
W3SVCetWASà l’arrêt le temps de l’upgrade.
sc stop W3SVC
sc stop WAS
Causes racines et bonnes pratiques
Pourquoi cela arrive-t-il ? Des profils corrompus (roaming, anciens comptes de service, migrations IIS), des redirections de dossiers ou des nettoyages incomplets laissent des entrées dans le Registre sans dossier correspondant. Pendant Gather, le moteur interprète ces entrées comme des conflits et interrompt la migration (SP pSPDoMainGather renvoie un échec).
Bonnes pratiques avant modification :
- Point de restauration, image système.
- Concordance comptes ↔ SIDs ↔ chemins :
whoami,Get-CimInstance Win32_UserProfile, inspection deProfileList. - Supprimer uniquement les SIDs sans
ProfileImagePathvalide, les doublons évidents ou les restes.bak.
Vérifications supplémentaires si le blocage persiste
- Intégrité système :
DISM /Online /Cleanup-Image /RestoreHealthpuissfc /scannow. - Compte propre : créer un nouvel administrateur local, lancer la mise à niveau depuis ce profil vierge.
- Contexte réseau : hors domaine/AD temporairement si profils itinérants/stratégies de redirection sont en jeu.
- Espace disque : au moins 25–30 Go libres sur C: pour l’upgrade in-place.
- Antivirus/EDR : désactiver la protection active pendant l’installation si la politique le permet.
- SetupDiag : analyser l’échec avec l’outil dédié pour confirmer la piste profiles.
Scripts utiles pour accélérer le tri
Détection automatique des profils orphelins
# Liste les entrées ProfileList dont le dossier n'existe pas
$base = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
Get-ChildItem $base | ForEach-Object {
$sid = $_.PSChildName
$path = (Get-ItemProperty $_.PsPath -Name ProfileImagePath -ErrorAction SilentlyContinue).ProfileImagePath
if ([string]::IsNullOrWhiteSpace($path) -or -not (Test-Path $path)) {
[pscustomobject]@{ SID = $sid; ProfileImagePath = $path }
}
} | Tee-Object -Variable Orphelins | Format-Table -AutoSize
# Suppression contrôlée (décommentez la ligne Remove-Item quand vous avez validé la liste)
# $Orphelins | ForEach-Object { Remove-Item -Path (Join-Path $base $_.SID) -Recurse -Force }
Détection des doublons de chemins
$base = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
$entries = Get-ChildItem $base | ForEach-Object {
[pscustomobject]@{
SID = $_.PSChildName
Path = (Get-ItemProperty $_.PsPath -Name ProfileImagePath -ErrorAction SilentlyContinue).ProfileImagePath
}
} | Where-Object { -not [string]::IsNullOrWhiteSpace($_.Path) }
$duplicates = $entries | Group-Object Path | Where-Object { $*.Count -gt 1 }
$duplicates | ForEach-Object {
Write-Host "Chemin en double: $($*.Name)"
$_.Group | Format-Table SID, Path -AutoSize
}
Vérification des profils chargés
# Profils réellement actifs (ne pas supprimer ces SIDs)
Get-CimInstance Win32_UserProfile | Where-Object { $_.Loaded -eq $true } |
Select-Object SID, LocalPath, LastUseTime | Format-Table -AutoSize
Questions fréquentes
Que faire des clés avec suffixe .bak ?
Ce sont des restes d’un chargement de profil échoué. Si aucune session ne les utilise et si le chemin ne correspond pas à un profil actif, vous pouvez les supprimer après sauvegarde.
Un SID se recrée après suppression ?
Cela signifie qu’un service recrée le profil à la volée (ex. une app ou un service IIS). Désactivez/arrêtez temporairement le service concerné, puis relancez l’upgrade.
Machine en domaine / profils itinérants ?
Effectuer la mise à niveau hors ligne du domaine peut simplifier la migration. Rejoignez à nouveau le domaine après succès.
Quels SIDs sont critiques ?
Ne supprimez pas S-1-5-18, S-1-5-19, S-1-5-20, ni les SIDs des comptes encore utilisés (utilisateur courant, administrateur, comptes de service actifs).
Checklist avant de relancer l’upgrade
- Backup
ProfileListréalisé. - Entrées SID orphelines supprimées.
- Aucun doublon de
ProfileImagePath. - Chemins spéciaux valides (dont CSIDL_PRINTHOOD).
- Services IIS arrêtés si inutiles.
- Intégrité système vérifiée (
DISM+SFC). - Espace disque suffisant.
Étude de cas
Sur le poste bloqué en 22000.2538, les journaux signalaient des doublons de profils, des erreurs CSIDL_PRINTHOOD et des messages liés à IIS APPPOOL. Après export de ProfileList et suppression des sous-clés SID listées dans les logs (plusieurs SIDs orphelins), l’upgrade a été relancée. La phase Gather n’a plus détecté de conflits et la mise à niveau s’est conclue avec succès. L’utilisateur a confirmé la résolution définitive.
Conclusion
Quand Windows 11 refuse obstinément de quitter 22000.2538 avec 0x8007001F/0x8007000D, la cause est souvent une base de profils incohérente. En sécurisant une sauvegarde, en nettoyant les SIDs orphelins/dupliqués dans ProfileList et en relançant l’upgrade, vous éliminez l’obstacle majeur de la phase Gather. Ajoutez à cela quelques vérifications d’intégrité et, si besoin, la mise entre parenthèses temporaire des services IIS : vous disposez alors d’un chemin fiable vers un système à jour.

