Come rimuovere i bloatware Microsoft in modo efficace utilizzando uno script PowerShell

Nel panorama IT, il bloatware rappresenta spesso una sfida significativa sia per i singoli utenti che per i professionisti IT che gestiscono più sistemi. Per bloatware si intende il software indesiderato preinstallato su un nuovo computer, che può rallentare le prestazioni e occupare inutilmente spazio nel sistema.

Affrontare questo problema in modo efficace è fondamentale e gli script PowerShell offrono una soluzione potente per farlo. In questo articolo analizzeremo uno specifico script PowerShell progettato per rimuovere i bloatware comuni, fornendo una spiegazione dettagliata della sua struttura, casi d’uso, confronti, FAQ e best practice.

Background

Il bloatware, noto anche come software preinstallato, spesso include versioni di prova di software, strumenti promozionali e altre applicazioni non necessarie che consumano risorse preziose.

Per i Managed Service Provider (MSP) e i professionisti IT, la rimozione di queste applicazioni su numerosi dispositivi può essere lunga e noiosa. Questo script PowerShell automatizza la rimozione del bloatware più comune, semplificando il processo e garantendo un sistema più pulito ed efficiente.

Lo script per rimuovere i bloatware:

#Requires -Version 5.1

<#
.SYNOPSIS
    Removes common bloatware that is often pre-installed on a PC.
.DESCRIPTION
    Removes common bloatware that is often pre-installed on a PC.
.EXAMPLE
    -AppsToRemove "Amazon.com.Amazon, AmazonVideo.PrimeVideo, Clipchamp.Clipchamp, Disney.37853FC22B2CE, DropboxInc.Dropbox, Facebook.Facebook, Facebook.InstagramBeta, king.com.BubbleWitch3Saga, king.com.CandyCrushSaga, king.com.CandyCrushSodaSaga, 5A894077.McAfeeSecurity, 4DF9E0F8.Netflix, SpotifyAB.SpotifyMusic, BytedancePte.Ltd.TikTok, 5319275A.WhatsAppDesktop"
    
    [Warn] Amazon.com.Amazon is not installed!
    Attempting to remove AmazonVideo.PrimeVideo...
    Successfully removed AmazonVideo.PrimeVideo.
    Attempting to remove Clipchamp.Clipchamp...
    Successfully removed Clipchamp.Clipchamp.
    Attempting to remove Disney.37853FC22B2CE...
    Successfully removed Disney.37853FC22B2CE.
    Attempting to remove DropboxInc.Dropbox...
    Successfully removed DropboxInc.Dropbox.
    Attempting to remove FACEBOOK.FACEBOOK...
    Successfully removed FACEBOOK.FACEBOOK.
    Attempting to remove Facebook.InstagramBeta...
    Successfully removed Facebook.InstagramBeta.
    [Warn] king.com.BubbleWitch3Saga is not installed!
    [Warn] king.com.CandyCrushSaga is not installed!
    [Warn] king.com.CandyCrushSodaSaga is not installed!
    Attempting to remove 5A894077.McAfeeSecurity...
    Successfully removed 5A894077.McAfeeSecurity.
    Attempting to remove 4DF9E0F8.Netflix...
    Successfully removed 4DF9E0F8.Netflix.
    Attempting to remove SpotifyAB.SpotifyMusic...
    Successfully removed SpotifyAB.SpotifyMusic.
    Attempting to remove BytedancePte.Ltd.TikTok...
    Successfully removed BytedancePte.Ltd.TikTok.
    Attempting to remove 5319275A.WhatsAppDesktop...
    Successfully removed 5319275A.WhatsAppDesktop.

PARAMETER: -AppsToRemove "AmazonVideo.PrimeVideo"
    A comma-separated list of Appx package names you would like to remove.

PARAMETER: -OverrideWithCustomField "ReplaceMeWithAmultilineCustomFieldName"
    Name of a multiline custom field to retrieve the 'Apps To Remove' list.

.NOTES
    Minimum OS Architecture Supported: Windows 10, Windows Server 2016
    Release Notes: Initial Release
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#>

[CmdletBinding()]
param (
    [Parameter()]
    [String]$AppsToRemove = "Amazon.com.Amazon, AmazonVideo.PrimeVideo, Clipchamp.Clipchamp, Disney.37853FC22B2CE, DropboxInc.Dropbox, Facebook.Facebook, Facebook.InstagramBeta, king.com.BubbleWitch3Saga, king.com.CandyCrushSaga, king.com.CandyCrushSodaSaga, 5A894077.McAfeeSecurity, 4DF9E0F8.Netflix, SpotifyAB.SpotifyMusic, BytedancePte.Ltd.TikTok, 5319275A.WhatsAppDesktop",
    [Parameter()]
    [String]$OverrideWithCustomField
)

begin {
    # Replace parameters with dynamic script variables.
    if ($env:appsToRemove -and $env:appsToRemove -notlike "null") { $AppsToRemove = $env:appsToRemove }
    if ($env:overrideWithCustomFieldName -and $env:overrideWithCustomFieldName -notlike "null") { $OverrideWithCustomField = $env:overrideWithCustomFieldName }

    $AppList = New-Object System.Collections.Generic.List[string]

    function Get-NinjaProperty {
        [CmdletBinding()]
        Param(
            [Parameter(Mandatory = $True, ValueFromPipeline = $True)]
            [String]$Name
        )
    
        # We'll redirect error output to the success stream to make it easier to error out if nothing was found or something else went wrong.
        $NinjaPropertyValue = Ninja-Property-Get -Name $Name 2>&1
    
        # If we received some sort of error it should have an exception property and we'll exit the function with that error information.
        if ($NinjaPropertyValue.Exception) { throw $NinjaPropertyValue }
    
        if (-not $NinjaPropertyValue) {
            throw [System.NullReferenceException]::New("The Custom Field '$Name' is empty!")
        }
    
        $NinjaPropertyValue
    }

    if ($OverrideWithCustomField) {
        Write-Host "Attempting to retrieve uninstall list from '$OverrideWithCustomField'."
        try {
            $AppsToRemove = Get-NinjaProperty -Name $OverrideWithCustomField -ErrorAction Stop
        }
        catch {
            # If we ran into some sort of error we'll output it here.
            Write-Host "[Error] $($_.Exception.Message)"
            exit 1
        }
    }

    # Check if apps to remove are specified; otherwise, list all Appx packages and exit
    if (!$AppsToRemove) {
        Write-Host "[Error] Nothing given to remove? Please specify one of the below packages."
        Get-AppxPackage -AllUsers | Select-Object Name | Sort-Object Name | Out-String | Write-Host
        exit 1
    }

    # Regex to detect invalid characters in Appx package names
    $InvalidCharacters = "[#!@&$)(<>?|:;\/{}^%`"']+"

    # Process each app name after splitting the input string
    if ($AppsToRemove -match ",") {
        $AppsToRemove -split ',' | ForEach-Object {
            $App = $_.Trim()
            if ($App -match '^[-.]' -or $App -match '\.\.|--' -or $App -match '[-.]$' -or $App -match "\s" -or $App -match $InvalidCharacters) {
                Write-Host "[Error] Invalid character in '$App'. Appx package names cannot contain '#!@&$)(<>?|:;\/{}^%`"'', start with '.-', contain a space, or have consecutive '.' or '-' characters."
                $ExitCode = 1
                return
            }

            if ($App.Length -ge 50) {
                Write-Host "[Error] Appx package name of '$App' is invalid Appx package names must be less than 50 characters."
                $ExitCode = 1
                return
            }

            $AppList.Add($App)
        }
    }
    else {
        $AppsToRemove = $AppsToRemove.Trim()
        if ($AppsToRemove -match '^[-.]' -or $AppsToRemove -match '\.\.|--' -or $AppsToRemove -match '[-.]$' -or $AppsToRemove -match "\s" -or $AppsToRemove -match $InvalidCharacters) {
            Write-Host "[Error] Invalid character in '$AppsToRemove'. AppxPackage names cannot contain '#!@&$)(<>?|:;\/{}^%`"'', start with '.-', contain a space, or have consecutive '.' or '-' characters."
            Get-AppxPackage -AllUsers | Select-Object Name | Sort-Object Name | Out-String | Write-Host
            exit 1
        }

        if ($AppsToRemove.Length -ge 50) {
            Write-Host "[Error] Appx package name of '$AppsToRemove' is invalid Appx package names must be less than 50 characters."
            Get-AppxPackage -AllUsers | Select-Object Name | Sort-Object Name | Out-String | Write-Host
            exit 1
        }

        $AppList.Add($AppsToRemove)
    }

    # Exit if no valid apps to remove
    if ($AppList.Count -eq 0) {
        Write-Host "[Error] No valid apps to remove!"
        Get-AppxPackage -AllUsers | Select-Object Name | Sort-Object Name | Out-String | Write-Host
        exit 1
    }

    # Function to check if the script is running with Administrator privileges
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
    }

    if (!$ExitCode) {
        $ExitCode = 0
    }
}
process {
    # Check for Administrator privileges before attempting to remove any packages
    if (!(Test-IsElevated)) {
        Write-Host -Object "[Error] Access Denied. Please run with Administrator privileges."
        exit 1
    }

    # Attempt to remove each specified app
    foreach ($App in $AppList) {
        $AppxPackage = Get-AppxPackage -AllUsers | Where-Object { $_.Name -Like "*$App*" } | Sort-Object Name -Unique
        $ProvisionedPackage = Get-AppxProvisionedPackage -Online | Where-Object { $_.DisplayName -like "*$App*" } | Sort-Object DisplayName -Unique
        
        # Warn if the app is not installed
        if (!$AppxPackage -and !$ProvisionedPackage) {
            Write-Host "`n[Warn] $App is not installed!"
            continue
        }

        # Output an error if too many apps were selected for uninstall
        if ($AppxPackage.Count -gt 1) {
            Write-Host "[Error] Too many Apps were found with the name '$App'. Please re-run with a more specific name."
            Write-Host ($AppxPackage | Select-Object Name | Sort-Object Name | Out-String)
            $ExitCode = 1
            continue
        }
        if ($ProvisionedPackage.Count -gt 1) {
            Write-Host "[Error] Too many Apps were found with the name '$App'. Please re-run with a more specific name."
            Write-Host ($ProvisionedPackage | Select-Object DisplayName | Sort-Object DisplayName | Out-String)
            ExitCode = 1
            continue
        }

        # Output an error if two different packages got selected.
        if ($ProvisionedPackage -and $AppxPackage -and $AppxPackage.Name -ne $ProvisionedPackage.DisplayName) {
            Write-Host "[Error] Too many Apps were found with the name '$App'. Please re-run with a more specific name."
            Write-Host ($ProvisionedPackage | Select-Object DisplayName | Sort-Object DisplayName | Out-String)
            ExitCode = 1
            continue
        }

        try {
            # Remove the provisioning package first.
            if ($ProvisionedPackage) {
                Write-Host "`nAttempting to remove provisioning package $($ProvisionedPackage.DisplayName)..."
                Get-AppxProvisionedPackage -Online | Where-Object { $_.DisplayName -like "*$App*" } | Remove-AppxProvisionedPackage -Online -AllUsers | Out-Null
                Write-Host "Successfully removed provisioning package $($ProvisionedPackage.DisplayName)."
            }

            # Remove the installed instances.
            if ($AppxPackage) {
                Write-Host "`nAttempting to remove $($AppxPackage.Name)..."
                Get-AppxPackage -AllUsers | Where-Object { $_.Name -Like "*$App*" } | Remove-AppxPackage -AllUsers
                Write-Host "Successfully removed $($AppxPackage.Name)."
            }
        }
        catch {
            Write-Host "[Error] $($_.Exception.Message)"
            $ExitCode = 1
        }
    }

    exit $ExitCode
}
end {
    
    
    
}

 

Analisi dettagliata dello script per rimuovere i bloatware

Questo script PowerShell è stato progettato per rimuovere un elenco di applicazioni bloatware comuni spesso presenti sui nuovi PC Windows. Ecco una spiegazione passo per passo di come funziona lo script per rimuovere i bloatware:

1. Inizializzazione dello script e definizione dei parametri:

Lo script per rimuovere i bloatware inizia definendo due parametri: $AppsToRemove e $OverrideWithCustomField. $AppsToRemove contiene un elenco separato da virgole di nomi di pacchetti di applicazioni da rimuovere, mentre $OverrideWithCustomField può essere usato per specificare un nome di campo personalizzato contenente l’elenco di applicazioni da rimuovere.

2. Gestione dinamica dei parametri:

Lo script controlla le variabili d’ambiente che potrebbero sovrascrivere i parametri iniziali, garantendo la flessibilità in vari scenari di distribuzione.

3. Recupero di campi personalizzati:

Se viene specificato un campo personalizzato, lo script tenta di recuperare l’elenco delle applicazioni da esso utilizzando la funzione Get-NinjaProperty. In questo modo i professionisti IT possono modificare dinamicamente l’elenco delle applicazioni da rimuovere.

4. Convalida e preparazione dell’elenco:

Lo script per rimuovere i bloatware convalida i nomi delle app, verificando la presenza di caratteri non validi, la lunghezza e la formattazione. I nomi delle applicazioni valide vengono aggiunti a $AppList.

5. Controllo dei privilegi di amministratore:

Prima di procedere alla rimozione, lo script per rimuovere i bloatware si assicura di essere in esecuzione con privilegi di amministratore utilizzando la funzione Test-IsElevated.

6. Processo di rimozione dell’app:

Lo script per rimuovere i bloatware esegue l’iterazione di ogni applicazione nell’elenco, tentando di rimuovere sia le istanze dell’applicazione in provisioning che quelle installate.

Casi d’uso potenziali

Caso di studio ipotetico

Immagina un professionista IT che gestisce una serie di nuovi computer portatili per un cliente aziendale. Ogni portatile ha varie applicazioni bloatware preinstallate di cui il cliente non ha bisogno. Utilizzando questo script PowerShell, il professionista IT può rimuovere rapidamente queste applicazioni indesiderate da tutti i portatili in una frazione del tempo necessario per farlo manualmente. Il risultato è un sistema più pulito e veloce, pronto per la distribuzione.

Confronti

Rimozione manuale e script PowerShell:

  • Rimozione manuale: Richiede tempo e fatica, soprattutto su più dispositivi.
  • Script PowerShell: Automatico, efficiente e in grado di gestire senza problemi le operazioni di massa.

Software di terze parti e script PowerShell:

  • Software di terze parti: Spesso richiedono l’installazione, la concessione di licenze e potrebbero introdurre costi aggiuntivi.
  • Script PowerShell: Leggero, non richiede installazioni aggiuntive ed è completamente personalizzabile.

Domande frequenti

D: Questo script può rimuovere qualsiasi applicazione?

R: Lo script è stato progettato per rimuovere i bloatware comuni, ma può essere personalizzato per rimuovere qualsiasi applicazione regolando il parametro $AppsToRemove.

D: Cosa succede se lo script per rimuovere i bloatware incontra un’applicazione non installata?

R: Lo script per rimuovere i bloatware emette un messaggio di avviso che indica che l’applicazione non è installata e continua con l’applicazione successiva.

D: Ho bisogno di disporre dei privilegi di amministratore per eseguire questo script?

R: Sì, lo script per rimuovere i bloatware verifica la presenza dei privilegi di amministratore e non procederà senza di essi.

Implicazioni

Rimuovere i bloatware migliora le prestazioni del sistema, libera risorse e migliora l’esperienza dell’utente. Per quanto riguarda la sicurezza informatica, la rimozione delle applicazioni non necessarie riduce le potenziali vulnerabilità, rendendo i sistemi più sicuri.

Raccomandazioni

  • Testa in ambiente controllato: Prima di distribuire lo script per rimuovere i bloatware su più dispositivi, testalo in un ambiente controllato per assicurarti che si comporti come previsto.
  • Conserva un backup: Prima di eseguire lo script per rimuovere i bloatware, esegui sempre un backup dei dati importanti per evitare perdite accidentali di dati.
  • Aggiornamenti regolari: Aggiorna periodicamente l’elenco delle app da rimuovere, poiché nuovi bloatware possono essere introdotti con gli aggiornamenti del sistema o con i nuovi modelli di dispositivi.

Considerazioni finali

La gestione del bloatware è un aspetto fondamentale per mantenere i sistemi puliti, efficienti e sicuri. Questo script PowerShell offre una soluzione automatizzata e potente per i professionisti IT e gli MSP. Integrando questi strumenti nel flusso di lavoro, puoi semplificare la preparazione del sistema, ridurre il lavoro manuale e migliorare le prestazioni complessive del sistema. Per soluzioni di gestione IT complete, prendi in considerazione strumenti come NinjaOne, che offrono solide funzionalità per la manutenzione e la gestione del sistema.

Passi successivi

La creazione di un team IT efficiente ed efficace richiede una soluzione centralizzata che funga da principale strumento per la fornitura di servizi. NinjaOne consente ai team IT di monitorare, gestire, proteggere e supportare tutti i dispositivi, ovunque essi si trovino, senza la necessità di una complessa infrastruttura locale.

Per saperne di più su NinjaOne Endpoint Management, fai un tour dal vivo, o inizia la tua prova gratuita della piattaforma NinjaOne.

Categorie:

Ti potrebbe interessare anche

×

Guarda NinjaOne in azione!

Inviando questo modulo, accetto La politica sulla privacy di NinjaOne.

Termini e condizioni NinjaOne

Cliccando sul pulsante “Accetto” qui sotto, dichiari di accettare i seguenti termini legali e le nostre condizioni d’uso:

  • Diritti di proprietà: NinjaOne possiede e continuerà a possedere tutti i diritti, i titoli e gli interessi relativi allo script (compreso il copyright). NinjaOne ti concede una licenza limitata per l’utilizzo dello script in conformità con i presenti termini legali.
  • Limitazione d’uso: Puoi utilizzare lo script solo per legittimi scopi personali o aziendali interni e non puoi condividere lo script con altri soggetti.
  • Divieto di ripubblicazione: In nessun caso ti è consentito ripubblicare lo script in una libreria di script appartenente o sotto il controllo di un altro fornitore di software.
  • Esclusione di garanzia: Lo script viene fornito “così com’è” e “come disponibile”, senza garanzie di alcun tipo. NinjaOne non promette né garantisce che lo script sia privo di difetti o che soddisfi le tue esigenze o aspettative specifiche.
  • Assunzione del rischio: L’uso che farai dello script è da intendersi a tuo rischio. Riconosci che l’utilizzo dello script comporta alcuni rischi intrinseci, che comprendi e sei pronto ad assumerti.
  • Rinuncia e liberatoria: Non riterrai NinjaOne responsabile di eventuali conseguenze negative o indesiderate derivanti dall’uso dello script e rinuncerai a qualsiasi diritto legale o di equità e a qualsiasi rivalsa nei confronti di NinjaOne in relazione all’uso dello script.
  • EULA: Se sei un cliente NinjaOne, l’uso dello script è soggetto al Contratto di licenza con l’utente finale (EULA) applicabile.