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.
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) :
Étape | Action | Commentaires |
---|---|---|
1 | Vérifier la source d’installation | Montez 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). |
2 | Redémarrer le serveur | Un simple redémarrage lève parfois les verrous COM/DISM responsables du code 0x8004015 . |
3 | S’assurer qu’aucune mise à jour n’est en attente | Exécuter dism /online /cleanup-image /scanhealth pour vérifier la cohérence de l’image. |
4 | Installer manuellement avec DISM | Invite Admin :dism /online /enable-feature /featurename:NetFx3 /All /Source:D:\sources\sxs /LimitAccess |
5 | Réparer DISM si nécessaire | dism /online /cleanup-image /restorehealth puis recommencez l’étape 4. |
6 | Contrôler l’intégrité du système | sfc /scannow pour corriger d’éventuelles corruptions de fichiers. |
7 | Utiliser PowerShell comme alternative | Install-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ètre | Valeur conseillée (hors connexion) |
---|---|
Computer Configuration → Administrative Templates → System → Specify settings for optional component installation and component repair | Cochez 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
Code | Signification probable | Correctif rapide |
---|---|---|
0x8004015 | Session DISM/COM bloquée | Redémarrer, vérifier TrustedInstaller, relancer via invite Admin, isoler AV. |
0x800F081F | Source introuvable/incompatible | Utiliser une source exactement correspondante (même build/CU), pointer vers \sources\sxs local. |
0x800F0922 | Échec de l’installateur CBS | Consulter CBS.log , réparer l’image (restorehealth ), sfc, réessayer. |
0x800F0954 | Machine forcée vers WSUS | Activer l’option GPO Ne jamais tenter de télécharger…, spécifier la source locale, ou utiliser /LimitAccess . |
0x8007000D | Fichier corrompu | Re-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.