Windows Server 2016/2019: impossibile rimuovere IIS (errore 0x800f0922) — guida completa

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.

Indice

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 causaCome si manifestaCosa controllare
Aggiornamenti cumulativi difettosi o parzialmente ritiratiDopo 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 fileQuando 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 attiviSottocomponenti 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 e DISM /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 o C:\inetpub: può “mascherare” IIS ma rompe dipendenze, servicing stack e futuri aggiornamenti. Da evitare salvo ultima risorsa con snapshot sicuro.

Soluzione rapida (TL;DR)

  1. Snapshot/backup della VM/host.
  2. Controllo aggiornamenti: rimuovi CU associati al problema se presenti oppure installa l’ultimo LCU disponibile, poi riavvia.
  3. Pulisci C:\Windows\Temp per ridurre drasticamente il numero di file.
  4. Disabilita TUTTE le feature facoltative legate a IIS (IIS-*) e i ruoli dipendenti.
  5. Rimuovi il ruolo Web-Server (IIS) con PowerShell.
  6. Se persiste l’errore/undoing: DISM /Online /Cleanup-Image /RevertPendingActions → riavvio in Safe Mode → nuovo tentativo.
  7. 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:

  1. Revert pending actions (CBS):
DISM /Online /Cleanup-Image /RevertPendingActions
  1. 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
  2. Controlla la System Reserved/EFI: se < 500 MB, valuta di espanderla (lo spazio insufficiente può generare 0x800f0922 durante le operazioni di servicing).
  3. Disattiva temporaneamente antivirus/EDR che monitorano \Windows\WinSxS, \Windows\Temp e servizi IIS.
  4. 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 e C:\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 a IIS-* e a 0x800f0922.
  • %windir%\Logs\DISM\DISM.log — dettagli su Disable-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à”.

Indice