-
-
Save loopyd/07a7242ece52793c29947481324822c6 to your computer and use it in GitHub Desktop.
Remove HP bloatware
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ██████╗ ███████╗███╗ ███╗ ██████╗ ██╗ ██╗███████╗ ██╗ ██╗██████╗ | |
# ██╔══██╗██╔════╝████╗ ████║██╔═══██╗██║ ██║██╔════╝ ██║ ██║██╔══██╗ | |
# ██████╔╝█████╗ ██╔████╔██║██║ ██║██║ ██║█████╗ ███████║██████╔╝ | |
# ██╔══██╗██╔══╝ ██║╚██╔╝██║██║ ██║╚██╗ ██╔╝██╔══╝ ██╔══██║██╔═══╝ | |
# ██║ ██║███████╗██║ ╚═╝ ██║╚██████╔╝ ╚████╔╝ ███████╗ ██║ ██║██║ | |
# ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═╝╚═╝ | |
# | |
# ██████╗ ██╗ ██████╗ █████╗ ████████╗██╗ ██╗ █████╗ ██████╗ ███████╗ | |
# ██╔══██╗██║ ██╔═══██╗██╔══██╗╚══██╔══╝██║ ██║██╔══██╗██╔══██╗██╔════╝ | |
# ██████╔╝██║ ██║ ██║███████║ ██║ ██║ █╗ ██║███████║██████╔╝█████╗ | |
# ██╔══██╗██║ ██║ ██║██╔══██║ ██║ ██║███╗██║██╔══██║██╔══██╗██╔══╝ | |
# ██████╔╝███████╗╚██████╔╝██║ ██║ ██║ ╚███╔███╔╝██║ ██║██║ ██║███████╗ | |
# ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ | |
# | |
# Remove HP bloatware / crapware | |
# | |
# -- source : https://gist.github.com/mark05e/a79221b4245962a477a49eb281d97388 | |
# -- contrib: francishagyard2, mark05E, erottier, JoachimBerghmans, sikkepitje | |
# -- ref : https://community.spiceworks.com/topic/2296941-powershell-script-to-remove-windowsapps-folder?page=1#entry-9032247 | |
# -- note : this script could use your improvements. contributions welcome! | |
# -- todo : Wolf Security improvements ref: https://www.reddit.com/r/SCCM/comments/nru942/hp_wolf_security_how_to_remove_it/ | |
# -- improved by: loopyd <[email protected]> ([email protected]) | |
# | |
# LICENSE - Unilicense | |
# | |
# 1. FREE, FOREVER | |
# | |
# This program is free software. It has been provided to you for free, at no charge, for your use | |
# or modification as you should so desire, but it should never be sold. As this software was created | |
# for the benefit of humanity as a whole, it goes agains that benefit to charge money for it. We | |
# ask that you do attempt to sell, or succeed in the sale or trade of in any monitory form, copies | |
# of this software modified, or unmodified, without permission from its authors. | |
# | |
# | |
# 2. USE THIS SOFTWARE AT YOUR OWN RISK | |
# | |
# The authors of this software assume no responsibility for damages it may cause to | |
# your computer, in its current or modified form. It has been tested to insure its stability on | |
# multiple machines. However, a case may arise that we or you in your modifications did not account | |
# for. Every effort has been made to mitigate the possibility of vital data loss. We however cannot | |
# gaurentee that this will work with every system configuration however. | |
# | |
# 3. PRIVACY CONSENT | |
# | |
# This software may create temporary files, however NO DATA is personally stored or shared on your | |
# system that should tie itself back to you as the user. Temporary files created by the script are | |
# destroyed, or may be left behind if the software uses a third party tool (such as a program's | |
# uninstaller) to remove them. | |
# This identifier is used to match HP software | |
$HPidentifier = "AD2F1837" | |
# List of built-in apps provided by HP, that we wish to target. | |
$Packages = @( | |
"HPJumpStarts" | |
"HPPCHardwareDiagnosticsWindows" | |
"HPPowerManager" | |
"HPPrivacySettings" | |
"HPSupportAssistant" | |
"HPSureShieldAI" | |
"HPSystemInformation" | |
"HPQuickDrop" | |
"HPWorkWell" | |
"myHP" | |
"HPDesktopSupportUtilities" | |
"HPQuickTouch" | |
"HPEasyClean" | |
"HPPCHardwareDiagnosticsWindows" | |
"HPProgrammableKey" | |
) | |
# List of programs provided by HP | |
$Programs = @( | |
"HP Client Security Manager" | |
"HP Connection Optimizer" | |
"HP Documentation" | |
"HP MAC Address Manager" | |
"HP Notifications" | |
"HP Security Update Service" | |
"HP System Default Settings" | |
"HP Sure Click" | |
"HP Sure Click Security Browser" | |
"HP Sure Run" | |
"HP Sure Recover" | |
"HP Sure Sense" | |
"HP Sure Sense Installer" | |
"HP Wolf Security" | |
"HP Wolf Security Application Support for Sure Sense" | |
"HP Wolf Security Application Support for Windows" | |
) | |
# A list of Windows Services to Disable (some are HP related, some not) | |
$Services = @( | |
"diagnosticshub.standardcollector.service" | |
"DiagTrack" | |
"dmwappushservice" | |
"lfsvc" | |
"MapsBroker" | |
"NetTcpPortSharing" | |
"RemoteAccess" | |
"RemoteRegistry" | |
"SharedAccess" | |
"TrkWks" | |
"WbioSrvc" | |
"WMPNetworkSvc" | |
"XblAuthManager" | |
"XblGameSave" | |
"XboxNetApiSvc" | |
"FxsSvc" | |
"ndu" | |
"AnalyticsClientService" | |
"AppHelperCap" | |
"DiagsCap" | |
"NetworkCap" | |
"SysInfoCap" | |
) | |
# A function that stops and disables a list of windows services. | |
function Disable-Services() { | |
param( | |
[Parameter(Position = 1, Mandatory = $true)][ref]$Services | |
) | |
Write-Host -ForegroundColor Cyan "ℹ️ Disabling $($Services.Value.Count) services..." | |
foreach ($Service in $Services.Value) { | |
$MyService = $Null | |
Try { | |
$MyService = Get-Service -Name $Service -ErrorAction Stop | |
} Catch { | |
Write-Host -ForegroundColor Yellow "♻️ Skipped service $($Service) as it is not installed!" | |
} | |
if ($MyService -ne $Null) { | |
Write-Host -ForegroundColor Yellow "🛑 Stopping service $($Service)..." | |
Try { | |
$MyService | Stop-Service -Force -ErrorAction Stop | |
Write-Host -ForegroundColor Green "✅ Stopped service $($Service)" | |
} Catch { Write-Warning -Message "❌ Failed to stop $($Service)" } | |
Write-Host -ForegroundColor Yellow "🛑 Disabling service $($Service)..." | |
Try { | |
$MyService | Set-Service -StartupType Disabled -Force -ErrorAction Stop | |
Write-Host -ForegroundColor Green "✅ Disabled service $($Service)" | |
} Catch { Write-Warning -Message "❌ Failed to disable $($Service)" } | |
} | |
} | |
return | |
} | |
## Function that is used to help return useful software information on the PC, it hecks for | |
# the matching software as an AppX/image provisioned package or legacy Programs and Features entry. | |
function Fetch-Software() { | |
param( | |
[Parameter(Position = 1, Mandatory = $True)][ref]$Packages, | |
[Parameter(Position = 2, Mandatory = $True)][ref]$Programs, | |
[Parameter(Position = 3, Mandatory = $True)][string]$PackageIdentifier, | |
[Parameter(Position = 4, Mandatory = $True)][string]$Manufacterer, | |
[Parameter(Mandatory = $False)][switch]$Simple = $False, | |
[Parameter(Mandatory = $False)][switch]$NoExit = $False | |
) | |
Write-Host -ForegroundColor Cyan "ℹ️ Scanning for $($Manufacterer) software..." | |
# Scan for AppX Packages using Get-AppxPackage, this checks for items in the current (online) | |
# Windows image. If we have not specified the -Simple flag, the packages matching our criteria | |
# are printed on output. | |
$InstalledPackages = Get-AppxPackage -AllUsers ` | |
| Where-Object {( $("{0}.{1}" -f ($Packages.Value).Name, $PackageIdentifier) -contains $_.Name -or $_.Name -match $("^{0}" -f $PackageIdentifier))} | |
if ($InstalledPackages.Count -gt 0) { | |
Write-Host -ForegroundColor Yellow $("⚠️ Installed AppX packages found ({0}):" -f $InstalledPackages.Count) | |
if (-not $Simple) { | |
$InstalledPackages |% { | |
Write-Host -ForegroundColor Yellow $(" {0}" -f $_.Name ) | |
} | |
} | |
} else { | |
Write-Host -ForegroundColor Green "✅ No $($Manufacterer) AppX packages." | |
} | |
# Scan for provisioned packages using Get-AppxProvisionedPackage, this checks for item in the | |
# base Windows image (allows changes to stick across "Reset this PC"). If we have not specified the | |
# -Simple flag, the provisioned packages matching our critera are printed on output. | |
$ProvisionedPackages = Get-AppxProvisionedPackage -Online ` | |
| Where-Object {( $("{0}.{1}" -f ($Packages.Value).DisplayName, $PackageIdentifier) -contains $_.DisplayName -or $_.DisplayName -match $("^{0}" -f $PackageIdentifier))} | |
if ($ProvisionedPackages.Count -gt 0) { | |
Write-Host -ForegroundColor Yellow $("⚠️ Provisioned $($Manufacterer) packages found ({0}):" -f $InstalledPackages.Count) | |
if (-not $Simple) { | |
$ProvisionedPackages |% { | |
Write-Host -ForegroundColor Yellow $(" {0}" -f $_.DisplayName ) | |
} | |
} | |
} else { | |
Write-Host -ForegroundColor Green "✅ No provisioned $($Manufacterer) packages." | |
} | |
# Scan for installed programs using Get-Package. This helps us uninstall programs that are not | |
# part of the Windows App registry (non-Microsoft Store) that match our criteria. If we have | |
# not specified the -Simple flag, the list of found programs is output. | |
$InstalledPrograms = Get-Package | Where-Object {( $("{0}.{1}" -f ($Programs.Value).Name, $PackageIdentifier) -contains $_.Name -or $_.Name -match $("^{0}" -f $PackageIdentifier))} | |
if ($InstalledPrograms.Count -gt 0) { | |
Write-Host -ForegroundColor Yellow $("⚠️ Installed $($Manufacterer) Programs found ({0}):" -f $InstalledPrograms.Count) | |
if (-not $Simple) { | |
$InstalledPrograms |% { | |
Write-Host -ForegroundColor Yellow $(" {0}" -f $_.Name ) | |
} | |
} | |
} else { | |
Write-Host -ForegroundColor Green "✅ No remaining HP programs." | |
} | |
# Display a message and exit the script if we have specfied that we would like to exit via omitting | |
# the -NoExit flag to the function call. | |
if (-not $NoExit -and $InstalledPackages.Count -eq 0 -and $ProvisionedPackages.Count -eq 0 -and $InstalledPrograms.Count -eq 0) { | |
Write-Host -ForegroundColor Green "✅ No HP software found, the script will now exit." | |
Exit 1 | |
} | |
# Construct results into a PSCustom object that makes them easy to reference and return the object | |
$HPSoftware = New-Object -TypeName PSCustomObject -Property @{ ` | |
"InstalledPackages" = $InstalledPackages | |
"ProvisionedPackages" = $ProvisionedPackages | |
"InstalledPrograms" = $InstalledPrograms | |
} | |
return $HPSoftware | |
} | |
function Prompt-Reboot() { | |
# Feature - Ask for reboot after running the script | |
Write-Host -NoNewline -ForegroundColor Cyan "Restart computer now? [y/n] " | |
$input = Read-Host | |
switch($input) { | |
y{Restart-computer -Force -Confirm:$false} | |
n{return} | |
default{write-warning "Skipping reboot."} | |
} | |
return | |
} | |
# Block the script from not being run as an Administrator -- Improvement / sanity check | |
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { | |
Write-Warning -Message "❌ Not running as administrator! Please re-run your terminal session as Administrator, and try again." | |
} | |
# Fetch the software | |
$HPSoftware = Fetch-Software -Packages ([ref]$Packages) -Programs ([ref]$Programs) -PackageIdentifier $HPidentifier -Manufacterer "HP" -Simple -NoExit | |
Write-Host -ForegroundColor Cyan "ℹ️ Found $($HPSoftware.InstalledPackages.Count) installed, $($HPSoftware.ProvisionedPackages.Count) provisioned, and $($HPSoftware.InstalledPrograms.Count) HP programs." | |
# Remove appx provisioned packages - AppxProvisionedPackage | |
ForEach ($ProvPackage in $HPSoftware.ProvisionedPackages) { | |
Write-Host -ForegroundColor Yellow "💣 Attempting to remove provisioned package: [$($ProvPackage.DisplayName)]..." | |
Try { | |
$Null = Remove-AppxProvisionedPackage -PackageName $ProvPackage.PackageName -Online -ErrorAction Stop | |
Write-Host -Object -ForegroundColor Green "Successfully removed provisioned package: [$($ProvPackage.DisplayName)]" | |
} | |
Catch {Write-Warning -Message "❌ Failed to remove provisioned package: [$($ProvPackage.DisplayName)]"} | |
} | |
# Remove AppX packages - AppxPackage | |
ForEach ($AppxPackage in $HPSoftware.InstalledPackages) { | |
Write-Host -ForegroundColor Yellow "💣 Attempting to remove AppX package: [$($AppxPackage.Name)]..." | |
Try { | |
$Null = Remove-AppxPackage -Package $AppxPackage.PackageFullName -AllUsers -ErrorAction Stop | |
Write-Host -ForegroundColor Green "✅ Successfully removed AppX package: [$($AppxPackage.Name)]" | |
} | |
Catch {Write-Warning -Message "❌ Failed to remove AppX package: [$($AppxPackage.Name)]"} | |
} | |
# Remove installed programs | |
ForEach ($Program in $HPSoftware.InstalledPrograms) { | |
Write-Host -ForegroundColor Yellow "💣 Attempting to uninstall: [$($Program.Name)]..." | |
Try { | |
$Null = $Program | Uninstall-Package -AllVersions -Force -ErrorAction Stop | |
Write-Host -ForegroundColor Green "✅ Successfully uninstalled: [$($Program.Name)]" | |
} | |
Catch {Write-Warning -Message "❌ Failed to uninstall: [$($Program.Name)]"} | |
} | |
# Fallback attempt 1 to remove HP Wolf Security using msiexec | |
Try { | |
MsiExec /x "{0E2E04B0-9EDD-11EB-B38C-10604B96B11E}" /qn /norestart | |
Write-Host -ForegroundColor Yellow "⚠️ Fallback to MSI uninistall for HP Wolf Security initiated" | |
} | |
Catch { | |
Write-Warning -Message "❌ Failed to uninstall HP Wolf Security using MSI - Error message: $($_.Exception.Message)" | |
} | |
# Fallback attempt 2 to remove HP Wolf Security using msiexec | |
Try { | |
MsiExec /x "{4DA839F0-72CF-11EC-B247-3863BB3CB5A8}" /qn /norestart | |
Write-Host -ForegroundColor Yellow "⚠️ Fallback to MSI uninistall for HP Wolf 2 Security initiated" | |
} | |
Catch { | |
Write-Warning -Message "❌ Failed to uninstall HP Wolf Security 2 using MSI - Error message: $($_.Exception.Message)" | |
} | |
$HPSoftware = Fetch-Software -Packages ([ref]$Packages) -Programs ([ref]$Programs) -PackageIdentifier $HPidentifier -Manufacterer "HP" -Simple -NoExit | |
Disable-Services -Services ([ref]$Services) | |
Write-Host -ForegroundColor Blue "✨ HP Debloat complete!" | |
Prompt-Reboot |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Yes, configurable options would be helpful. It endlessly loops on "stopping Windows Network Data Usage Monitoring Driver" without failing, preventing the script from continuing, I'll have some new HP laptops to test it on again soon.
As opposed to a config file maybe just a parameter switch as you suggested would be a great place to start
-services-win
,-services-hp
,-all
, etc.