Skip to content

Instantly share code, notes, and snippets.

@mark05e
Last active May 20, 2024 06:38
Show Gist options
  • Save mark05e/2db81671f39a041a5992a64a77748dc7 to your computer and use it in GitHub Desktop.
Save mark05e/2db81671f39a041a5992a64a77748dc7 to your computer and use it in GitHub Desktop.
# ██████╗ ███████╗███╗ ███╗ ██████╗ ██╗ ██╗███████╗ ██╗ ██╗██████╗
# ██╔══██╗██╔════╝████╗ ████║██╔═══██╗██║ ██║██╔════╝ ██║ ██║██╔══██╗
# ██████╔╝█████╗ ██╔████╔██║██║ ██║██║ ██║█████╗ ███████║██████╔╝
# ██╔══██╗██╔══╝ ██║╚██╔╝██║██║ ██║╚██╗ ██╔╝██╔══╝ ██╔══██║██╔═══╝
# ██║ ██║███████╗██║ ╚═╝ ██║╚██████╔╝ ╚████╔╝ ███████╗ ██║ ██║██║
# ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═╝╚═╝
#
# ██████╗ ██╗ ██████╗ █████╗ ████████╗██╗ ██╗ █████╗ ██████╗ ███████╗
# ██╔══██╗██║ ██╔═══██╗██╔══██╗╚══██╔══╝██║ ██║██╔══██╗██╔══██╗██╔════╝
# ██████╔╝██║ ██║ ██║███████║ ██║ ██║ █╗ ██║███████║██████╔╝█████╗
# ██╔══██╗██║ ██║ ██║██╔══██║ ██║ ██║███╗██║██╔══██║██╔══██╗██╔══╝
# ██████╔╝███████╗╚██████╔╝██║ ██║ ██║ ╚███╔███╔╝██║ ██║██║ ██║███████╗
# ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝
#
# ██████╗ ███████╗████████╗ █████╗
# ██╔══██╗██╔════╝╚══██╔══╝██╔══██╗
# ██████╔╝█████╗ ██║ ███████║
# ██╔══██╗██╔══╝ ██║ ██╔══██║
# ██████╔╝███████╗ ██║ ██║ ██║
# ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝
#
# Remove HP bloatware / crapware - BETA version
#
# -- source : https://gist.github.com/mark05e/a79221b4245962a477a49eb281d97388
# -- contrib: francishagyard2, mark05E, erottier, JoachimBerghmans, sikkepitje, Ithendyr
# -- note : this script could use your improvements. contributions welcome!
# List of built-in apps to remove
$UninstallPackages = @(
"AD2F1837.HPJumpStarts"
"AD2F1837.HPPCHardwareDiagnosticsWindows"
"AD2F1837.HPPowerManager"
"AD2F1837.HPPrivacySettings"
"AD2F1837.HPSupportAssistant"
"AD2F1837.HPSureShieldAI"
"AD2F1837.HPSystemInformation"
"AD2F1837.HPQuickDrop"
"AD2F1837.HPWorkWell"
"AD2F1837.myHP"
"AD2F1837.HPDesktopSupportUtilities"
"AD2F1837.HPQuickTouch"
"AD2F1837.HPEasyClean"
"AD2F1837.HPSystemInformation"
)
# List of programs to uninstall
$UninstallPrograms = @(
"HP Device Access Manager"
"HP Client Security Manager"
"HP Connection Optimizer"
"HP Documentation"
"HP MAC Address Manager"
"HP Notifications"
"HP System Info HSA Service"
"HP Security Update Service"
"HP System Default Settings"
"HP Sure Click"
"HP Sure Click Security Browser"
"HP Sure Run"
"HP Sure Run Module"
"HP Sure Recover"
"HP Sure Sense"
"HP Sure Sense Installer"
"HP Wolf Security"
"HP Wolf Security - Console"
"HP Wolf Security Application Support for Sure Sense"
"HP Wolf Security Application Support for Windows"
)
$HPidentifier = "AD2F1837"
$InstalledPackages = Get-AppxPackage -AllUsers `
| Where-Object {($UninstallPackages -contains $_.Name) -or ($_.Name -match "^$HPidentifier")}
$ProvisionedPackages = Get-AppxProvisionedPackage -Online `
| Where-Object {($UninstallPackages -contains $_.DisplayName) -or ($_.DisplayName -match "^$HPidentifier")}
$InstalledPrograms = Get-Package | Where-Object {$UninstallPrograms -contains $_.Name}
# Stop HP Services
Function StopDisableService($name) {
if (Get-Service -Name $name -ea SilentlyContinue) {
Stop-Service -Name $name -Force -Confirm:$False
Set-Service -Name $name -StartupType Disabled
}
}
StopDisableService -name "HotKeyServiceUWP"
StopDisableService -name "HPAppHelperCap"
StopDisableService -name "HP Comm Recover"
StopDisableService -name "HPDiagsCap"
StopDisableService -name "HotKeyServiceUWP"
StopDisableService -name "LanWlanWwanSwitchgingServiceUWP" # do we need to stop this?
StopDisableService -name "HPNetworkCap"
StopDisableService -name "HPSysInfoCap"
StopDisableService -name "HP TechPulse Core"
# Remove installed programs
$InstalledPrograms | ForEach-Object {
Write-Host -Object "Attempting to uninstall: [$($_.Name)]..."
Try {
$Null = $_ | Uninstall-Package -AllVersions -Force -ErrorAction Stop
Write-Host -Object "Successfully uninstalled: [$($_.Name)]"
}
Catch {
Write-Warning -Message "Failed to uninstall: [$($_.Name)]"
Write-Host -Object "Attempting to uninstall as MSI package: [$($_.Name)]..."
Try {
$product = Get-WmiObject win32_product | where { $_.name -like "$($_.Name)" }
if ($_ -ne $null) {
msiexec /x $product.IdentifyingNumber /quiet /noreboot
}
else { Write-Warning -Message "Can't find MSI package: [$($_.Name)]" }
}
Catch { Write-Warning -Message "Failed to uninstall MSI package: [$($_.Name)]" }
}
}
# Fallback attempt 1 to remove HP Wolf Security using msiexec
Try {
MsiExec /x "{0E2E04B0-9EDD-11EB-B38C-10604B96B11E}" /qn /norestart
Write-Host -Object "Fallback to MSI uninistall for HP Wolf Security initiated"
}
Catch {
Write-Warning -Object "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 -Object "Fallback to MSI uninistall for HP Wolf 2 Security initiated"
}
Catch {
Write-Warning -Object "Failed to uninstall HP Wolf Security 2 using MSI - Error message: $($_.Exception.Message)"
}
# Remove appx provisioned packages - AppxProvisionedPackage
ForEach ($ProvPackage in $ProvisionedPackages) {
Write-Host -Object "Attempting to remove provisioned package: [$($ProvPackage.DisplayName)]..."
Try {
$Null = Remove-AppxProvisionedPackage -PackageName $ProvPackage.PackageName -Online -ErrorAction Stop
Write-Host -Object "Successfully removed provisioned package: [$($ProvPackage.DisplayName)]"
}
Catch {Write-Warning -Message "Failed to remove provisioned package: [$($ProvPackage.DisplayName)]"}
}
# Remove appx packages - AppxPackage
ForEach ($AppxPackage in $InstalledPackages) {
Write-Host -Object "Attempting to remove Appx package: [$($AppxPackage.Name)]..."
Try {
$Null = Remove-AppxPackage -Package $AppxPackage.PackageFullName -AllUsers -ErrorAction Stop
Write-Host -Object "Successfully removed Appx package: [$($AppxPackage.Name)]"
}
Catch {Write-Warning -Message "Failed to remove Appx package: [$($AppxPackage.Name)]"}
}
# # Uncomment this section to see what is left behind
# Write-Host "Checking stuff after running script"
# Write-Host "For Get-AppxPackage -AllUsers"
# Get-AppxPackage -AllUsers | where {$_.Name -like "*HP*"}
# Write-Host "For Get-AppxProvisionedPackage -Online"
# Get-AppxProvisionedPackage -Online | where {$_.DisplayName -like "*HP*"}
# Write-Host "For Get-Package"
# Get-Package | select Name, FastPackageReference, ProviderName, Summary | Where {$_.Name -like "*HP*"} | Format-List
# # Feature - Ask for reboot after running the script
# $input = Read-Host "Restart computer now [y/n]"
# switch($input){
# y{Restart-computer -Force -Confirm:$false}
# n{exit}
# default{write-warning "Skipping reboot."}
# }
@CasperStekelenburg
Copy link

CasperStekelenburg commented Feb 15, 2024

Looking for someone to help implement the function based on comment by CasperStekelenburg

I'd try searching the registry for the uninstallstring or IdentifyingNumber.
I'd search in "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" or "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"

Source: Remove-HPbloatware.ps1 comment

@mark05e
Found this again, had some time to write a function you can use:

Function Get-ProgramInstallationStatus {
    <#
        .PARAMETER Application
            The (partial) application name
    #>
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $True)]
        [String]$Application
    )

    $UninstallKeys = @(
        "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
    )
    If ([System.Environment]::Is64BitOperatingSystem -eq $True) {
        $UninstallKeys += "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
    }

    Foreach ($UninstallKey in $UninstallKeys) {
        $reg = [microsoft.win32.registrykey]::OpenBaseKey('LocalMachine', "Default")
        $regkey = $reg.OpenSubKey($UninstallKey)
        $subkeys = $regkey.GetSubKeyNames()
        If ($null -ne $subkeys) {
            foreach ($key in $subkeys) {
                $thisKey = $UninstallKey + "\\" + $key
                $thisSubKey = $reg.OpenSubKey($thisKey)
                $DisplayName = $($thisSubKey.GetValue("DisplayName"))
                If ($DisplayName -match $Application -and $DisplayName -notmatch "Language font pack" -and $DisplayName -notmatch "KeepItSafe Online") {
                    $InstallDate = $($thisSubKey.GetValue("InstallDate"))
                    If ($null -ne $InstallDate) {
                        $InstallDate = ([datetime]::ParseExact($InstallDate, 'yyyyMMdd', $null)).ToString("dd-MM-yyyy")
                    }

                    $ProgramInfo = @{
                        "Key"                  = $thisKey
                        "IdentifyingNumber"    = $key
                        "DisplayIcon"          = $($thisSubKey.GetValue("DisplayIcon"))
                        "QuietDisplayName"     = $($thisSubKey.GetValue("QuietDisplayName"))
                        "DisplayName"          = $($thisSubKey.GetValue("DisplayName"))
                        "DisplayVersion"       = $($thisSubKey.GetValue("DisplayVersion"))
                        "EstimatedSize"        = $($thisSubKey.GetValue("EstimatedSize"))
                        "InstallArguments"     = $($thisSubKey.GetValue("InstallArguments"))
                        "InstallDate"          = $InstallDate
                        "InstallLocation"      = $($thisSubKey.GetValue("InstallLocation"))
                        "Is64Bit"              = If ([System.Environment]::Is64BitOperatingSystem -eq $True) { $True } Else { $False }
                        "SystemComponent"      = [bool]$($thisSubKey.GetValue("SystemComponent"))
                        "QuietUninstallString" = $($thisSubKey.GetValue("QuietUninstallString"))
                        "UninstallString"      = $($thisSubKey.GetValue("UninstallString"))
                        "Publisher"            = $($thisSubKey.GetValue("Publisher"))
                        "InstallStatus"        = $True
                    }
                } Else {
                    $ProgramInfo = @{
                        "IdentifyingNumber"    = $null
                        "DisplayIcon"          = $null
                        "QuietDisplayName"     = $null
                        "DisplayName"          = $Application
                        "DisplayVersion"       = $null
                        "EstimatedSize"        = $null
                        "InstallArguments"     = $null
                        "InstallDate"          = $null
                        "InstallLocation"      = $null
                        "Is64Bit"              = If ([System.Environment]::Is64BitOperatingSystem -eq $True) { $True } Else { $False }
                        "SystemComponent"      = $null
                        "QuietUninstallString" = $null
                        "UninstallString"      = $null
                        "Publisher"            = $null
                        "InstallStatus"        = $False
                    }
                }
                If ($ProgramInfo.InstallStatus -eq "True") {
                    Break
                }
            }
        }
        If ($ProgramInfo.InstallStatus -eq "True") {
            Break
        }
    }
    New-Object -TypeName psobject -Property $ProgramInfo
}

@Netweezurd
Copy link

@mark05e Found this again, had some time to write a function you can use:

Function Get-ProgramInstallationStatus {
<#
.PARAMETER Application
The (partial) application name
#>
[CmdletBinding()]
Param(

Nice code @CasperStekelenburg, thanks for puting it up.

I can thinker with lines but I don't do enough scripting to know how to add the lines that would either send it to the con or open and fill a file up with its finding.

Thank You all.

@sikkepitje
Copy link

sikkepitje commented Feb 16, 2024

In addition to the comments made by @CasperStekelenburg, performing "Get-WmiObject win32_product" is bad, because it is very slow and (worse still) it could trigger reinstallation of packages, which is bad.
I get OK results getting similar information using the below function, BUT this produces a list of all installed software, even when it was installed by some other method than MSI. Also attributes have different names and are not in 1:1 relation to list returned by GWMI win32_product. Returned data needs processing to get the same results. To name a few: $product.Identifyingnumber could be extracted fom PSChildName. When UninstallString contains Msiexec , it often has a /I parameter to it , so it really some kind of install string. So to sum up: useful, but needs work.

Function Get-InstalledSoftware64 {
    @(Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*") + `
    @(Get-ItemProperty "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*") `
    | Sort-Object DisplayName `
    | Select-Object DisplayName, DisplayVersion, PSChildName, Publisher, UninstallString, InstallDate `
    | Where-Object {$_.DisplayName.Length -gt 0}
}

BTW , you did great work so far !!!

@Netweezurd
Copy link

image
Anyone knows what the "Sweet F U" service is for ?

@dunxd
Copy link

dunxd commented Mar 19, 2024

Anyone knows what the "Sweet F U" service is for ?

In the comments for the non-beta version of this gist, someone contributed some code which has the comment:

# At this stage the only 'HP Inc.' driver we want to keep is HPSFU, used for firmware servicing.

@ll4mat
Copy link

ll4mat commented Mar 22, 2024

Anyone knows what the "Sweet F U" service is for ?

AFAIK it's part of the HP Support Assistant.
Specifically it's the HP Support Assistant Updater which checks for new driver and firmware updates, downloads and installs them.
If you like to use HP Support Assistant i think you can't avoid this service since it may stop working otherwhise.

@ll4mat
Copy link

ll4mat commented Mar 22, 2024

@Netweezurd

I've been using jkraycfgi's version for a while now, I prep most days for a plant, all good but I have a new additional :
ProgramData\HP\TAInstaller\HPInsights.msi_5.23.34\HPInsights.msi

HP Insights is of the most stubborn bloatware (i even consider it "spyware") i have ever encountered from a manufacturer.
If you uninstall it via the Control Panel or the .msi, you will have it again after some time, as those mofo-components reinstall themselves.
(May the developer responsible for this at HP be struck by lightning while shi*****).

To get permanently rid of it you will need to stop, and afterwards delete a bunch of services to prevent it from getting reinstalled.
Ref: https://h30434.www3.hp.com/t5/Notebook-Software-and-How-To-Questions/Permanently-uninstall-HP-Insights/td-p/8910640

@izzzMe
Copy link

izzzMe commented Mar 22, 2024

Hi All,

Does anyone have their most recent script they could share that gets rid of the above and be deployed via Intune? We are moving to HP devices and there is so much bloatware on them, want an automated script that can be deploy to the devices as they register to Intune? Poly Lens also seems to be another new software that comes with the devices we are getting.

Or is this still the best one to use at present?

Hello Mark [@mark05e] and everyone,

We have been using the original script with success as needed but after we have been having HP units boot to a 'User Profile Service failed to start' upon login. Some research is showing that 'MyHP' application on the units are causing the profile login issues so we decided to revisit the script to make sure we officially get all the HP junk off of our devices.

I compiled a mix of the changes above to the original script and I am having luck with the below running remotely with a successful completion, but not total removal of all the HP software.

I get some errors on the "HP Wolf Security - Console" and "HP Security Update Service" program. It seems the script below is having some issues pulling those specific modules and they are dependent on each other. Are there any services associated that may need to be ended first?

Application 'C:\Windows\explorer.exe' (pid 15272) cannot be restarted - Application SID does not match Conductor SID..	Microsoft-Windows-RestartManager
1/30/2024, 5:57 PM	10010	Warning	Application	Application 'C:\Windows\explorer.exe' (pid 15272) cannot be restarted - Application SID does not match Conductor SID..	Microsoft-Windows-RestartManager
1/30/2024, 5:56 PM	10010	Warning	Application	Application 'C:\Program Files (x86)\HP\HP Notifications\HPNotifications.exe' (pid 12404) cannot be restarted - Application SID does not match Conductor SID..	Microsoft-Windows-RestartManager
1/30/2024, 5:56 PM	10010	Warning	Application	Application 'C:\Program Files (x86)\HP\HP Notifications\HPNotifications.exe' (pid 12404) cannot be restarted - Application SID does not match Conductor SID..	Microsoft-Windows-RestartManager
**1/30/2024, 5:56 PM	10005	Error	Application	Product: HP Security Update Service -- HP Security Update Service is in use. If you wish to remove it, please uninstall other software first: HP Wolf Security - Console.**
# List of built-in apps to remove
$UninstallPackages = @(
    "AD2F1837.HPJumpStarts"
    "AD2F1837.HPPCHardwareDiagnosticsWindows"
    "AD2F1837.HPPowerManager"
    "AD2F1837.HPPrivacySettings"
    "AD2F1837.HPSupportAssistant"
    "AD2F1837.HPSureShieldAI"
    "AD2F1837.HPSystemInformation"
    "AD2F1837.HPQuickDrop"
    "AD2F1837.HPWorkWell"
    "AD2F1837.myHP"
    "AD2F1837.HPDesktopSupportUtilities"
    "AD2F1837.HPQuickTouch"
    "AD2F1837.HPEasyClean"
    "AD2F1837.HPSystemInformation"
    "Microsoft.GetHelp"
    "Microsoft.Getstarted"
    "Microsoft.MicrosoftOfficeHub"
    "Microsoft.MicrosoftSolitaireCollection"
    "Microsoft.People"
    "microsoft.windowscommunicationsapps"
    "Microsoft.WindowsFeedbackHub"
    "Microsoft.Xbox.TCUI"
    "Microsoft.XboxGameOverlay"
    "Microsoft.XboxGamingOverlay"
    "Microsoft.XboxIdentityProvider"
    "Microsoft.XboxSpeechToTextOverlay"
    "Microsoft.XboxApp"
    "Microsoft.Wallet"
    "Microsoft.SkyeApp"
    "Microsoft.BingWeather"
)

# List of programs to uninstall
$UninstallPrograms = @(
    "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 Run Module"
    "HP Sure Recover"
    "HP Sure Sense"
    "HP Sure Sense Installer"
    "HP ICS"
    "HP Assess and Respond"
    "HP Wolf Security"
    "HP Wolf Security - Console"
    "HP Wolf Security Application Support for Sure Sense"
    "HP Wolf Security Application Support for Windows"
)

$HPidentifier = "AD2F1837"

$InstalledPackages = Get-AppxPackage -AllUsers '
            | Where-Object {($UninstallPackages -contains $_.Name) -or ($_.Name -match "^$HPidentifier")}

$ProvisionedPackages = Get-AppxProvisionedPackage -Online '
            | Where-Object {($UninstallPackages -contains $_.DisplayName) -or ($_.DisplayName -match "^$HPidentifier")}

$InstalledPrograms = Get-Package | Where-Object {$UninstallPrograms -contains $_.Name}

# List of services to disable

$DisableServices = @(
    "HotKeyServiceUWP"
    "HPAppHelperCap"
    "HP Comm Recover"
    "HPDiagsCap"
    "HotKeyServiceUWP"
    "HPNetworkCap"
    "HPSysInfoCap"
    "HP TechPulse Core"
)

#Stop HP Services
Function StopDisableService($name) {

    if (Get-Service -Name $name -ea SilentlyContinue) {

        if ((Get-Service -Name $name).Status -eq 'Running') {

            Write-Host "Service '$name' is running. Executing code..."

                Stop-Service -Name $name -Force -Confirm:$False
                Set-Service -Name $name -StartupType Disabled

        }

        else {

            Write-Host "Service '$name' is not running. Code execution skipped."

        }
    }
}

foreach ($serv in $DisableServices){

        StopDisableService -name $serv

    }

# Remove appx provisioned packages - AppxProvisionedPackage
ForEach ($ProvPackage in $ProvisionedPackages) {

    Write-Host -Object "Attempting to remove provisioned package: [$($ProvPackage.DisplayName)]..."

    Try {
        $Null = Remove-AppxProvisionedPackage -PackageName $ProvPackage.PackageName -Online -ErrorAction Stop
        Write-Host -Object "Successfully removed provisioned package: [$($ProvPackage.DisplayName)]"
    }
    Catch {Write-Warning -Message "Failed to remove provisioned package: [$($ProvPackage.DisplayName)]"}
}

# Remove appx packages - AppxPackage
ForEach ($AppxPackage in $InstalledPackages) {
                                            
    Write-Host -Object "Attempting to remove Appx package: [$($AppxPackage.Name)]..."

    Try {
        $Null = Remove-AppxPackage -Package $AppxPackage.PackageFullName -AllUsers -ErrorAction Stop
        Write-Host -Object "Successfully removed Appx package: [$($AppxPackage.Name)]"
    }
    Catch {Write-Warning -Message "Failed to remove Appx package: [$($AppxPackage.Name)]"}
}

# Remove installed programs
$InstalledPrograms | ForEach-Object {

    Write-Host -Object "Attempting to uninstall: [$($_.Name)]..."

    Try {
        $Null = $_ | Uninstall-Package -AllVersions -Force -ErrorAction Stop
        Write-Host -Object "Successfully uninstalled: [$($_.Name)]"
    }
    Catch {Write-Warning -Message "Failed to uninstall: [$($_.Name)]"}
}

# Fallback attempt 1 to remove HP Wolf Security using msiexec
Try {
    MsiExec /x "{0E2E04B0-9EDD-11EB-B38C-10604B96B11E}" /qn /norestart
    Write-Host -Object "Fallback to MSI uninistall for HP Wolf Security initiated"
}
Catch {
    Write-Warning -Object "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 -Object "Fallback to MSI uninistall for HP Wolf 2 Security initiated"
}
Catch {
    Write-Warning -Object  "Failed to uninstall HP Wolf Security 2 using MSI - Error message: $($_.Exception.Message)"
}

@IntuneAdmin017
Copy link

@izzzMe

I have tested this script from Intune Remediation for HP wolf products and it worked:

$HPWolfSecurity = Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -eq "HP Wolf Security" }
if ($HPWolfSecurity) {
$HPWolfSecurity.Uninstall()
Start-Sleep -Seconds 2
}

$HPWolfSecurityConsole = Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -eq "HP Wolf Security - Console" }
if ($HPWolfSecurityConsole) {
$HPWolfSecurityConsole.Uninstall()
Start-Sleep -Seconds 2
}

Get-Service -DisplayName "HP Security Update Service" | Stop-Service
$HPSecurityUpdateService = Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -eq "HP Security Update Service" }
if ($HPSecurityUpdateService) {
$HPSecurityUpdateService.Uninstall()
Start-Sleep -Seconds 2
}

@foeyonghai
Copy link

Hi, I applied clean coding to the script. Hope this helps and makes the script more professional.

`# List of built-in apps to remove
$UninstallPackages = @(
"AD2F1837.HPJumpStarts"
"AD2F1837.HPPCHardwareDiagnosticsWindows"
"AD2F1837.HPPowerManager"
"AD2F1837.HPPrivacySettings"
"AD2F1837.HPSupportAssistant"
"AD2F1837.HPSureShieldAI"
"AD2F1837.HPSystemInformation"
"AD2F1837.HPQuickDrop"
"AD2F1837.HPWorkWell"
"AD2F1837.myHP"
"AD2F1837.HPDesktopSupportUtilities"
"AD2F1837.HPQuickTouch"
"AD2F1837.HPEasyClean"
"AD2F1837.HPSystemInformation"
)

List of programs to uninstall

$UninstallPrograms = @(
"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 Support Assistant"
"HP Wolf Security"
"HP Wolf Security Application Support for Sure Sense"
"HP Wolf Security Application Support for Windows"
)

$optimizerUninstallAnswer = @"
[InstallShield Silent]
Version=v7.00
File=Response File
[File Transfer]
OverwrittenReadOnly=NoToAll
[{6468C4A5-E47E-405F-B675-A70A70983EA6}-DlgOrder]
Dlg0={6468C4A5-E47E-405F-B675-A70A70983EA6}-SdWelcomeMaint-0
Count=3
Dlg1={6468C4A5-E47E-405F-B675-A70A70983EA6}-MessageBox-0
Dlg2={6468C4A5-E47E-405F-B675-A70A70983EA6}-SdFinishReboot-0
[{6468C4A5-E47E-405F-B675-A70A70983EA6}-SdWelcomeMaint-0]
Result=303
[{6468C4A5-E47E-405F-B675-A70A70983EA6}-MessageBox-0]
Result=6
[Application]
Name=HP Connection Optimizer
Version=2.0.18.0
Company=HP Inc.
Lang=0409
[{6468C4A5-E47E-405F-B675-A70A70983EA6}-SdFinishReboot-0]
Result=1
BootOption=0
"@

Run inventories

$HPidentifier = "AD2F1837"
$InstalledPackages = Get-AppxPackage -AllUsers | Where-Object {($UninstallPackages -contains $.Name) -or ($.Name -match "^$HPidentifier")} -Verbose
$ProvisionedPackages = Get-AppxProvisionedPackage -Online | Where-Object {($UninstallPackages -contains $.DisplayName) -or ($.DisplayName -match "^$HPidentifier")} -Verbose
$InstalledPrograms = Get-Package | Where-Object {$UninstallPrograms -contains $.Name} -Verbose
$HPCommRecoveryPresent = Test-Path -Path "C:\Program Files\HPCommRecovery"
$apps = Get-WmiObject -Class Win32_Product | Where-Object {$
.Name -match "HP"}
$HPSAuninstall = "${Env:ProgramFiles(x86)}\HP\HP Support Framework\UninstallHPSA.exe"

Remove HP APPX provisioned packages - AppxProvisionedPackage

function Step1 {
ForEach ($ProvPackage in $ProvisionedPackages) {
Write-Host -Object "Attempting to remove provisioned package: [$($ProvPackage.DisplayName)]..."

    Try {
        $Null = Remove-AppxProvisionedPackage -PackageName $ProvPackage.PackageName -Online -ErrorAction Stop -Verbose
        Write-Host -Object "Successfully removed provisioned package: [$($ProvPackage.DisplayName)]"
    }
    Catch {Write-Warning -Message "Failed to remove provisioned package: [$($ProvPackage.DisplayName)]"}
}

# Go to the next function
Step2

}

Remove HP APPX packages - AppxPackage

function Step2 {
ForEach ($AppxPackage in $InstalledPackages) {
Write-Host -Object "Attempting to remove Appx package: [$($AppxPackage.Name)]..."

    Try {
        $Null = Remove-AppxPackage -Package $AppxPackage.PackageFullName -AllUsers -ErrorAction Stop -Verbose
        Write-Host -Object "Successfully removed Appx package: [$($AppxPackage.Name)]"
    }
    Catch {Write-Warning -Message "Failed to remove Appx package: [$($AppxPackage.Name)]"}
}

# Go to the next function
Step3

}

Remove HP installed programs

function Step3 {
$InstalledPrograms | ForEach-Object {
Try {
$Null = $_ | Uninstall-Package -AllVersions -Force -ErrorAction Stop -Verbose
Write-Host -Object "Successfully uninstalled: [$($.Name)]"
}
Catch {Write-Warning -Message "Failed to uninstall: [$($
.Name)]"}
}

# Go to the next function
Step4

}

Remove HP Win32 Apps

function Step4 {
foreach ($app in $apps) {
$id = $app.IdentifyingNumber
msiexec /uninstall "$id" /quiet /log $msilog /norestart
}

# Go to next function
Step5

}

Remove HP Connection Optimizer

function Step5 {
if ($HPCommRecoveryPresent) {
$optimizerUninstallAnswer | Out-File $env:TEMP\optimizer.iss
$arguments = "/s /f1"$env:Temp\optimizer.iss" /f2"C:\Temp\Uninstall.log""
Start-Process "C:\Program Files (x86)\InstallShield Installation Information{6468C4A5-E47E-405F-B675-A70A70983EA6}\Setup.exe" -ArgumentList $arguments -PassThru -Wait
}

#Go to next function
Step6

}

Remove HP Documentation

function Step6 {
#Remove HP Documentation
if (Test-Path "${Env:ProgramFiles}\HP\Documentation\Doc_uninstall.cmd" -PathType Leaf) {
try {
Invoke-Item "${Env:ProgramFiles}\HP\Documentation\Doc_uninstall.cmd"
Write-Host "Successfully removed provisioned package: HP Documentation"
}
catch {
Write-Host "Error Remvoving HP Documentation $($_.Exception.Message)"
}
}
else {
Write-Host "HP Documentation is not installed"
}

    # Go to next function
    Step7

}

Remove HP Active Support

function Step7 {
if (Test-Path -Path "HKLM:\Software\WOW6432Node\Hewlett-Packard\HPActiveSupport") {
try {
Remove-Item -Path "HKLM:\Software\WOW6432Node\Hewlett-Packard\HPActiveSupport"
Write-Host "HP Support Assistant regkey deleted $($.Exception.Message)"
}
catch {
Write-Host "Error retreiving registry key for HP Support Assistant: $($
.Exception.Message)"
}
}
else {
Write-Host "HP Support Assistant regkey not found"
}

if (Test-Path $HPSAuninstall -PathType Leaf) {
    try {
        & $HPSAuninstall /s /v/qn UninstallKeepPreferences=FALSE
        Write-Host "Successfully removed provisioned package: HP Support Assistant silently"
    }
    catch {
        Write-Host "Error uninstalling HP Support Assistant: $($_.Exception.Message)"
    }
}
else {
    Write-Host "HP Support Assistant Uninstaller not found"
}
# Go to next function
Step8

}

Check is apps are still present

function Step8 {
$apps = Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -match "HP"}
if ($apps) {
#Try to remove apps that are still present
foreach ($app in $apps) {
$id = $app.IdentifyingNumber
msiexec /uninstall "$id" /quiet /log $msilog /norestart
}
}
}

Start with the first function

Step1`

@foeyonghai
Copy link

Hi @xxIPREDATORIxx, I placed my own version here: https://github.com/IntuneSpecialist/Intune/tree/main/Powershell%20scripts. Its the same version as I mentioned above but since they never responded I descided to place my own version there.

@izzzMe
Copy link

izzzMe commented May 13, 2024

thanks will give these suggestions a try, really appreciate the help

@Leonarduk00
Copy link

Hi @xxIPREDATORIxx, I placed my own version here: https://github.com/IntuneSpecialist/Intune/tree/main/Powershell%20scripts. Its the same version as I mentioned above but since they never responded I descided to place my own version there.

I had some problems on some PCs after running this script

This is the result of the script:

Successfully uninstalled: [HP System Default Settings]
AVVISO: Failed to uninstall: []
Successfully uninstalled: [HP Wolf Security]
Successfully uninstalled: [HP Wolf Security - Console]
HP Documentation is not installed
HP Support Assistant regkey not found
Successfully removed provisioned package: HP Support Assistant silently
Get-WmiObject : Errore generico 
In riga:245 car:13
+     $apps = Get-WmiObject -Class Win32_Product | Where-Object {$_.Nam ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], ManagementException
    + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

Upon reboot, the user could not be logged back in.

have you had other cases?

@foeyonghai
Copy link

@Leonarduk00 that is very strange, I run it on 100+ machines without any problems. What kind of error does the user get when the user tries to login?

@Leonarduk00
Copy link

@foeyonghai Nothing !!! Either the system goes to a black screen, or it remains in the initial loading, blue screen and sometimes I can log in and in the system events there are countless errors. The PC has Windows 10 Pro and it has been operational for a few years, I wouldn't want it to be a problem with HP or system software updates.
The few times I manage to log in if I try to start the Windows 11 update it gives me an error 0x80070002

The event log is:

Nome dell'applicazione che ha generato l'errore: dwm.exe, versione: 10.0.19041.4355, timestamp: 0x6564cf4e
Nome del modulo che ha generato l'errore: KERNELBASE.dll, versione: 10.0.19041.4355, timestamp: 0xd7762934
Codice eccezione: 0xe0464645
Offset errore 0x000000000012d332
ID processo che ha generato l'errore: 0x1e78
Ora di avvio dell'applicazione che ha generato l'errore: 0x01daa6b0cd82e596
Percorso dell'applicazione che ha generato l'errore: C:\windows\system32\dwm.exe
Percorso del modulo che ha generato l'errore: C:\windows\System32\KERNELBASE.dll
ID segnalazione: 88fea123-c1da-498d-b8d6-6c31dc6f3bed
Nome completo pacchetto che ha generato l'errore: 

I think the profile was compromised as described in this post:
https://gist.github.com/mark05e/2db81671f39a041a5992a64a77748dc7?permalink_comment_id=4860762#gistcomment-4860762

@foeyonghai
Copy link

foeyonghai commented May 16, 2024

@Leonarduk00, did you run this with user permissions or admin permissions? I deployed this script always with SYSTEM permissions by Intune. Need to admit that I never tested or used it with user permissions. If is ran as a user I think that this could(must) be blocked in the script.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment