Rimuovi applicazioni preinstallate

Windows 10 e Windows 11 includono diverse applicazioni preinstallate che non tutti gli utenti utilizzano. Alcune possono essere utili, mentre altre possono essere considerate bloatware: software presente nell’installazione di Windows che occupa spazio e, in determinati scenari, non è necessario all’ambiente di lavoro.

Quando si gestiscono più PC, però, rimuovere manualmente le applicazioni una per una non è una soluzione pratica. PowerShell permette di automatizzare questa operazione e, soprattutto, di intervenire non soltanto sulle app installate nell’utente corrente, ma anche sui pacchetti provisioned presenti nell’immagine di Windows.

In questo articolo analizziamo uno script PowerShell che automatizza la rimozione di una serie di applicazioni UWP e dei relativi pacchetti provisioned.

Perché rimuovere il bloatware?

Un’installazione standard di Windows può contenere applicazioni che in un ambiente aziendale o su un PC dedicato non sono necessarie.

Tra gli esempi gestiti dallo script troviamo:

  • Skype
  • OneNote
  • Microsoft Office Hub
  • Microsoft Sway
  • Microsoft Zune Music
  • Microsoft Zune Video
  • Windows Communications Apps
  • Twitter
  • Netflix
  • Disney+
  • Flipboard
  • Candy Crush
  • Minecraft
  • Shazam
  • altri pacchetti appartenenti a determinate famiglie di applicazioni

L’obiettivo non è necessariamente ottenere un incremento enorme delle prestazioni. Il vantaggio principale è piuttosto quello di ottenere un sistema più essenziale e standardizzato, soprattutto quando Windows viene preparato per molti utenti o per una distribuzione aziendale.


Set-Location $PSScriptRoot

Get-AppxProvisionedPackage -online | Where-Object { $_.DisplayName -like "*skype*" -or $_.DisplayName -like "*windowscomm*" -or $_.DisplayName -like "*onenote*" -or $_.DisplayName -like "*Office*"  } | Remove-AppxProvisionedPackage -online

$apps=@(     
    "9E2F88E3.Twitter"
    "Amazon*"
    "Netflix*"
    "Disney**"
    "ClearChannelRadioDigital.iHeartRadio"
    "Flipboard.Flipboard"
    "king.com.CandyCrushSodaSaga"
    "Microsoft.3DBuilder"
    #"Microsoft.Appconnector"
    "Microsoft.BingFinance"
    "Microsoft.BingNews"
    "Microsoft.BingSports"
    "Microsoft.BingWeather"
    "Microsoft.BingFoodAndDrink"
    #"Microsoft.BingHealthAndFitness"
    "Microsoft.BingTravel"
    #"Microsoft.CommsPhone"
    #"Microsoft.ConnectivityStore"
    #"Microsoft.WindowsFeedbackHub"
    "Microsoft.Getstarted"
    #"Microsoft.Messaging"
    #"Microsoft.MicrosoftOfficeHub"
    #"Microsoft.MicrosoftSolitaireCollection"
    "Microsoft.Office.OneNote"
    "Microsoft.Office.Sway"
    #"Microsoft.People"
    "Microsoft.SkypeApp"
    "Microsoft.Windows.Phone"
    #"Microsoft.Windows.Photos"
    #"Microsoft.WindowsAlarms"
    #"Microsoft.WindowsCalculator"
    #"Microsoft.WindowsCamera"
    #"Microsoft.WindowsMaps"
    #"Microsoft.WindowsPhone"
    #"Microsoft.WindowsSoundRecorder"
    #"Microsoft.WindowsStore"
    #"Microsoft.XboxApp"
    "Microsoft.ZuneMusic"
    "Microsoft.ZuneVideo"
    "microsoft.windowscommunicationsapps"
    "Microsoft.MinecraftUWP"
    "ShazamEntertainmentLtd.Shazam"
    "SpotifyAB.SpotifyMusic"
    "king.com*"    
    "Duolingo"
    "Facebook"
    "AdobeSystemsIncorporated.AdobePhotoshopExpress"
)

foreach ($app in $apps) {    
    Get-AppxPackage -Name $app | Remove-AppxPackage
    Get-AppxPackage -Name $app -AllUsers | Remove-AppxPackage
    Get-AppXProvisionedPackage -Online | Where-Object DisplayName -EQ $app | Remove-AppxProvisionedPackage -Online
            
    $appPath="$Env:LOCALAPPDATA\Packages\$app*"
    #Remove-Item $appPath -Recurse -Force -ErrorAction 0
}

exit(0)

Questa struttura rende lo script relativamente semplice da personalizzare. Se un’applicazione non deve essere rimossa, è sufficiente eliminarla dall’elenco oppure commentarla:

#"Microsoft.MicrosoftSolitaireCollection"

Le righe commentate con # non vengono eseguite.
Alcuni nomi utilizzano caratteri jolly, ad esempio:

"Netflix*"

L’asterisco permette di corrispondere a più nomi che iniziano con quella stringa. È particolarmente utile perché il nome effettivo del pacchetto può variare tra versioni di Windows e versioni dell’applicazione.

Spiegazione dello script

Il cuore dello script è:

foreach ($app in $apps) {
    Get-AppxPackage -Name $app | Remove-AppxPackage

    Get-AppxPackage -Name $app -AllUsers |
        Remove-AppxPackage

    Get-AppXProvisionedPackage -Online |
        Where-Object DisplayName -EQ $app |
        Remove-AppxProvisionedPackage -Online
}

Per ogni elemento presente nell’array $apps, vengono eseguite tre operazioni.

1. Rimozione dal profilo corrente

Get-AppxPackage -Name $app |
    Remove-AppxPackage

Viene individuato il pacchetto installato nel contesto dell’utente corrente e, se presente, viene rimosso.

2. Rimozione per tutti gli utenti

Get-AppxPackage -Name $app -AllUsers |
    Remove-AppxPackage

Con -AllUsers lo script prova a individuare il pacchetto anche nei profili degli altri utenti presenti sul computer. Questa operazione è particolarmente interessante in scenari amministrativi, dove il PC può essere utilizzato da più persone.

3. Rimozione dall’immagine Windows

Infine:

Get-AppXProvisionedPackage -Online |
    Where-Object DisplayName -EQ $app |
    Remove-AppxProvisionedPackage -Online

viene nuovamente verificata la presenza del pacchetto provisioned e, se il nome corrisponde, il pacchetto viene rimosso. In questo modo lo script tenta di coprire sia le app già installate sia quelle che Windows potrebbe installare automaticamente per i nuovi utenti.

Una riga interessante, ma disattivata

Nello script troviamo anche:

$appPath="$Env:LOCALAPPDATA\Packages\$app*"
#Remove-Item $appPath -Recurse -Force -ErrorAction 0

La seconda riga è preceduta da #, quindi non viene eseguita. Se venisse attivata, tenterebbe di eliminare direttamente le directory dei pacchetti presenti nella cartella:

%LOCALAPPDATA%\Packages

La rimozione manuale delle directory sotto Packages non è equivalente alla normale disinstallazione tramite AppX e può creare problemi se eseguita indiscriminatamente, l’abilitazione viene eseguita quando è necessario eseguire una preparazione attraverso script OOBE. Per questo è ragionevole lasciare questa istruzione commentata e utilizzare i cmdlet AppX dedicati.

AppxPackagepowershell
Commenti (0)
Aggiungi un commento