Skip to main content

Remove - PUA

Overview

This is a Ninja RMM implementation of the agnostic script Remove-PUA. It manages the removal of predefined bloatware packages or lists installed bloatware based on a centrally maintained list. It offers three primary operations: bulk removal, selective removal, and bloatware listing. The remove parameter allows bypassing the PUA List to remove any installed AppxPackage.

PUA List: PUA List

EXERCISE EXTREME CAUTION - Removing system components may cause system instability.

Sample Run

Select any target, such as a computer or a group.
Go to Run > Run Automation > Script
Image1
Image2

Sample run to List Bloatware. This lists the bloatware detected on the endpoint that the script can remove:
Image3

Below attempts to remove the Microsoft.XboxApp:
Image4

The below attempts to remove all detected bloatware listed in the PUA List from the endpoint:
Image5

Dependencies

Remove-PUA

User Parameters

ParameterRequiredTypeDescription
RemoveAllTrueSwitchRemove all packages from specified categories (default: both Microsoft and ThirdParty).
CategoryFalseValidate SetFilter removal to specific categories (MsftBloatApps/ThirdPartyBloatApps).
ExceptFalseString ArrayExclude specific packages from removal operations.
RemoveTrueString ArrayRemove specific packages by name (bypasses category filters).
ListBloatwareTrueSwitchList installed packages without making changes.

Automation Setup/Import

Navigate to Administration > Library > Automation > Add > New Script
Add a New Script to the Automation library for this automation.
Image6

Name: Remove - PUA
Description: This script manages the removal of predefined bloatware packages or lists installed bloatware based on a centrally maintained list. It offers three primary operations: bulk removal, selective removal, and bloatware listing.
Categories: <Leave it blank>
Language: PowerShell
Operating System: Windows
Architecture: All
Run As: System

Image7

Paste in the following PowerShell script into the Ninja One editor
Image8

<#
.SYNOPSIS
Script to manage and remove Potentially Unwanted Applications (PUA) using NinjaRMM.

.DESCRIPTION
This script allows listing, removing, or removing all bloatware applications based on user-defined parameters.
It supports filtering by category and excluding specific applications.

.PARAMETER ListBloatware
Set to '1', 'True', or 'Yes' to list bloatware applications.

.PARAMETER Remove
A comma-separated list of applications to remove.

.PARAMETER RemoveAll
Set to '1', 'True', or 'Yes' to remove all bloatware applications.

.PARAMETER Category
Specifies the category of bloatware to remove. Supported values: 'MsftBloatApps', 'ThirdPartyBloatApps'.

.PARAMETER Except
A comma-separated list of applications to exclude when removing all bloatware.

.EXAMPLE
# List bloatware applications
$env:listbloatware = 'True'
.\Remove-PUANinjaRmm.ps1

.EXAMPLE
# Remove specific applications
$env:remove = 'App1,App2'
.\Remove-PUANinjaRmm.ps1

.EXAMPLE
# Remove all bloatware except specified applications
$env:removeall = 'True'
$env:except = 'App1,App2'
.\Remove-PUANinjaRmm.ps1

.NOTES
Author: ProValTech
Date: March 27, 2025
Version: 1.0
#>

#region Begin
Begin {
# Initialize user parameters
$ListBloatware = $env:listbloatware
$Remove = $env:remove
$RemoveAll = $env:removeall
$Category = $env:category
$Except = $env:except

if ($ListBloatware -match '1|True|Yes') {
$ListBloatware = $true
} else {
$ListBloatware = $false
}

if ($Remove -and $Remove -notmatch 'Remove' -and $Remove -match '[A-z]') {
$Remove = $Remove -replace ', ', ',' -replace ' ,', ','
$Remove = $Remove.Trim()
$Remove = $Remove.Split(',')
}

if ($RemoveAll -match '1|True|Yes') {
$RemoveAll = $true
} else {
$RemoveAll = $false
}

if ($RemoveAll -and $Category -and $Category -notmatch 'Category' -and $Category -match '[A-z]') {
if (!(('MsftBloatApps', 'ThirdPartyBloatApps') -contains $Category)) {
throw 'Invalid category. Supported categories are: MsftBloatApps, ThirdPartyBloatApps'
}
} else {
$Category = $false
}

if ($RemoveAll -and $Except -and $Except -notmatch 'Except' -and $Except -match '[A-z]') {
$Except = $Except -replace ', ', ',' -replace ' ,', ','
$Except = $Except.Trim()
$Except = $Except.Split(',')
} else {
$Except = $false
}

# Build parameters hash table
$Parameters = @{}
if ($ListBloatware) {
$Parameters.Add('ListBloatware', $true)
} elseif ($Remove) {
$Parameters.Add('Remove', $Remove)
} elseif ($RemoveAll) {
$Parameters.Add('RemoveAll', $true)
if ($Category) {
$Parameters.Add('Category', $Category)
}
if ($Except) {
$Parameters.Add('Except', $Except)
}
} else {
throw 'Invalid parameter set.'
}
}
#endregion

#region Process
Process {
# Variables
[Net.ServicePointManager]::SecurityProtocol = [enum]::ToObject([Net.SecurityProtocolType], 3072)
$ProjectName = 'Remove-PUA'
$BaseURL = 'https://file.provaltech.com/repo'
$PS1URL = "$BaseURL/script/$ProjectName.ps1"
$WorkingDirectory = "C:\ProgramData\_automation\script\$ProjectName"
$PS1Path = "$WorkingDirectory\$ProjectName.ps1"
$LogPath = "$WorkingDirectory\$ProjectName-log.txt"
$ErrorLogPath = "$WorkingDirectory\$ProjectName-Error.txt"

# Setup - Folder Structure
New-Item -Path $WorkingDirectory -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
$response = Invoke-WebRequest -Uri $PS1URL -UseBasicParsing
if (($response.StatusCode -ne 200) -and (!(Test-Path -Path $PS1Path))) {
Write-Error -Message "No pre-downloaded script exists and the script '$PS1URL' failed to download. Exiting."
return
} elseif ($response.StatusCode -eq 200) {
Remove-Item -Path $PS1Path -ErrorAction SilentlyContinue
[System.IO.File]::WriteAllLines($PS1Path, $response.Content)
}
if (!(Test-Path -Path $PS1Path)) {
Write-Error -Message 'An error occurred and the script was unable to be downloaded. Exiting.'
return
}

# Execute the downloaded script
& $PS1Path @Parameters
}
#endregion

#region End
End {
# Check logs and handle errors
if (!(Test-Path $LogPath)) {
throw 'PowerShell Failure. A Security application seems to have restricted the execution of the PowerShell Script.'
}
if (Test-Path $ErrorLogPath) {
$ErrorContent = Get-Content -Path $ErrorLogPath
throw $ErrorContent
}
Get-Content -Path $LogPath
}
#endregion

Image9

Script Variables

Click the Add button next to Script Variables.
Image10

Select the appropriate variable type (referenced below)
Image11

Fill in the values as required (referenced below)

In the box, fill in the following details and select Add to create the script variable.

Variable Type: CheckBox
Variable Name: ListBloatware
Description: Flagging this parameter will list down the installed Bloatware in script logs.
Set Default Value: <Leave it unchecked.>
Click on ADD
Image12

Variable Type: String
Variable Name: Remove
Description: The name(s) of the application or applications you wish to uninstall.
Set Default Value: <Leave it blank.>
Mandatory: False
Click on ADD
Image13

Variable Type: CheckBox
Variable Name: RemoveAll
Description: Flag this parameter to remove all bloatware by category or all found bloatware supported by the script with or without exceptions.
Set Default Value: <Leave it unchecked>
Click on ADD
Image14

Variable Type: Drop-Down
Variable Name: Category
Description: Used with RemoveAll will filter bloatware to a certain category allowing you to select just a specific category of bloatware.
Set Default Value: <Leave it unchecked.>
Mandatory: False
Option Value: Click on +Add button and add the below options:

  • MsftBloatApps
  • ThirdPartyBloatApps

Image15

Click on Add Sample screenshot after creation:
Image16

Variable Type: String
Variable Name: Except
Description: Used with RemoveAll or Category to remove all except some item(s) from a category or all together.
Set Default Value: <Leave it blank.>
Mandatory: False
Click on ADD
Image17

Click the Save button to save the Automation.
Image18

Completed Automation

Image19

Output

  • Activity Details

Image20
Image21