Guida pratica per abilitare offline .NET Framework 3.5 su Windows Server 2019 quando Add Roles and Features fallisce con errore 0x8004015. Include cause, checklist, comandi DISM e PowerShell, policy GPO, script automatizzato e verifiche post installazione.
Contesto e sintomi
In ambienti isolati o con accesso a Internet negato, l’abilitazione della funzionalità .NET Framework 3.5 (feature NetFx3) su Windows Server 2019 può interrompersi se la sorgente non è valida o se il sistema ha componenti in stato incoerente. Un caso tipico è l’avvio da Add Roles and Features con percorso alternativo (ad esempio D:\sources\sxs) che termina con:
The request to add or remove features on the specified server failed.
A DISM session could not be opened. Error: 0x8004015
L’errore indica che DISM non riesce ad aprire la sessione COM/RPC. Le cause più comuni sono:
- origine non valida, non accessibile o non corrispondente alla build del server;
- riavvii o aggiornamenti in sospeso;
- archivio componenti (WinSxS) o librerie DISM danneggiati;
- privilegi insufficienti o policy che bloccano l’uso di sorgenti locali.
Obiettivo e strategia
Installare NetFx3 solo da una sorgente locale affidabile, forzando DISM a non contattare Windows Update e ripristinando l’integrità dei componenti prima dell’installazione. Il percorso consigliato è la cartella \sources\sxs dell’ISO di Windows Server 2019 che deve combaciare con edizione e livello di patch del sistema.
Prerequisiti e buone pratiche
- ISO corretta: usare un supporto con livello di aggiornamento uguale o superiore a quello del server. Se possibile, privilegiare media destinati a installazioni senza Internet.
- Permessi: aprire Prompt dei comandi o PowerShell come Administrator.
- Manutenzione: pianificare un riavvio; evitare attività concorrenti come backup, antivirus aggressivi o snapshot in scrittura intensiva.
- Storage: il supporto contenente
\sources\sxsnon deve risiedere su unità lente, rimovibili instabili o share soggette a timeout. - Backup: su macchine di produzione effettuare snapshot o backup prima di intervenire sull’archivio componenti.
Tabella delle azioni consigliate
| Fase | Dettagli operativi |
|---|---|
| Verifica dell’origine | Montare l’ISO corrispondente alla stessa build del server. Supponendo l’unità D:, la cartella corretta è D:\sources\sxs. Verificare in Esplora file che i file Microsoft-Windows-NetFx3-*.cab siano presenti. |
| Eliminazione di blocchi | Riavviare il server e assicurarsi che non vi siano aggiornamenti in sospeso in Settings > Windows Update. |
| Integrità componenti | Eseguire scansioni e riparazioni con DISM e SFC come da sezione dedicata. Correggere eventuali errori prima di proseguire. |
| Installazione da riga di comando | Usare DISM con opzione /LimitAccess e sorgente esplicita: vedi sezione “Procedura rapida con DISM”. |
| Alternativa PowerShell | Usare Install-WindowsFeature specificando -Source e includendo le sottoparti: vedi sezione relativa. |
| Policy di gruppo | Configurare l’impostazione “Specify settings for optional component installation and component repair” per consentire sorgenti locali o share definite dall’amministratore. |
| Permessi e ambiente | Eseguire come amministratore locale o con privilegi elevati di dominio. Evitare share che richiedono credenziali scadenti o drive mapping volatili. |
Procedura rapida con dism
- Montare l’ISO di Windows Server 2019 e annotare la lettera assegnata (nell’esempio,
D:). - Aprire Prompt dei comandi come Administrator.
- Eseguire la riparazione dell’archivio componenti (vedi subito sotto) se il sistema ha subito interruzioni o aggiornamenti recenti.
- Lanciare l’abilitazione della feature con questa sintassi:
dism /online /enable-feature /featurename:NetFx3 /All /Source:D:\sources\sxs /LimitAccessNote:/Allinstalla anche le dipendenze diNetFx3./LimitAccessimpedisce qualsiasi tentativo verso Windows Update.- Se la lettera del supporto non è
D:, sostituirla di conseguenza.
Verifica e riparazione dell’archivio componenti
Eseguire i comandi seguenti in un Prompt dei comandi elevato. Se il server è completamente isolato, preferire la variante con WIM come sorgente.
dism /online /cleanup-image /scanhealth
dism /online /cleanup-image /restorehealth
sfc /scannow
Se /restorehealth non può contattare WSUS o Internet, usare il file install.wim del supporto:
dism /Get-WimInfo /WimFile:D:\sources\install.wim
dism /online /cleanup-image /restorehealth /Source:wim:D:\sources\install.wim:2 /LimitAccess
Suggerimento: scegliere l’indice del WIM che corrisponde all’edizione installata (ad esempio Standard o Datacenter). Selezionare l’indice corretto in base all’output di /Get-WimInfo.
Procedura alternativa con powershell
Aprire Windows PowerShell come Administrator ed eseguire:
Install-WindowsFeature -Name NET-Framework-Features -Source D:\sources\sxs -IncludeAllSubFeature
Per evitare tentativi verso Windows Update in ambienti isolati, prima impostare la policy (vedi sezione policy) o assicurarsi che il parametro -Source sia accessibile e affidabile.
Uso di una immagine wim come sorgente
Quando non è disponibile la cartella \sources\sxs ma si dispone di install.wim valida, DISM può usare direttamente l’immagine:
dism /online /enable-feature /featurename:NetFx3 /All /Source:wim:D:\sources\install.wim:2 /LimitAccess
Stabilire l’indice corretto con /Get-WimInfo. Il vantaggio è l’allineamento perfetto dei componenti; lo svantaggio è la dipendenza dal WIM giusto per edizione e lingua.
Impostazioni di policy di gruppo
In contesti con GPO restrittive, configurare Computer Configuration > Administrative Templates > System > Specify settings for optional component installation and component repair:
- abilitare l’impostazione;
- disabilitare l’opzione “Contact Windows Update directly” se si desidera solo l’origine locale;
- facoltativamente specificare un percorso di rete affidabile (ad esempio
\\server\share\sxs).
Applicare la GPO e forzare l’aggiornamento con gpupdate /force prima dell’installazione.
Analisi causale mirata
- Origine non valida: cartelle SxS di build o lingua diverse generano mismatch di hash. Soluzione: usare la cartella SxS della stessa build del sistema o un WIM allineato.
- Pending reboot: installazioni parziali o aggiornamenti in attesa bloccano la sessione DISM. Soluzione: riavvio e nuova esecuzione.
- Archivio danneggiato: interruzioni di alimentazione, snapshot aggressivi o antivirus possono corrompere CSI manifest. Soluzione:
DISM /RestoreHealthcon sorgente locale +SFC. - Permessi o GPO: esecuzione senza privilegi o policy che impongono WSUS. Soluzione: eseguire come amministratore e regolare la GPO.
Errori ricorrenti e rimedi
- 0x8004015 durante l’avvio della sessione: verificare che DISM non sia bloccato da pending reboot, che l’eseguibile non sia sostituito e che la sorgente sia accessibile. Eseguire riparazione componenti e riprovare con
/LimitAccess. - 0x800F081F sorgente mancante: il percorso SxS non contiene i CAB corretti oppure build non corrispondente. Soluzione: SxS del medesimo livello o WIM con indice idoneo.
- 0x800F0954 policy WSUS: il sistema tenta WSUS ma la rete è chiusa. Soluzione: GPO “Specify settings…” abilitata con sorgente locale o rimozione temporanea del vincolo WSUS per l’operazione.
Log e diagnostica
- Event Viewer → Applications and Services Logs > Microsoft > Windows > DISM: errori dettagliati di orchestrazione.
%windir%\Logs\CBS\CBS.log: storico delle operazioni sui componenti.%windir%\Logs\DISM\dism.log: parametri effettivi, sorgenti utilizzate, codici di errore intermedi.
Quando i log indicano “mancata corrispondenza di hash” o “payload non trovato”, la soluzione è quasi sempre riallineare la sorgente.
Consigli per media e sorgenti
- Preferire supporti ufficiali corrispondenti all’edizione installata. In presenza di cumulativi recenti, montare media aggiornati.
- Se si usa una share di rete, copiare
\sources\sxsin una cartella dedicata e usare percorsi UNC stabili. - Verificare anticipo che antivirus o EDR non blocchino l’accesso ai CAB; se necessario, inserire il percorso tra le esclusioni temporanee.
Script di automazione con powershell
Lo script seguente automatizza rilevamento del percorso SxS, verifica integrità, applicazione della policy e installazione della feature. Eseguire in PowerShell come Administrator.
$ErrorActionPreference = 'Stop'
Start-Transcript -Path "$env:SystemRoot\Temp\NetFx3offlineinstall.log" -Append
Trova una cartella SxS valida tra unità locali e rimovibili
function Find-SxsPath {
$candidates = Get-PSDrive -PSProvider FileSystem | ForEach-Object {
Join-Path $_.Root 'sources\sxs'
}
foreach ($p in $candidates) {
if (Test-Path $p -PathType Container -ErrorAction SilentlyContinue) {
if (Get-ChildItem $p -Filter 'Microsoft-Windows-NetFx3-*.cab' -ErrorAction SilentlyContinue) { return $p }
}
}
return $null
}
$sxs = Find-SxsPath
if (-not $sxs) { throw "Percorso SxS non trovato. Montare l'ISO e riprovare." }
Write-Host "Sorgente SxS: $sxs"
Facoltativo: imposta policy per consentire sorgente locale
$polKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Servicing'
New-Item -Path $polKey -Force | Out-Null
New-ItemProperty -Path $polKey -Name RepairContentServerSource -Value 2 -PropertyType DWord -Force | Out-Null
2 = preferisci sorgente locale (no WU diretto)
Riparazione componenti
Write-Host "Avvio DISM ScanHealth..."
Start-Process -FilePath dism.exe -ArgumentList "/online /cleanup-image /scanhealth" -Wait -NoNewWindow
Write-Host "Avvio DISM RestoreHealth con sorgente locale..."
Start-Process -FilePath dism.exe -ArgumentList "/online /cleanup-image /restorehealth /Source:$sxs /LimitAccess" -Wait -NoNewWindow
Installazione NetFx3
Write-Host "Installazione di NET-Framework-Features..."
Install-WindowsFeature -Name NET-Framework-Features -Source $sxs -IncludeAllSubFeature -Verbose
Verifica
$feature = Get-WindowsFeature -Name NET-Framework-Features
if ($feature.InstallState -eq 'Installed') {
Write-Host "Installazione completata con successo." -ForegroundColor Green
} else {
throw "Installazione non riuscita. Controllare i log."
}
Stop-Transcript
Lo script registra un log in %windir%\Temp\NetFx3offlineinstall.log e fallisce in modo esplicito se la cartella SxS non viene trovata.
Verifica della riuscita
- Gestione server: in Features la voce .NET Framework 3.5 appare come Installed.
- PowerShell:
Get-WindowsFeature net-framework | Where-Object {$_.Name -eq 'NET-Framework-Features'} - Cartelle runtime: presenza di
C:\Windows\Microsoft.NET\Framework\v2.0.50727eFramework64\v2.0.50727.
Varianti operative offline
In domini senza media fisico su ogni host è pratica comune pubblicare una share di sola lettura con la cartella \sources\sxs. Per garantire performance e integrità:
- usare una share ad alta disponibilità;
- limitare l’accesso in lettura ai soli server che devono installare;
- versionare le cartelle SxS per build e lingua (esempio:
\\filesrv\payloads\WS2019\en-US\2024-12\sources\sxs).
Domande frequenti
Serve corrispondenza perfetta tra supporto e server? Sì: edizione, lingua e livello di patch devono essere compatibili; media troppo vecchi possono non contenere i manifest richiesti da un server aggiornato.
Posso rimuovere la funzionalità dopo averla installata? Sì, con dism /online /disable-feature /featurename:NetFx3. In ambienti con compliance rigida, mantenere la sorgente a portata per reinstallazioni future.
È necessario riavviare? Talvolta il sistema lo richiede; pianificare una finestra di manutenzione per sicurezza.
Check rapido post intervento
- nessun aggiornamento in sospeso;
- log DISM e CBS senza errori;
- feature NetFx3 segnata come installata;
- applicazioni legacy che richiedono .NET 3.5 avviano senza errori;
- snapshot rimosso o consolidato dopo verifica.
Consigli finali
- se l’errore persiste, provare l’approccio con WIM e indice corretto;
- validare sempre l’accesso al percorso con un semplice dir o apertura in Esplora file prima di lanciare DISM;
- documentare edizione e build del server per scegliere rapidamente il payload giusto nelle future installazioni;
- centralizzare i payload SxS in un repository interno e mantenerli aggiornati insieme ai cumulativi distribuiti.
Conclusione
La combinazione di sorgente corretta e comandi DISM/PowerShell con parametri espliciti (/Source e /LimitAccess) elimina alla radice le cause dell’errore 0x8004015 in ambienti senza Internet. Con una breve verifica dell’integrità dei componenti e una GPO adeguata, l’installazione offline di .NET Framework 3.5 su Windows Server 2019 risulta affidabile e ripetibile.
Riepilogo operativo essenziale
- Montare l’ISO che combacia con il server.
- Riavviare ed eliminare pending reboot.
- Riparare componenti con
DISMeSFCse necessario. - Eseguire:
dism /online /enable-feature /featurename:NetFx3 /All /Source:D:\sources\sxs /LimitAccess. - In alternativa, PowerShell con
Install-WindowsFeature. - Verificare la riuscita e consultare i log in caso di errori.
Appendice di riferimento rapido
| Attività | Comando |
|---|---|
| Scansione integrità | dism /online /cleanup-image /scanhealth |
| Ripristino integrità | dism /online /cleanup-image /restorehealth |
| Ripristino con sorgente locale | dism /online /cleanup-image /restorehealth /Source:D:\sources\sxs /LimitAccess |
| Installazione NetFx3 | dism /online /enable-feature /featurename:NetFx3 /All /Source:D:\sources\sxs /LimitAccess |
| Alternativa con WIM | dism /online /enable-feature /featurename:NetFx3 /All /Source:wim:D:\sources\install.wim:2 /LimitAccess |
| Verifica feature | Get-WindowsFeature net-framework |
Raccomandazioni di sicurezza
- Eseguire i comandi solo da account amministrativi autorizzati.
- Conservare i payload SxS in repository con ACL restrittive e auditing attivo.
- Evitare l’uso di supporti rimovibili non verificati; controllare sempre hash e provenienza.
Seguendo queste pratiche, l’installazione offline è ripetibile, auditabile e allineata alle policy enterprise.
