Dove restano i dati di un programma Windows dopo la disinstallazione

Disinstallare un programma non elimina sempre tutti i suoi dati. Vediamo dove cercare file, cartelle, chiavi di Registro e altri residui, usando anche Process Monitor e uno script PowerShell per monitorare gli accessi dell'applicazione.

Disinstallare un programma da Windows 11 non significa necessariamente cancellare ogni file, impostazione o traccia che quell’applicazione ha creato nel sistema. La procedura di disinstallazione o uninstaller può rimuovere correttamente l’eseguibile principale e far sparire il software dall’elenco delle app installate, lasciando però configurazioni, cache, database locali, servizi, attività pianificate, cartelle del profilo utente e chiavi del Registro.

Molti programmi conservano deliberatamente una parte dei dati per consentire all’utente di reinstallare l’applicazione senza perdere preferenze, profili, account configurati o file di lavoro. In altri casi, invece, l’installer semplicemente non tiene traccia di tutto ciò che il programma crea dopo il primo avvio quindi permangono rimanenze sul sistema, veri e propri “residui” dei quali l’utente vorrebbe sbarazzarsi.

L’uninstaller conosce soltanto ciò che gli è stato insegnato a rimuovere

Un installer tradizionale può copiare file nella cartella Program Files, creare chiavi nel Registro, installare un servizio e registrare una procedura di disinstallazione. Windows Installer, ad esempio, registra le applicazioni MSI sotto la chiave seguente, associando normalmente il prodotto a un identificatore GUID:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall

Quella registrazione, però, non significa che Windows mantenga automaticamente un inventario universale di ogni file creato successivamente dall’applicazione.

Un programma può essere installato oggi in una sottocartella di Program Files ma, durante mesi di utilizzo, creare autonomamente nuovi file in altre directory del sistema. Ad esempio in una sottocartella di %appdata% (esempio: C:\Users\NOME\AppData\Local\Produttore\Programma oppure C:\Users\NOME\AppData\Roaming\Produttore\Programma), in %programdata% (esempio: C:\ProgramData\Produttore\Programma) o in qualunque altra cartella.

Se l’uninstaller non prevede esplicitamente di cancellare quei dati, essi possono restare sull’unità di memorizzazione.

La prima “fermata” è AppData

La cartella più importante da conoscere è %appdata%: AppData contiene dati associati al singolo profilo Windows e comprende principalmente tre directory: Local, LocalLow e Roaming.

Microsoft considera queste cartelle parte delle “Known Folders” di Windows, ossia cartelle standard che le applicazioni possono individuare tramite API invece di ricorrere a percorsi scritti direttamente nel codice.

Il percorso %localappdata%, accessibile rapidamente premendo Windows+R quindi digitando %localappdata%, corrisponde normalmente a C:\Users\NOME\AppData\Local: qui si trovano molto spesso cache, miniature, log, database SQLite, file temporanei, dati scaricabili nuovamente, configurazioni specifiche del PC, componenti installati per il solo utente. Una disinstallazione incompleta può quindi lasciare cartelle di grandi dimensioni proprio dentro %LOCALAPPDATA%.

Il caso tipico è un browser, un client di messaggistica, un IDE o un programma basato su Chromium/Electron che lascia cache, GPU cache, database e profili anche dopo la rimozione dell’eseguibile.

AppData\Roaming

La variabile %appdata% punta invece normalmente a C:\Users\NOME\AppData\Roaming: Windows destina quest’area ai dati utente che possono seguire il profilo in ambienti aziendali configurati per il roaming. Nella pratica è utilizzatissima anche sui normali PC per:

  • preferenze;
  • configurazioni;
  • profili;
  • estensioni;
  • template;
  • database di piccole dimensioni.

Sono proprio queste informazioni che spesso permettono di reinstallare un programma e di ritrovarlo già configurato come prima. Però, per chi volesse cancellare completamente tutte le tracce di un programma ormai rimosso, è una locazione di memoria di controllare prioritariamente.

ProgramData: dati condivisi da tutti gli utenti

Un’altra area molto importante è C:\ProgramData accessibile anche tramite %ProgramData%.

A differenza di AppData, ProgramData è utilizzata per informazioni che non appartengono necessariamente a un singolo utente. Un’applicazione può conservarvi, per esempio, configurazioni globali, database comuni, log, cache, file di aggiornamento, dati utilizzati da servizi Windows, informazioni condivise tra più account e così via.

È anche una directory nascosta per impostazione predefinita, quindi può facilmente sfuggire a un controllo superficiale.

Program Files può conservare la vecchia cartella

La posizione più ovvia rimane C:\Program Files e, sui sistemi Windows a 64 bit, anche C:\Program Files (x86). Quest’ultima ospita normalmente applicazioni Win32 a 32 bit.

Un uninstaller ben realizzato tende a rimuovere la propria directory, ma possono restare file che il programma ha creato dopo l’installazione oppure che la routine di disinstallazione decide deliberatamente di non eliminare. Dopo avere rimosso un’applicazione può quindi valere la pena verificare i seguenti percorsi:

C:\Program Files\Produttore
C:\Program Files\NomeProgramma
C:\Program Files (x86)\Produttore

Il Registro di sistema può conservare impostazioni e componenti

Il Registro di Windows è l’altra grande area in cui cercare: le applicazioni desktop tradizionali utilizzano frequentemente le chiavi seguenti per registrare la propria presenza e annotare informazioni:

HKEY_CURRENT_USER\SOFTWARE (per le impostazioni del singolo account)

HKEY_LOCAL_MACHINE\SOFTWARE (per configurazioni valide a livello di macchina)

Un’applicazione a 32 bit può inoltre avere informazioni nella vista dedicata situata in corrispondenza del percorso seguente:

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node

Dopo la disinstallazione possono restare chiavi orfane, non solo nelle locazioni “canoniche” ma anche in altre aree. Il Registro di sistema va tuttavia maneggiato con la massima cautela e non deve essere trattato come una directory da “ripulire” periodicamente.

Come verificare rapidamente se sono rimaste chiavi

Da PowerShell è possibile effettuare alcune ricerche mirate, senza neppure aprire l’Editor del registro di sistema (regedit). È ad esempio possibile impartire i seguenti due comandi di base:

Get-ChildItem "HKCU:\Software" |
Where-Object {$_.Name -match "NomeProgramma"}

Get-ChildItem "HKLM:\Software" |
Where-Object {$_.Name -match "NomeProgramma"}

Per le applicazioni a 32 bit:

Get-ChildItem "HKLM:\Software\WOW6432Node" |
Where-Object {$_.Name -match "NomeProgramma"}

Sono controlli preliminari: prima di eliminare qualcosa bisogna sempre aprire la chiave e verificare che appartenga effettivamente al software già rimosso.

Anche un servizio può sopravvivere alla disinstallazione

Alcuni programmi installano un servizio Windows: VPN, software di backup, database, programmi di sicurezza, strumenti hardware, routine di aggiornamento e applicazioni server utilizzano spesso questo meccanismo. Può capitare che l’eseguibile sia cancellato, insieme ad altri dati, ma che la registrazione del servizio rimanga.

Microsoft documenta esplicitamente questa eventualità: se il file eseguibile del servizio non esiste più ma il servizio resta registrato, è possibile rimuovere la relativa voce con sc.exe delete.

Comandi come sc query oppure da PowerShell Get-Service permettono di ottenere la lista dei servizi presenti. Sempre da PowerShell, si può cercare un nome specifico, avvalendosi eventualmente di un software come Autoruns:

Get-Service | Where-Object {
$_.Name -match "programma" -or
$_.DisplayName -match "programma"
}

Controllare anche le attività pianificate

Updater, telemetria, sincronizzazione e manutenzione periodica sono inoltre frequentemente implementati tramite Utilità di pianificazione.

Per visualizzare le attività si può usare il comando schtasks /query oppure il seguente per ottenere maggiori dettagli: schtasks /query /fo LIST /v

È eventualmente possibile cercare mediante PowerShell tra le attività pianificate in Windows:

Get-ScheduledTask | Where-Object {
$_.TaskName -match "NomeProgramma"
}

Se una vecchia attività punta a un file ormai inesistente, può capitare di ritrovare errori periodici nel Visualizzatore degli eventi, interrogabile anche tramite Sysmon, oppure processi che Windows tenta inutilmente di avviare.

I programmi possono lasciare componenti in esecuzione automatica

Un’altra area da controllare è l’esecuzione automatica di Windows: il sistema operativo può sfruttare diverse aree per predisporre l’avvio di un programma a ogni ingresso in Windows. Dopo una disinstallazione, alcune voci possono rimanere presenti nel sistema: a tal proposito, il già citato Autoruns offre un valido aiuto per chiarire la situazione, individuare eventuali voci orfane e fare pulizia, ove necessario.

Monitorare file, cartelle e Registro utilizzati da un programma

Per capire con precisione quali risorse usa un’applicazione durante l’esecuzione, abbiamo preparato uno script PowerShell con interfaccia grafica che sfrutta Process Monitor di Microsoft Sysinternals.

Dopo aver selezionato il file .exe da analizzare, lo script avvia Process Montor in background, esegue il programma e registra soltanto gli eventi associati al PID (process ID) specifico di quella istanza, escludendo quindi gli altri processi presenti nel sistema.

Al termine del test, premendo il pulsante per fermare il monitoraggio, la cattura viene convertita e analizzata automaticamente: il report distingue i file realmente letti da quelli scritti o modificati, separa i percorsi semplicemente aperti o interrogati e raccoglie anche le chiavi del Registro di sistema consultate, create o modificate.

Script PowerShell monitoraggio file system e chiavi registro Windows

I risultati sono salvati sia in un riepilogo testuale facilmente leggibile sia in file CSV separati, utili per ulteriori verifiche o elaborazioni. Il criterio adottato è volutamente rigoroso: non vengono inclusi i processi figli, così ogni voce del report può essere ricondotta direttamente all’eseguibile selezionato.

Per impostazione predefinita, lo script crea la cartella %programdata%\AppAccessTracer: usando i permessi di amministratore, è in qualunque momento possibile eliminare la cartella AppAccessTracer (basta cliccare sul pulsante Consenti).

Ti consigliamo anche

Link copiato negli appunti