1 18/04/2026 12 min

Il codice 0xe0434352 su Windows Server 2019 e 2022 non è un problema “di Windows” in senso generico: di solito è il sintomo di un’eccezione .NET non gestita, oppure di un processo che muore mentre tenta di caricare runtime, librerie native o configurazioni non coerenti con l’ambiente. In pratica, il sistema ti sta dicendo che un’applicazione .NET è andata in crash, ma la causa vera va cercata nel servizio che la ospita, nel registro eventi e nelle dipendenze del processo.

Su server in produzione la domanda giusta non è “come tolgo l’errore”, ma quale componente sta fallendo e con quale impatto: servizio fermo, pool IIS in loop, job schedulato che esce con codice anomalo, console app lanciata da Task Scheduler o applicazione Windows service che si riavvia a raffica. Il codice 0xe0434352 compare spesso come exit code nel Service Control Manager o nei log di sistema, mentre la vera eccezione compare nei log .NET, nel Visualizzatore eventi o nei crash dump, se li hai abilitati.

Che cosa indica davvero 0xe0434352

Il valore 0xe0434352 è tipicamente associato a un’eccezione .NET non gestita. Non è una firma del problema, è il modo in cui Windows segnala che il processo è terminato per un errore gestito male dall’applicazione. La distinzione è importante: se il processo è un servizio .NET, il problema può stare nel codice applicativo; se invece il servizio dipende da runtime, librerie native, permessi o file di configurazione, il crash è solo l’effetto finale.

Le cause più frequenti, in ordine pratico, sono queste:

  1. Runtime .NET mancante o incompatibile con la versione richiesta dall’app.
  2. Dipendenza nativa non caricabile, spesso per mismatch x86/x64 o DLL mancanti.
  3. Configurazione corrotta o file di app danneggiati dopo un deploy incompleto.
  4. Eccezione applicativa reale, ad esempio accesso al database, file, certificato o API esterna.
  5. Permessi insufficienti sul servizio, su cartelle dati o su chiavi del registro.

Se il server è in esercizio, l’obiettivo iniziale è identificare il processo che cade e capire se il problema è reversibile con un rollback, una reinstallazione del runtime o una correzione di configurazione. Evita di partire da “repair” del sistema operativo: di solito è la strada sbagliata e allarga inutilmente il blast radius.

Primo triage: capire quale layer sta fallendo

La sequenza corretta è: servizio/applicazione → runtime .NET → dipendenze native → accessi esterni. Se fai il contrario, rischi di rimettere in piedi il server senza risolvere il crash. Su Windows Server 2019/2022 usa prima i log di sistema e applicazione, poi i dettagli del processo.

  1. Apri Event Viewer e vai su Windows Logs > Application e Windows Logs > System.
  2. Cerca eventi con sorgenti come .NET Runtime, Application Error, Windows Error Reporting, Service Control Manager.
  3. Annota: nome processo, modulo in fault, Exception type, stack trace, exit code e timestamp.
  4. Verifica se il crash coincide con un deploy, un aggiornamento di runtime, una modifica ai permessi o una variazione di certificati/connessioni esterne.

Comandi utili da PowerShell per un primo filtro sui log recenti:

Get-WinEvent -FilterHashtable @{LogName='Application'; StartTime=(Get-Date).AddHours(-4)} |
  Where-Object { $_.ProviderName -in '.NET Runtime','Application Error','Windows Error Reporting' } |
  Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
  Format-List

Se il servizio è registrato nel Service Control Manager, controlla anche gli eventi di avvio e arresto anomalo:

Get-WinEvent -FilterHashtable @{LogName='System'; StartTime=(Get-Date).AddHours(-4)} |
  Where-Object { $_.ProviderName -eq 'Service Control Manager' } |
  Select-Object TimeCreated, Id, Message |
  Format-List

Se trovi un Faulting module che non è clr.dll o un componente .NET ma una DLL di terze parti, la probabilità cresce che il problema sia una dipendenza nativa o un mismatch architetturale. Se invece compare una System.Exception o una derivata, devi scendere nel dettaglio dello stack trace e della configurazione applicativa.

Diagnosi probabile

Nella maggior parte dei casi su Windows Server 2019/2022 l’errore 0xe0434352 viene da una delle tre situazioni seguenti.

  1. Runtime .NET non allineato: l’app richiede una versione specifica di .NET Desktop Runtime, .NET Runtime o ASP.NET Core Hosting Bundle che sul server non c’è, oppure è stata rimossa/aggiornata in modo incoerente.
  2. Eccezione applicativa non gestita: il processo parte, ma fallisce subito perché non riesce a leggere configurazione, database, certificato, chiave API, file su disco o un endpoint esterno.
  3. Dipendenza o permesso errato: la app carica una DLL nativa, accede a cartelle protette o usa credenziali/identità di servizio senza i diritti necessari.

Per falsificare rapidamente queste ipotesi, basta spesso meno di cinque minuti se hai accesso al server e ai log:

  • Runtime: verifica il framework richiesto dal file di configurazione o dal manifest dell’app e confrontalo con i runtime installati.
  • Eccezione applicativa: cerca nello stack trace un errore chiaro, ad esempio FileNotFoundException, SqlException, UnauthorizedAccessException, ConfigurationErrorsException.
  • Permessi/dipendenze: controlla account del servizio, ACL su cartelle e presenza delle DLL native nel path dell’app.

Verifiche immediate

Prima di toccare il server, raccogli evidenza minima. È il modo più rapido per evitare tentativi alla cieca e rollback inutili.

  1. Identifica il processo o servizio coinvolto.
  2. Controlla i log di applicazione e sistema nell’intervallo del crash.
  3. Verifica la versione del runtime installato.
  4. Controlla se il problema si presenta su un singolo nodo o su tutti i nodi del cluster/farm.
  5. Se disponibile, acquisisci un crash dump o abilita il logging diagnostico dell’app.

Per vedere i runtime .NET installati, puoi usare il dotnet CLI se presente:

dotnet --list-runtimes

dotnet --info

Se dotnet non è nel PATH, non significa che il runtime non ci sia: alcune applicazioni legacy o servizi self-contained non lo espongono così. In quel caso controlla il pannello Apps & features o Programs and Features, oppure verifica la presenza di directory sotto C:\Program Files\dotnet\.

Per identificare rapidamente un problema di permessi, controlla l’identità del servizio e i file/cartelle toccati nel momento del crash. Un esempio tipico è un servizio che gira con Network Service o con un account dedicato, ma non ha accesso alla directory di log o al file di configurazione aggiornato.

sc.exe qc NomeServizio
icacls "C:\Percorso\App"

Il comando sc.exe qc ti mostra l’account di esecuzione; icacls ti dice se quel SID ha permessi coerenti sulle cartelle interessate. Se vedi accesso negato nel log e il servizio è cambiato di recente, hai una pista forte.

Soluzione consigliata passo-passo

Qui conviene seguire un percorso reversibile. Ogni passo deve darti una prova o riportarti allo stato precedente senza lasciare danni collaterali.

  1. Congela il contesto: annota versione dell’app, runtime, ultimo deploy, account del servizio, percorso binari e orario del primo crash. Se hai un change management, collega il ticket.
  2. Raccogli il log preciso: esporta gli eventi di Application e System nel range del problema. Se il software ha un log proprio, apri il file di log applicativo nella directory dell’app o nella cartella configurata.
  3. Verifica il runtime richiesto: confronta la versione dell’app con il runtime installato. Se manca il runtime corretto, installa solo il pacchetto richiesto dall’app, non un “aggiornamento generico” del sistema.
  4. Controlla compatibilità x86/x64: se l’app è 32 bit e sta tentando di caricare librerie 64 bit, o viceversa, il crash è quasi assicurato. Verifica architettura del processo e delle DLL native.
  5. Esamina la configurazione: cerca file come app.config, web.config, appsettings.json o file custom. Un endpoint sbagliato, una stringa di connessione rotta o un certificato scaduto può bastare a generare l’eccezione.
  6. Ripristina l’ultima versione nota buona se il problema è comparso subito dopo un deploy. È spesso la mitigazione più veloce e meno rischiosa.
  7. Riavvia il servizio solo dopo la correzione, non come tentativo diagnostico ripetuto. Se il crash è causato da configurazione o runtime, il restart da solo non risolve nulla.

Se il problema è un runtime mancante o corrotto, la correzione più pulita è reinstallare il pacchetto corretto e verificare che la versione app sia compatibile. Su server con IIS, per applicazioni ASP.NET Core, il punto delicato è il Hosting Bundle: senza quello, il sito può rispondere con errore o non avviarsi affatto. Dopo l’installazione, verifica il binding dell’app pool e la presenza del runtime in dotnet --list-runtimes.

Esempio di verifica utile dopo l’installazione del runtime:

dotnet --list-runtimes | findstr /i "Microsoft.AspNetCore.App Microsoft.NETCore.App"

Se invece il crash dipende da una libreria nativa mancante, il fix corretto è ripristinare la DLL nella posizione prevista o reinstallare il pacchetto redistribuibile dell’applicazione. Evita di copiare DLL “a mano” da un altro server se non hai certezza della versione: è una scorciatoia che spesso introduce un secondo problema.

Quando la causa è una configurazione rotta, lavora su una copia del file e conserva il backup. Un approccio semplice è rinominare il file attuale e ripristinare quello precedente:

copy web.config web.config.bak
copy web.config.previous web.config

Se il servizio usa certificati o credenziali, controlla la catena di fiducia, la data di scadenza e l’accesso della chiave privata. Molti crash “misteriosi” nascono da un certificato rinnovato ma non importato correttamente nello store locale, oppure da un servizio che non ha più diritti sulla private key dopo un cambio di account.

Per un controllo rapido dei certificati nello store locale, puoi usare PowerShell:

Get-ChildItem Cert:\LocalMachine\My |
  Select-Object Subject, NotAfter, Thumbprint |
  Sort-Object NotAfter

Se il problema è un’eccezione applicativa reale, la soluzione non è il sistema operativo ma il codice o la configurazione che porta a quell’eccezione. In quel caso i dati da cercare sono: stack trace completo, input che genera il crash, query o endpoint coinvolto, e differenza tra ambiente funzionante e ambiente rotto. Senza questi elementi si procede per ipotesi, non per diagnosi.

Crash dump e logging: quando i log non bastano

Se l’evento nel Visualizzatore eventi è generico o il processo muore prima di scrivere un log utile, il passo successivo è il crash dump. In produzione è spesso la via più rapida per capire se l’errore arriva da una dipendenza nativa, da una libreria .NET o da una chiamata esterna che fallisce in modo ricorrente.

Per applicazioni Windows Service o processi .NET classici puoi usare strumenti Microsoft come ProcDump per catturare il dump al crash. Il vantaggio è che non devi modificare il codice per ottenere un artefatto analizzabile.

procdump -e -ma -w NomeProcesso.exe C:\Dumps

Il dump va poi analizzato con WinDbg o con strumenti equivalenti. Se non hai competenza interna per farlo subito, almeno conserva il file e il timestamp: è il materiale che permette di chiudere il gap con il team applicativo o con il vendor.

Quando il problema è IIS, Task Scheduler o un Windows Service

Su server Microsoft l’errore 0xe0434352 compare spesso in tre contesti operativi diversi, e la lettura cambia leggermente in base al contenitore.

IIS

Se il sito usa ASP.NET o ASP.NET Core sotto IIS, controlla il pool, i binding, il runtime installato e il file web.config. Un pool che si ferma subito dopo l’avvio spesso indica un problema di runtime o un’eccezione nel bootstrap dell’app. Verifica anche il Event Viewer per eventi Application Error e ASP.NET Core Module.

Task Scheduler

Se il crash avviene in un’attività pianificata, il codice 0xe0434352 è spesso solo il codice di uscita del processo. Qui il punto è controllare il comando esatto lanciato dal task, la working directory e l’account di esecuzione. Molti job falliscono perché partono con path relativo errato o senza accesso ai file di input.

Windows Service

Per un servizio Windows, il minimo indispensabile è verificare ripetizione dei restart e messaggi del Service Control Manager. Se il servizio entra in crash loop, disabilita temporaneamente il restart automatico solo se hai già catturato i log necessari, altrimenti rischi di perdere il punto di fallimento.

Rollback e blast radius

Ogni modifica che tocchi runtime, configurazione o file binari ha un blast radius concreto: il servizio può non partire, il sito può restare fermo o il job può produrre output incompleti. Prima di cambiare, salva sempre il punto di ritorno: copia dei file, snapshot della VM se il contesto lo consente, oppure esportazione del pacchetto installato.

  1. Prima del cambio, conserva una copia di web.config, app.config, file json e binari dell’ultima release.
  2. Se installi un runtime, annota versione esatta e orario dell’intervento.
  3. Se modifichi permessi, esporta lo stato con icacls o documenta il SID dell’account coinvolto.
  4. Se il servizio è in produzione, prepara il rollback al pacchetto precedente o alla build nota buona.

Rollback tipico: ripristino del runtime precedente se il nuovo ha introdotto incompatibilità, ripristino della configurazione precedente se il problema è nato da un cambio di endpoint o connessione, riavvio controllato del servizio e verifica del log applicativo. Se il crash persiste dopo il rollback, il problema non era il cambio appena fatto e va cercato nel codice o nell’ambiente già presente.

Controlli finali

La verifica corretta non è “il servizio è partito una volta”, ma che resti stabile sotto il carico normale e che non compaiano nuovi errori nei log. I controlli minimi sono questi:

  1. Il servizio o sito resta Running per un intervallo sufficiente a superare il punto di crash.
  2. Nel Visualizzatore eventi non compaiono nuovi eventi .NET Runtime o Application Error con lo stesso timestamp.
  3. I log applicativi non mostrano eccezioni ripetute o retry infiniti.
  4. Se c’era un problema di runtime, dotnet --list-runtimes mostra la versione richiesta.
  5. Se c’era un problema di permessi, il servizio accede ai file senza Access denied.

Se vuoi chiudere il caso in modo pulito, conserva tre cose: evento iniziale, modifica eseguita e risultato dopo la correzione. È il minimo per evitare di ritrovarsi con lo stesso 0xe0434352 al prossimo riavvio o al prossimo deploy.

Assunzione operativa: la causa più probabile è un’eccezione .NET non gestita, ma la diagnosi va confermata con log evento, stack trace e verifica del runtime prima di toccare configurazioni o reinstallare componenti.