Su Windows Server 2016 e 2019 (spesso su VM Azure) la disinstallazione del ruolo Web Server (IIS) può fallire con il messaggio “We couldn’t complete the features. Undoing changes” e talvolta con l’errore 0x800f0922. In questa guida trovi cause comprovate, procedure passo‑passo, script e verifiche per risolvere definitivamente.
Panoramica del problema
Il comportamento tipico è il seguente:
- Dal Server Manager o con PowerShell (
Uninstall-WindowsFeature
) avvii la rimozione del ruolo Web-Server (IIS). - Il wizard segnala “Riuscito – Riavvio richiesto”. Dopo il riavvio compare la schermata “We couldn’t complete the features. Undoing changes”.
- La macchina torna operativa ma IIS risulta ancora presente oppure in stato incoerente. Anche
sfc /scannow
,DISM /RestoreHealth
e nuovi tentativi non sbloccano la situazione. - In alcuni casi viene registrato 0x800f0922 negli eventi/nei log CBS.
Cause più comuni (con riscontro sul campo)
Possibile causa | Come si manifesta | Cosa controllare |
---|---|---|
Aggiornamenti cumulativi difettosi o parzialmente ritirati | Dopo specifici LCU del 2024 su Windows Server 2019 il ruolo si aggiunge ma non si rimuove più; la semplice disinstallazione del CU non sempre ripristina i binari corretti. | wmic qfe o Get-Hotfix per elencare gli update; provare LCU più recenti o rimuovere il CU in questione se presente. |
Cartella C:\Windows\Temp con moltissimi file | Quando la cartella Temp contiene ~65.000 file o più, le operazioni CBS possono fallire con 0x800f0922 durante l’uninstall di ruoli/feature. | Conteggio file in %windir%\Temp ; ripulire in sicurezza, quindi ripetere la rimozione. |
Feature/ruoli dipendenti ancora attivi | Sottocomponenti IIS (feature “IIS-*”) o ruoli che dipendono da IIS (es. Remote Desktop Web Access, WSUS) impediscono la disinstallazione completa. | Elenco e disabilitazione preventiva di tutte le feature “IIS-*” e dei ruoli dipendenti, poi rimozione del ruolo principale. |
Cosa NON risolve (o lo fa solo parzialmente)
- Ripetere la rimozione via Server Manager senza intervenire sulle cause: produce lo stesso “Undoing changes”.
- Eseguire solo
sfc /scannow
eDISM /RestoreHealth
: utile per integrità generale, ma spesso non incide su feature/ruoli bloccati da Temp sovraccarica o da componenti dipendenti. - Eliminare manualmente
C:\Windows\System32\inetsrv
oC:\inetpub
: può “mascherare” IIS ma rompe dipendenze, servicing stack e futuri aggiornamenti. Da evitare salvo ultima risorsa con snapshot sicuro.
Soluzione rapida (TL;DR)
- Snapshot/backup della VM/host.
- Controllo aggiornamenti: rimuovi CU associati al problema se presenti oppure installa l’ultimo LCU disponibile, poi riavvia.
- Pulisci
C:\Windows\Temp
per ridurre drasticamente il numero di file. - Disabilita TUTTE le feature facoltative legate a IIS (
IIS-*
) e i ruoli dipendenti. - Rimuovi il ruolo Web-Server (IIS) con PowerShell.
- Se persiste l’errore/undoing:
DISM /Online /Cleanup-Image /RevertPendingActions
→ riavvio in Safe Mode → nuovo tentativo. - Ultima risorsa: in-place upgrade/repair install con ISO uguale o più recente (mantiene dati e re-installa i binari di sistema).
Procedura dettagliata e verifiche
Prerequisiti e sicurezza
- Esegui tutte le operazioni come amministratore in console elevata (PowerShell o CMD).
- Assicurati di avere snapshot/backup recente: alcune azioni modificano lo stato del Component Based Servicing (CBS) e del payload delle feature.
- Se la VM è su Azure: verifica eventuali extension o agent che iniettano dipendenze IIS (monitoring, gateway, proxy) prima di procedere.
Controllo e gestione degli aggiornamenti cumulativi
Verifica se è presente un LCU noto per aver introdotto il problema; in alternativa installa l’ultimo LCU disponibile.
# Elenco aggiornamenti installati
wmic qfe | findstr /i "KB5036896 KB503..."
oppure
Get-HotFix | Sort-Object InstalledOn | Format-Table HotFixID,InstalledOn -Auto
Se necessario, disinstalla il KB specifico e riavvia:
wusa /uninstall /kb:5036896 /quiet /norestart
shutdown /r /t 5
Nota: la semplice rimozione del CU potrebbe non bastare se i binari CBS sono già in stato incoerente; prosegui con i passi successivi.
Pulizia mirata della cartella Temp
Ridurre drasticamente i file in C:\Windows\Temp
aiuta CBS durante le operazioni di disabilitazione/rimozione delle feature.
# PowerShell (eseguire come Amministratore)
$Temp = "$env:windir\Temp"
Write-Host "Pulizia di $Temp ..."
Chiudi servizi e app che potrebbero bloccare file IIS
Stop-Service W3SVC,WAS,WMSVC -ErrorAction SilentlyContinue
Elimina file
Get-ChildItem -Path $Temp -File -Force -ErrorAction SilentlyContinue |
Remove-Item -Force -ErrorAction SilentlyContinue
Elimina eventuali sottocartelle vuote/rimane
Get-ChildItem -Path $Temp -Directory -Force -ErrorAction SilentlyContinue |
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
Disabilitazione completa delle feature IIS
Prima di rimuovere il ruolo “Web-Server”, conviene disabilitare tutte le feature facoltative legate a IIS e i ruoli che vi dipendono.
Opzione A — DISM/Optional Features (pattern IIS-*
)
# Elenca le feature legate a IIS ancora abilitate
Get-WindowsOptionalFeature -Online |
Where-Object { $.FeatureName -like "IIS-*" -and $.State -eq "Enabled" } |
Select-Object FeatureName, State
Disabilita e rimuove il payload (senza riavviare)
Get-WindowsOptionalFeature -Online |
Where-Object { \$.FeatureName -like "IIS-\" -and \$*.State -eq "Enabled" } |
ForEach-Object {
Disable-WindowsOptionalFeature -Online -FeatureName $\_.FeatureName -Remove -NoRestart
}
Opzione B — Ruoli/Feature Server (pattern Web-*
)
# Elenca feature IIS installate come Ruoli/Feature Server
Get-WindowsFeature Web-* | Where-Object InstallState -eq Installed |
Format-Table Name, DisplayName, InstallState
Disinstalla tutte le sottocomponenti Web-\* e rimuovi il payload
Get-WindowsFeature Web-\* | Where-Object InstallState -eq Installed |
ForEach-Object { \$*.Name } |
ForEach-Object {
Uninstall-WindowsFeature -Name \$* -Remove -NoRestart
}
Gestione ruoli dipendenti
- Remote Desktop Web Access (
RDS-Web-Access
) - WSUS (console e role services)
- Eventuali proxy/gateway/applicazioni che dichiarano dipendenze su
W3SVC/WAS
Rimuovi tali ruoli o modificane la configurazione in modo che non dipendano da IIS prima di procedere con la rimozione del ruolo principale.
Rimozione del ruolo Web-Server (IIS)
# Rimozione standard (riavvio gestito manualmente)
Uninstall-WindowsFeature -Name Web-Server -Remove -NoRestart
In alternativa, con riavvio automatico:
Uninstall-WindowsFeature -Name Web-Server -Remove -Restart
Dopo l’operazione, riavvia il server e verifica lo stato:
Get-WindowsFeature Web-* | Format-Table Name,InstallState
dism /online /Get-Features /Format:Table | findstr /i "IIS-"
Se compare ancora 0x800f0922 o “Undoing changes”
Applica le seguenti azioni in sequenza finché la rimozione va a buon fine:
- Revert pending actions (CBS):
DISM /Online /Cleanup-Image /RevertPendingActions
- Riavvia in Safe Mode e ripeti la disabilitazione delle feature + rimozione ruolo.
- Abilita temporaneamente l’avvio sicuro:
bcdedit /set {current} safeboot minimal
- Riavvia, esegui le operazioni, poi rimuovi il flag:
bcdedit /deletevalue {current} safeboot
- Abilita temporaneamente l’avvio sicuro:
- Controlla la System Reserved/EFI: se < 500 MB, valuta di espanderla (lo spazio insufficiente può generare 0x800f0922 durante le operazioni di servicing).
- Disattiva temporaneamente antivirus/EDR che monitorano
\Windows\WinSxS
,\Windows\Temp
e servizi IIS. - Controlla stato “RebootPending” e operazioni CBS pendenti:
# Registro: chiavi che indicano riavvii/azioni pendenti Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending" -ErrorAction SilentlyContinue Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired" -ErrorAction SilentlyContinue
In‑place upgrade/repair install (ultima risorsa)
Se i binari di sistema risultano alterati e il servicing non si sblocca, esegui un repair install con ISO equivalente o più recente (stessa edizione e lingua). La procedura mantiene dati e ruoli ma ricrea la base CBS/WinSxS, dopo di che la rimozione di IIS solitamente va a buon fine.
Script PowerShell “tutto‑in‑uno” (commentato)
Lo script seguente automatizza i passaggi critici: pulizia Temp, disabilitazione feature IIS (IIS-
e Web-
), rimozione del ruolo e logging. Eseguilo come amministratore. Personalizza le parti contrassegnate dai commenti se usi ruoli dipendenti (RD Web/WSUS).
#Requires -RunAsAdministrator
$ts = Get-Date -Format "yyyyMMdd_HHmmss"
$log = "C:\IISRemove$ts.log"
Start-Transcript -Path $log -Append
Write-Host "==\[ PRE-CHECK ]=="
Write-Host "Consigliato: avere uno SNAPSHOT/Backup prima di procedere."
1) Ferma servizi IIS (ignora errori se non presenti)
Stop-Service W3SVC,WAS,WMSVC -ErrorAction SilentlyContinue
2) Pulizia Temp
\$Temp = "\$env\:windir\Temp"
Write-Host "Pulizia di \$Temp ..."
Get-ChildItem -Path \$Temp -File -Force -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue
Get-ChildItem -Path \$Temp -Directory -Force -ErrorAction SilentlyContinue | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
3) Disabilita Optional Features 'IIS-\*'
\$opt = Get-WindowsOptionalFeature -Online | Where-Object { \$.FeatureName -like "IIS-\" -and \$*.State -eq "Enabled" }
foreach(\$f in \$opt){
Write-Host "Disable-WindowsOptionalFeature \$(\$f.FeatureName)"
Disable-WindowsOptionalFeature -Online -FeatureName \$f.FeatureName -Remove -NoRestart -ErrorAction Continue
}
4) Disinstalla feature server 'Web-\*'
\$web = Get-WindowsFeature Web-\* | Where-Object InstallState -eq "Installed"
if(\$web){
\$names = \$web | ForEach-Object Name
Write-Host "Uninstall-WindowsFeature Web-\* (\$(\$names -join ', '))"
Uninstall-WindowsFeature -Name \$names -Remove -NoRestart | Out-Null
}
5) Rimozione ruolo principale Web-Server
Write-Host "Uninstall-WindowsFeature Web-Server"
Uninstall-WindowsFeature -Name Web-Server -Remove -NoRestart | Out-Null
6) Verifiche
Write-Host "==\[ VERIFICA DOPO RIMOZIONE ]=="
Get-WindowsFeature Web-\* | Format-Table Name,InstallState
dism /online /Get-Features /Format\:Table | findstr /i "IIS-"
Write-Host "Operazione completata. Riavviare il server per consolidare i cambiamenti."
Stop-Transcript
Verifica post‑rimozione
- Feature/ruoli:
Get-WindowsFeature Web-* | Format-Table Name,InstallState dism /online /Get-Features /Format:Table | findstr /i "IIS-"
- Servizi:
Get-Service W3SVC,WAS,WMSVC
devono risultare Stopped o non presenti. - Percorsi:
C:\Windows\System32\inetsrv
eC:\inetpub
possono rimanere con alcuni file storici; non cancellarli a mano se non necessario. - Event Viewer: controlla Setup, ServerManager-Deployment e Component-Based Servicing per conferma dell’operazione.
Analisi dei log: cosa cercare in CBS.log
e DISM.log
I log più utili sono:
%windir%\Logs\CBS\CBS.log
— errori “Failed to disable feature”, “Cannot transition state”, riferimenti aIIS-*
e a 0x800f0922.%windir%\Logs\DISM\DISM.log
— dettagli suDisable-WindowsOptionalFeature
/Uninstall-WindowsFeature
.
Per isolare rapidamente le righe rilevanti:
Select-String -Path "$env:windir\Logs\CBS\CBS.log" -Pattern "IIS-|0x800f0922|Failed|Error"
Select-String -Path "$env:windir\Logs\DISM\DISM.log" -Pattern "IIS-|Error|Failed"
Checklist operativa (stampabile)
- ☐ Snapshot/backup aggiornato
- ☐ Verifica/gestione LCU problematici (rimozione o aggiornamento a LCU più recente)
- ☐ Pulizia
C:\Windows\Temp
- ☐ Disabilitazione di
IIS-*
(Optional Features) - ☐ Disinstallazione di
Web-*
(Feature/Ruoli Server) - ☐ Rimozione
Web-Server (IIS)
- ☐ Riavvio e verifica
- ☐ In caso di errore:
DISM /RevertPendingActions
→ Safe Mode → nuovo tentativo - ☐ Valutazione spazio EFI/System Reserved e antivirus/EDR
- ☐ Solo ultima risorsa: in‑place repair
Domande frequenti
È obbligatorio disinstallare tutte le feature “IIS-*” prima di rimuovere il ruolo?
In presenza del problema descritto è altamente consigliato. Anche una singola sotto‑feature abilitata può tenere “agganciato” il ruolo principale e far fallire la transizione di stato durante il riavvio.
Cosa significa esattamente 0x800f0922 in questo contesto?
È un errore CBS generico che indica il fallimento nell’applicazione delle modifiche ai componenti. In questo scenario tende a presentarsi quando la cartella \Windows\Temp
è sovraccarica o quando ci sono vincoli/pendenze (feature dipendenti, spazio insufficiente in partizioni di sistema, file in uso).
La rimozione manuale delle cartelle IIS è una scorciatoia accettabile?
No. Eliminare a mano inetsrv
e inetpub
non rimuove le definizioni da CBS, non aggiorna il registro e rischia di compromettere aggiornamenti futuri. Usalo solo come ultima spiaggia con un ripristino garantito.
Come posso prevenire che accada di nuovo?
- Mantieni aggiornato il server con gli LCU più recenti, testati prima in ambienti di staging.
- Pianifica pulizie periodiche di
%windir%\Temp
(task schedulato) e monitora la crescita della cartella. - Se IIS serve solo per test temporanei, valuta container o VM effimere, così da evitare residui nel sistema host.
Conclusioni
Il blocco della disinstallazione di IIS su Windows Server 2016/2019 è quasi sempre riconducibile a uno o più fattori tra aggiornamenti cumulativi difettosi, cartella Temp sovraccarica e feature/ruoli dipendenti rimasti attivi. Con la sequenza “aggiorna o rimuovi LCU problematici → pulisci Temp → disattiva IIS-
e Web-
→ rimuovi il ruolo → verifica/riavvia” la maggior parte dei sistemi torna in uno stato coerente senza ricorrere a procedure invasive. Se il servicing stack è compromesso, il repair install resta una via d’uscita sicura per ripristinare i binari e completare infine la rimozione.
Appendice — comandi riassuntivi
# 1) Verifica aggiornamenti (esempio)
wmic qfe | findstr /i "KB5036896"
2) Disinstallazione KB (se presente)
wusa /uninstall /kb:5036896 /quiet /norestart
3) Pulizia Temp (PowerShell)
Stop-Service W3SVC,WAS,WMSVC -ErrorAction SilentlyContinue
Get-ChildItem -Path "\$env\:windir\Temp" -File -Force -ErrorAction SilentlyContinue | Remove-Item -Force
Get-ChildItem -Path "\$env\:windir\Temp" -Directory -Force -ErrorAction SilentlyContinue | Remove-Item -Recurse -Force
4) Disabilita feature IIS (Optional + Server)
Get-WindowsOptionalFeature -Online | ? { \$.FeatureName -like "IIS-\" -and \$*.State -eq "Enabled" } |
% { Disable-WindowsOptionalFeature -Online -FeatureName $\_.FeatureName -Remove -NoRestart }
Get-WindowsFeature Web-\* | ? InstallState -eq "Installed" |
% { Uninstall-WindowsFeature -Name $\_.Name -Remove -NoRestart }
5) Rimozione ruolo principale
Uninstall-WindowsFeature -Name Web-Server -Remove -Restart
6) Se fallisce con 0x800f0922
DISM /Online /Cleanup-Image /RevertPendingActions
bcdedit /set {current} safeboot minimal
shutdown /r /t 0
Dopo il riavvio in Safe Mode, ripetere i passi 4 e 5, quindi:
bcdedit /deletevalue {current} safeboot
shutdown /r /t 0
Seguendo questa guida, avrai una traccia completa e replicabile per rimuovere IIS anche nei casi più ostinati, senza lasciare il sistema in uno stato “a metà”.