Windows Server 2019 : installer .NET Framework 3.5 hors connexion (DISM, SxS, PowerShell) – corriger l’erreur 0x8004015

Sur un serveur Windows Server 2019 isolé, l’activation de .NET Framework 3.5 peut échouer avec DISM (erreur 0x8004015). Ce guide pas à pas détaille une méthode hors connexion fiable : sources SxS, DISM, PowerShell, GPO et analyse des journaux.

Sommaire

Installation de .NET Framework 3.5 sur Windows Server 2019 hors connexion

Problème posé

Sur un hôte sans accès Internet, l’Assistant Ajouter des rôles et fonctionnalités échoue lors de l’activation de .NET Framework 3.5 et retourne :

The request to add or remove features on the specified server failed.
A DISM session could not be opened. Error: 0x8004015

Solutions et pistes de résolution

Exécutez les étapes suivantes (de la plus probable à la plus rare) :

ÉtapeActionCommentaires
1Vérifier la source d’installationMontez l’ISO/clé d’installation correspondant exactement au même niveau de build que le système, puis indiquez le chemin D:\sources\sxs (adapter la lettre).
2Redémarrer le serveurUn simple redémarrage lève parfois les verrous COM/DISM responsables du code 0x8004015.
3S’assurer qu’aucune mise à jour n’est en attenteExécuter dism /online /cleanup-image /scanhealth pour vérifier la cohérence de l’image.
4Installer manuellement avec DISMInvite Admin :
dism /online /enable-feature /featurename:NetFx3 /All /Source:D:\sources\sxs /LimitAccess
5Réparer DISM si nécessairedism /online /cleanup-image /restorehealth puis recommencez l’étape 4.
6Contrôler l’intégrité du systèmesfc /scannow pour corriger d’éventuelles corruptions de fichiers.
7Utiliser PowerShell comme alternativeInstall-WindowsFeature -Name NET-Framework-Features -Source D:\sources\sxs (ou Add-WindowsFeature Net-Framework-Core).

Avant de commencer : prérequis et vérifications rapides

  • Disposer d’un compte Administrateur local (ou équivalent) et exécuter l’invite en élévation.
  • Connaître la version exacte de l’OS : édition (Standard/Datacenter), build (ex. 17763) et niveau de correctif cumulatif (UBR).
  • Avoir un média d’installation strictement correspondant (même build + CU) à Windows Server 2019 installé.
  • Prévoir de l’espace disque : copier \sources\sxs en local (C:\sxs) évite les erreurs I/O et les déconnexions de support amovible.
  • Veiller à ce que le service Windows Modules Installer (TrustedInstaller) ne soit pas désactivé.

Procédure détaillée

Vérifier la compatibilité source/OS

Comparez le build de l’OS avec celui du média :

:: Invite de commandes ou PowerShell
ver

\:: Registre (build + UBR)
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentBuild
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v UBR

\:: PowerShell
Get-ComputerInfo | Select-Object OsName,OsVersion,OsBuildNumber,WindowsVersion 

Sur le média, identifiez l’image et sa version :

:: Lister les index disponibles et la version
dism /Get-WimInfo /WimFile:D:\sources\install.wim

\:: Si l'ISO contient un install.esd
dism /Get-WimInfo /WimFile\:D:\sources\install.esd 

La version de l’image (ex. 10.0.17763.x) doit correspondre au serveur. Un écart de build/provenance (Windows 10 au lieu de Server, autre langue, autre CU) déclenche couramment 0x800F081F ou des erreurs COM.

Monter l’ISO et préparer la source SxS

:: Monter l’ISO (Explorateur ou PowerShell)
PowerShell: Mount-DiskImage -ImagePath <chemin-vers-ISO>

\:: Copier localement pour fiabiliser
robocopy D:\sources\sxs C:\sxs /E 

Pourquoi copier ? Sur des hôtes virtualisés/serveurs distants, les lecteurs amovibles/UNC peuvent se déconnecter au milieu de l’opération. Le local C:\sxs supprime ce risque et accélère DISM.

Installation avec DISM (méthode recommandée hors ligne)

:: Invite de commandes (Admin)
dism /online /enable-feature /featurename:NetFx3 /All /Source:C:\sxs /LimitAccess /LogPath:C:\Windows\Logs\DISM\NetFx3.log
  • /All : installe les sous-composants requis (WCF, Windows Communication Foundation).
  • /Source : pointe vers \sources\sxs compatible.
  • /LimitAccess : interdit toute tentative de téléchargement auprès de Windows Update (impératif en environnement isolé/WSUS).
  • /LogPath (optionnel) : facilite l’analyse a posteriori.

Alternative PowerShell

PowerShell (Admin)
Get-WindowsFeature *Net-Framework*           # Vérifier l'état
Install-WindowsFeature -Name NET-Framework-Features -Source C:\sxs -IncludeAllSubFeature -Verbose
# ou (équivalent legacy)
Add-WindowsFeature Net-Framework-Core -Source C:\sxs

Si DISM échoue : réparation de l’image et du système

Commencez par une vérification et une éventuelle réparation de l’image de composants :

:: Vérifier la santé
dism /online /cleanup-image /scanhealth

\:: Réparer (avec source WIM et sans Internet)
dism /online /cleanup-image /restorehealth /Source\:WIM\:D:\sources\install.wim\:INDEX /LimitAccess

\:: Si le média utilise ESD
dism /online /cleanup-image /restorehealth /Source\:ESD\:D:\sources\install.esd\:INDEX /LimitAccess

\:: Puis relancer l’installation de NetFx3
dism /online /enable-feature /featurename\:NetFx3 /All /Source\:C:\sxs /LimitAccess 

Identifiez INDEX avec /Get-WimInfo (l’index correspondant à l’édition du serveur : Standard ou Datacenter, avec ou sans Desktop Experience).

Ensuite, contrôlez l’intégrité des fichiers système :

sfc /scannow

Stratégie de groupe (GPO) pour environnements fermés

Si une GPO impose l’utilisation de WSUS, l’installation de composants facultatifs peut échouer lorsqu’Internet est hors de portée. Configurez la stratégie suivante sur l’hôte ou via GPO :

ParamètreValeur conseillée (hors connexion)
Computer Configuration → Administrative Templates → System → Specify settings for optional component installation and component repairCochez Ne jamais tenter de télécharger à partir de Windows Update et indiquez le chemin source local ou UNC (ex. C:\sxs ou \\serveur\Share\sxs).

Après application de la GPO (gpupdate /force), relancez DISM/PowerShell avec la source précisée.

Dépannage avancé

Services et verrous COM (erreur 0x8004015)

Cette erreur signale souvent un problème d’initialisation COM ou de dépendances DISM :

  • Redémarrez le serveur (étape 2).
  • Vérifiez que le service Windows Modules Installer (TrustedInstaller) est présent et démarrable :
sc qc trustedinstaller
sc query trustedinstaller
net start trustedinstaller
  • Assurez-vous que l’antivirus/EDR ne bloque pas l’accès à C:\Windows\WinSxS ou à la source SxS (désactivation temporaire si la politique interne l’autorise).
  • Évitez d’exécuter DISM depuis une session PowerShell ISE imbriquée ou un shell non-élevé.

Codes d’erreur fréquents et correctifs

CodeSignification probableCorrectif rapide
0x8004015Session DISM/COM bloquéeRedémarrer, vérifier TrustedInstaller, relancer via invite Admin, isoler AV.
0x800F081FSource introuvable/incompatibleUtiliser une source exactement correspondante (même build/CU), pointer vers \sources\sxs local.
0x800F0922Échec de l’installateur CBSConsulter CBS.log, réparer l’image (restorehealth), sfc, réessayer.
0x800F0954Machine forcée vers WSUSActiver l’option GPO Ne jamais tenter de télécharger…, spécifier la source locale, ou utiliser /LimitAccess.
0x8007000DFichier corrompuRe-copier SxS en local, vérifier le média, sfc/dism.

Analyse des journaux

  • DISM : %windir%\Logs\DISM\dism.log (ou chemin /LogPath fourni).
  • CBS (Component Based Servicing) : %windir%\Logs\CBS\CBS.log.

Filtres utiles :

findstr /i /c:"error" /c:"0x800" %windir%\Logs\DISM\dism.log
findstr /i netfx %windir%\Logs\CBS\CBS.log

Cas particuliers

  • Server Core : utilisez exclusivement DISM/PowerShell. Les commandes sont identiques (aucune UI).
  • Langue/édition : mélange de langues (fr-FR vs en-US) ou d’éditions (évaluation vs licence) peut échouer. Conservez une matrice de médias alignés.
  • WSUS strict : si une GPO impose WSUS, l’option /LimitAccess + source locale est indispensable.
  • Stockage : évitez les partages montés via chemin long ou soumis à filtrage ; préférez un disque local C:\sxs.

Exemple de script PowerShell prêt à l’emploi

Ce script tente d’installer .NET 3.5 depuis une source locale, journalise l’opération et bascule automatiquement vers DISM si nécessaire.

# Exécuter en PowerShell (Admin)
param(
  [string]$Source = 'C:\sxs',
  [switch]$ForceDism
)

if (-not (\[Security.Principal.WindowsPrincipal] \`
\[Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
\[Security.Principal.WindowsBuiltInRole] "Administrator")) {
throw "Lancez PowerShell en tant qu’Administrateur."
}

\$log = Join-Path \$env\:ProgramData ("NetFx3-Install-{0}.log" -f (Get-Date -Format 'yyyyMMdd-HHmmss'))
"Journal: \$log" | Tee-Object -FilePath \$log

if (-not (Test-Path \$Source)) { throw "Source introuvable : \$Source" }

try {
if (\$ForceDism) {
& dism /online /enable-feature /featurename\:NetFx3 /All /Source:\$Source /LimitAccess /LogPath:\$log
} else {
Install-WindowsFeature -Name NET-Framework-Features -Source \$Source -IncludeAllSubFeature -Verbose 4>&1 | Tee-Object -FilePath \$log -Append
}
Get-WindowsFeature *Net-Framework* | Format-Table Name,InstallState
}
catch {
"Échec : \$($\_.Exception.Message)" | Tee-Object -FilePath \$log -Append
throw
} 

Validation post‑installation

Confirmez que la fonctionnalité est bien Installed :

Get-WindowsFeature *Net-Framework*
# ou
dism /online /Get-Features /Format:Table | findstr /i NetFx3

Vérifiez également les rôles/applications dépendants (ex. anciens installateurs SQL Server, outils tiers .NET 2.0/3.0) : ils doivent démarrer sans exiger un redémarrage supplémentaire. Si nécessaire, redémarrez une dernière fois.

Bonnes pratiques et prévention

  • Bibliothèque de médias de référence : conservez, par build, un dossier SxS validé (hashé) pour chaque langue/édition utilisée.
  • Automatisez dans vos runbooks la détection de build et le choix du bon index WIM.
  • Nettoyez l’image régulièrement : Dism /online /Cleanup-Image /StartComponentCleanup (en fenêtre de maintenance), afin de réduire la dette de composants.
  • Documentez la GPO « Optional component installation » et le chemin source utilisé (UNC résilient et accessible en lecture).
  • Sur les gold images : envisagez d’activer NetFx3 en amont pour éviter les dépendances au déploiement.

FAQ express

Faut‑il un accès Internet ?
Non. Avec /LimitAccess et une source SxS valide, l’installation est 100 % hors ligne.

Pourquoi l’Assistant échoue alors que DISM réussit ?
L’Assistant s’appuie sur les mêmes API mais peut respecter des politiques (WSUS) ou échouer sur des ressources amovibles. DISM/PowerShell offre un contrôle plus fin des sources et de la journalisation.

La source doit‑elle correspondre au CU exact ?
Oui, visez au minimum un média aligné sur la même build et le même niveau de correctif cumulatif. Un décalage est la cause n°1 des erreurs 0x800F081F.

Où trouver l’index WIM à utiliser ?
Avec dism /Get-WimInfo /WimFile:<chemin>. Choisissez l’index correspondant à l’édition installée (Standard/Datacenter, Core/Desktop Experience).

Dois‑je désactiver l’antivirus ?
Uniquement si les politiques internes l’autorisent, et de façon temporaire. Essayez d’abord la copie locale C:\sxs et l’exécution en élévation.

Références pratiques (sans liens externes)

  • Chemins de journaux : %windir%\Logs\DISM\*.log, %windir%\Logs\CBS\CBS.log
  • Service critique : TrustedInstaller (Windows Modules Installer)
  • Paramètre GPO : Specify settings for optional component installation and component repair
  • Répertoires clés : C:\Windows\WinSxS, C:\sxs, <ISO>\sources\sxs

Conclusion

En contrôlant la compatibilité de la source SxS, en utilisant DISM/PowerShell avec /LimitAccess et en s’appuyant sur la GPO adéquate, l’installation hors connexion de .NET Framework 3.5 sur Windows Server 2019 aboutit dans la vaste majorité des cas. En cas d’échec, l’analyse méthodique des journaux DISM/CBS et la réparation de l’image (restorehealth) permettent d’identifier rapidement la cause (source incompatible, verrou COM, composant corrompu) et de la corriger durablement.

Astuce finale : conservez sur chaque hôte isolé un dossier C:\sxs signé et vérifié correspondant à son build. Cette simple mesure supprime 90 % des incidents liés aux sources et accélère drastiquement les déploiements.

Sommaire