Perché in Windows 11 rimuovere un'app non significa disinstallarla

Windows 11 può mantenere sul disco i file delle app MSIX e AppX anche dopo la loro rimozione. Ecco come individuare questi pacchetti e disinstallarli correttamente.

Rimuovere un’app da Windows 11 non comporta sempre la cancellazione immediata dei file che la compongono. L’icona può sparire dal menu Start, l’applicazione può non comparire più nella finestra App installate e l’utente può non avere alcun modo per avviarla; il relativo pacchetto, tuttavia, può continuare a occupare spazio nella cartella protetta %programfiles%\WindowsApps.

Non si tratta necessariamente di un errore o di un residuo abbandonato: Windows gestisce le applicazioni distribuite nei formati MSIX e AppX usando un modello differente rispetto ai tradizionali programmi Win32 installati con un file EXE o MSI.

Microsoft lo sintetizza con una frase apparentemente contraddittoria: “Remove is not uninstall“. La rimozione delle app MSIX/AppX annulla le registrazioni per l’utente interessato, ma la cancellazione fisica del pacchetto avviene soltanto quando il sistema non rileva più riferimenti che ne richiedono la presenza.

Il chiarimento pubblicato dall’azienda di Redmond spiega perché la cartella WindowsApps possa contenere applicazioni fantasma, versioni multiple, framework condivisi e pacchetti che sembrano non appartenere ad alcun programma installato. E soprattutto permette di capire quali verifiche svolgere prima di tentare di recuperare spazio sull’unità di sistema.

Che cosa sono AppX e MSIX

AppX è il formato introdotto da con Windows 8 per distribuire le applicazioni del Microsoft Store e, successivamente, le app UWP. MSIX ne rappresenta l’evoluzione moderna: conserva il modello basato su identità, manifest, firma digitale e gestione controllata del pacchetto, estendendolo alle applicazioni desktop e agli scenari aziendali più complessi.

Microsoft definisce MSIX l’attuale formato di packaging delle applicazioni Windows: quando un programma è “confezionato” in questo modo, Windows gli assegna un’identità composta da elementi come nome, creatore e versione; il sistema può quindi seguirne file, dipendenze, aggiornamenti e registrazioni.

Le estensioni più comuni sono:

  • .appx e .appxbundle, legate soprattutto alla generazione precedente;
  • .msix e .msixbundle, oggi preferite per i nuovi pacchetti;
  • .appinstaller, un file XML che descrive da dove scaricare un pacchetto e come aggiornarlo.

Un bundle può contenere varianti diverse della stessa applicazione, ad esempio per architettura x64, Arm64, lingua o risoluzione: Windows seleziona soltanto le risorse necessarie per lo specifico dispositivo.

Anche un normale programma Win32 scritto con WinForms, WPF, Electron, Qt o Windows App SDK (abbiamo parlato delle critiche rivolte a Microsoft, anche dagli sviluppatori, per le tante interfacce via via implementate in Windows…) può essere distribuito come pacchetto MSIX. Microsoft offre inoltre strumenti per convertire applicazioni desktop esistenti senza disporre necessariamente del codice sorgente.

Da dove arrivano i pacchetti MSIX e AppX

La fonte più evidente è il Microsoft Store: molte applicazioni scaricate da questa sorgente arrivano come pacchetti MSIX, AppX o relativi bundle. Non bisogna però concludere che ogni programma presente nello Store usi MSIX: dal 2021 Microsoft accetta anche applicazioni Win32 non pacchettizzate, distribuite tramite i tradizionali installer MSI o EXE.

Una seconda fonte è Windows stesso: Blocco note, Terminale, Foto, Calcolatrice, Paint, App Installer e numerosi altri componenti integrati usano il sistema di packaging moderno. Alcuni pacchetti fanno parte dell’immagine iniziale del sistema operativo; altri vengono scaricati o aggiornati tramite lo Store dopo la prima configurazione (icona Download in basso a sinistra nell’interfaccia).

I produttori di PC possono aggiungere ulteriori applicazioni all’immagine OEM. Strumenti per l’assistenza, pannelli di controllo, servizi promozionali e utilità hardware possono risultare provisioned, cioè predisposti per essere registrati automaticamente quando un utente accede per la prima volta.

Le aziende possono distribuire pacchetti attraverso Microsoft Intune, Configuration Manager, criteri MDM, script PowerShell, immagini personalizzate o portali aziendali: un’applicazione MSIX può quindi essere installata anche senza passare dallo Store pubblico.

Esiste poi il sideloading. L’App Installer permette di aprire direttamente file .msix, .msixbundle, .appx e .appxbundle, anche quando provengono da un sito web, da una cartella condivisa o da un server interno. I pacchetti firmati e attendibili possono essere installati con un doppio clic; un file .appinstaller può anche configurare il controllo automatico degli aggiornamenti.

Anche Microsoft WinGet può installare applicazioni provenienti dal Microsoft Store oppure dal altri repository: il formato finale dipende dal pacchetto selezionato. WinGet gestisce tanto applicazioni MSIX quanto normali setup in formato EXE e MSI.

Perché MSIX non funziona come un normale setup Win32

Un installer Win32 tradizionale copia file, crea cartelle, modifica il registro, registra servizi e aggiunge collegamenti. L’uninstaller fornito dallo sviluppatore dovrebbe eseguire le operazioni inverse, ma può lasciare sul sistema dati e componenti (in alcuni casi potrebbe trattarsi di una scelta deliberata).

Con MSIX è Windows 11 a gestire il contenuto del pacchetto: il sistema conosce i file dichiarati nel manifest, l’identità, la versione, le dipendenze e gli utenti per i quali l’app risulta registrata.

Il ciclo di vita, come evidenzia Microsoft, si divide in quattro operazioni:

  1. Stage colloca il payload sul dispositivo, normalmente in WindowsApps.
  2. Register associa il pacchetto a un utente e attiva menu Start, protocolli, associazioni dei file e altre estensioni dichiarate.
  3. Deregister elimina tale associazione per l’utente interessato.
  4. Destage cancella fisicamente il payload quando nessun riferimento ne richiede più la presenza.

La rimozione dell’app comprende sempre il deregistering, ma il destage resta condizionato. Un’app può quindi essere rimossa correttamente dal proprio profilo mentre i file restano disponibili per un altro account, per una dipendenza condivisa o per un successivo provisioning. Spieghiamo meglio.

Registrazione e provisioning non sono la stessa cosa

La registrazione indica che un’app è disponibile per un determinato account. Il provisioning indica invece che Windows deve registrare automaticamente il pacchetto per i nuovi utenti che accederanno al dispositivo (si pensi al momento in cui si richiede la creazione di un nuovo account). Microsoft usa questo meccanismo per le applicazioni incluse nell’immagine di Windows e gli amministratori possono sfruttarlo nelle immagini aziendali.

Sono quindi possibili varie combinazioni:

  • pacchetto registrato per l’utente corrente;
  • pacchetto registrato soltanto per altri utenti;
  • pacchetto provisioned ma non ancora registrato per l’utente corrente;
  • pacchetto presente sull’unità locale senza una registrazione visibile;
  • framework condiviso richiesto da altre applicazioni.

Rimuovere l’app dal menu Start o dalla schermata App installate agisce normalmente sulla registrazione per il singolo utente corrente. Non elimina necessariamente il provisioning e non garantisce il destage.

Verificare lo spazio dalle Impostazioni di Windows 11

Per cominciare, è bene sempre partire scrivendo Archiviazione nella casella di ricerca di Windows 11. Selezionando Impostazioni di archiviazione, si può verificare la distribuzione dello spazio su disco mentre con un clic su App installate, si possono ordinare le applicazioni per dimensione. Il dato non è sempre perfetto: alcuni programmi Win32 non comunicano correttamente lo spazio occupato e i pacchetti condivisi possono rendere difficile attribuire ogni byte a una singola app.

La finestra App installate, specie ordinando per dimensione o data di installazione, permette di individuare giochi, strumenti OEM e programmi non più utilizzati.

La sezione File temporanei di Archiviazione può invece rimuovere cache, file di ottimizzazione recapito e altri dati recuperabili. Non rappresenta però uno strumento per forzare la cancellazione dei pacchetti MSIX ancora referenziati.

Per farsi un’idea dell’occupazione di spazio su disco, suggeriamo di utilizzare WinDirStat avviandolo con i diritti di amministratore.

Come elencare tutte le app MSIX e AppX

Per verificare i pacchetti registrati per l’utente corrente si può aprire una finestra PowerShell con i diritti di amministratore premendo Windows+X, Windows PowerShell (amministratore) o Terminale (Admin) e digitare quanto segue:

Get-AppxPackage | Sort-Object Name | Select-Object Name, PackageFullName, InstallLocation

Per cercare un’app specifica:

Get-AppxPackage -Name "*Xbox*"

È anche possibile controllare tutti gli utenti usando una sintassi leggermente diversa:

Get-AppxPackage -AllUsers | Sort-Object Name | Select-Object Name, PackageFullName, PackageUserInformation, InstallLocation

La proprietà PackageUserInformation è particolarmente utile perché mostra gli account ai quali il pacchetto risulta associato.

Esportare l’elenco per analizzarlo con calma

Su un PC utilizzato da tempo, l’output può comprendere centinaia di elementi: è più comodo salvarlo in un file CSV:

Get-AppxPackage -AllUsers |
    Select-Object Name,
        PackageFullName,
        PackageFamilyName,
        InstallLocation,
        @{
            Name = "Utenti"
            Expression = {
                ($_.PackageUserInformation |
                    ForEach-Object {
                        $userId = $_.UserSecurityId

                        $nome = $userId.UserName
                        $sid  = $userId.Sid

                        if ([string]::IsNullOrWhiteSpace($nome)) {
                            $nome = $sid
                        }

                        "{0} ({1}) [{2}]" -f `
                            $nome,
                            $sid,
                            $_.InstallState
                    }) -join "; "
            }
        } |
    Export-Csv `
        "$env:USERPROFILE\Desktop\Pacchetti-Appx.csv" `
        -NoTypeInformation `
        -Encoding UTF8

Il file Pacchetti-Appx.csv, creato sul desktop di Windows 11, può essere aperto con Excel o LibreOffice Calc e filtrato per nome, posizione o utente.

Nel file CSV la colonna Utenti indica per quali account ciascun pacchetto risulta registrato e ne riporta anche lo stato. La voce [Installed] identifica un’app disponibile per l’utente indicato, mentre [Staged], spesso associata all’account di sistema, segnala un pacchetto già presente sul dispositivo ma non necessariamente registrato come applicazione utilizzabile da quell’account.

Come controllare le app provisioned

Per vedere i pacchetti predisposti per i nuovi utenti:

Get-AppxProvisionedPackage -Online | Sort-Object DisplayName | Select-Object DisplayName, PackageName

Il risultato non coincide con quello di Get-AppxPackage -AllUsers: il primo comando esamina il provisioning presente nell’immagine Windows in uso; il secondo controlla le registrazioni degli account già esistenti.

Per cercare un elemento specifico:

Get-AppxProvisionedPackage -Online | Where-Object DisplayName -like "*Xbox*"

Una stessa applicazione può comparire in entrambi gli elenchi perché risulta già registrata per uno o più utenti e, contemporaneamente, predisposta per quelli futuri.

Come stimare lo spazio occupato dai pacchetti

La cartella WindowsApps è protetta e i normali strumenti possono non riuscire a esaminarla correttamente (WinDirStat lo fa…). Ad ogni modo, con un semplice script PowerShell, da copiare e incollare nella finestra del terminale, è possibile calcolare una stima delle dimensioni dei pacchetti presenti:

$packages = Get-AppxPackage

$report = foreach ($package in $packages) {
    $size = $null

    if ($package.InstallLocation -and
        (Test-Path -LiteralPath $package.InstallLocation)) {
        try {
            $files = Get-ChildItem -LiteralPath $package.InstallLocation -File -Recurse -Force -ErrorAction Stop
            $size = ($files | Measure-Object -Property Length -Sum).Sum
        }
        catch {
            $size = $null
        }
    }

    [PSCustomObject]@{
        Name        = $package.Name
        Version     = $package.Version
        InstallPath = $package.InstallLocation
        SizeGB      = if ($null -ne $size) {
            [math]::Round($size / 1GB, 2)
        } else {
            "Non accessibile"
        }
    }
}

$report |
    Sort-Object @{
        Expression = {
            if ($_.SizeGB -is [double]) {
                $_.SizeGB
            } else {
                -1
            }
        }
        Descending = $true
    } |
    Format-Table -AutoSize

Come rimuovere correttamente un’app dall’utente corrente

Dopo aver identificato con certezza il pacchetto, si può usare:

Get-AppxPackage -Name "NOME.PACCHETTO" | Remove-AppxPackage

Prima dell’operazione è consigliabile verificare il risultato del filtro:

Get-AppxPackage -Name "NOME.PACCHETTO" | Select-Object Name, PackageFullName, InstallLocation

Come rimuovere un’app dagli altri utenti

Prima di procedere conviene verificare chi utilizza il pacchetto:

Get-AppxPackage -AllUsers -Name "NOME.PACCHETTO" | Select-Object Name, PackageFullName, PackageUserInformation

Da PowerShell aperto come amministratore, la rimozione può essere estesa a tutti gli utenti:

Get-AppxPackage -AllUsers -Name "NOME.PACCHETTO" | Remove-AppxPackage -AllUsers

L’operazione deve riguardare soltanto pacchetti identificati con precisione. Non è prudente applicare indiscriminatamente Remove-AppxPackage all’intero output di Get-AppxPackage -AllUsers: alcuni elementi sono componenti di Windows o dipendenze condivise.

Come eliminare anche il provisioning

Se il pacchetto risulta provisioned, rimuoverlo dagli utenti esistenti non basta a impedirne la registrazione dell’app per i nuovi profili via via creati.

Dopo aver individuato il nome esatto dell’applicazione con il comando che segue:

Get-AppxProvisionedPackage -Online | Where-Object DisplayName -like "*NOME*"

Si può procedere con la rimozione del provisioning:

Remove-AppxProvisionedPackage -Online -PackageName "NOME_COMPLETO_DEL_PACCHETTO"

In alternativa:

Get-AppxProvisionedPackage -Online | Where-Object DisplayName -eq "NOME.PACCHETTO" | Remove-AppxProvisionedPackage -Online

La cmdlet elimina il pacchetto dall’immagine online affinché non sia più installato in automatico per i nuovi account. Non cancella però le eventuali registrazioni già esistenti.

Per una rimozione amministrativa completa bisogna pertanto controllare entrambi gli ambiti:

Get-AppxPackage -AllUsers -Name "NOME.PACCHETTO" | Remove-AppxPackage -AllUsers

Get-AppxProvisionedPackage -Online | Where-Object DisplayName -eq "NOME.PACCHETTO" | Remove-AppxProvisionedPackage -Online

Nemmeno questa sequenza garantisce però che il payload sia cancellato immediatamente: Windows 11 può conservare riferimenti ulteriori e procedere al destage soltanto quando lo ritiene sicuro.

Il collegamento con le app fantasma di Windows 11

Su IlSoftware.it abbiamo già esaminato un caso nel quale Windows 11 conservava decine di gigabyte di giochi e applicazioni invisibili nella schermata App installate: nell’articolo spiegavamo come cercare i pacchetti, rimuovere il provisioning e intervenire sui meccanismi che possono proporre nuovamente determinate app.

La spiegazione fornita da Microsoft con il suo “Remove is not uninstall” aggiunge il tassello architetturale che mancava: un’app invisibile non corrisponde necessariamente a un pacchetto disinstallato male. Il payload può essere stato sottoposto a staging ma non risultare registrato per l’utente corrente; può appartenere a un altro account, essere provisioned per i nuovi profili oppure restare referenziato dal motore MSIX.

In questa nuova tornata abbiamo voluto mettere in evidenza perché, anche dopo aver eliminato registrazioni e provisioning, una cartella possa non scomparire immediatamente.

Ti consigliamo anche

Link copiato negli appunti