PS
Remove-AllAdobe.ps1
PowerShell 314 lines 14.5 KB Jun 10, 2026
<#
.SYNOPSIS
    Completely removes all Adobe products from a Windows computer.

.DESCRIPTION
    A "scorched earth" Adobe removal tool comparable to the Adobe Creative
    Cloud Cleaner Tool. It performs the following passes:

        1. Kills all running Adobe processes.
        2. Stops and deletes all Adobe services.
        3. Runs the uninstaller for every registered Adobe product.
        4. Deletes leftover Adobe folders (Program Files, ProgramData, AppData, etc.).
        5. Removes Adobe registry keys (HKLM + HKCU + uninstall entries).
        6. Removes Adobe scheduled tasks.
        7. Cleans Adobe activation/licensing entries from the hosts file.

.PARAMETER WhatIf
    Shows what WOULD be removed without actually removing anything (dry run).

.PARAMETER KeepReader
    Skips removal of Adobe Acrobat Reader (handy if users still need a PDF viewer).

.PARAMETER NoUninstall
    Skips the registered-uninstaller pass and goes straight to brute-force
    file/registry cleanup. Use this only when the normal uninstallers are
    already broken/missing.

.EXAMPLE
    .\Remove-AllAdobe.ps1 -WhatIf
    Dry run — report everything that would be removed.

.EXAMPLE
    .\Remove-AllAdobe.ps1
    Full removal of all Adobe products.

.EXAMPLE
    .\Remove-AllAdobe.ps1 -KeepReader
    Remove everything Adobe except Acrobat Reader.

.NOTES
    Run from an elevated (Administrator) PowerShell prompt.
    A transcript log is written to %TEMP%\Remove-AllAdobe_<timestamp>.log.
    REBOOT after running for a fully clean state.
#>

[CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'High')]
param(
    [switch]$KeepReader,
    [switch]$NoUninstall
)

#--------------------------------------------------------------------------
# Setup & safety
#--------------------------------------------------------------------------
$ErrorActionPreference = 'Continue'

# Require elevation
$principal = New-Object Security.Principal.WindowsPrincipal(
    [Security.Principal.WindowsIdentity]::GetCurrent())
if (-not $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Warning 'This script must be run as Administrator. Relaunching elevated...'
    $argList = @('-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', "`"$PSCommandPath`"")
    $argList += $MyInvocation.UnboundArguments
    Start-Process -FilePath 'powershell.exe' -Verb RunAs -ArgumentList $argList
    return
}

$stamp   = Get-Date -Format 'yyyyMMdd_HHmmss'
$logFile = Join-Path $env:TEMP "Remove-AllAdobe_$stamp.log"
try { Start-Transcript -Path $logFile -Append | Out-Null } catch {}

function Write-Step  { param($m) Write-Host "`n=== $m ===" -ForegroundColor Cyan }
function Write-Info  { param($m) Write-Host "    $m" -ForegroundColor Gray }
function Write-Good  { param($m) Write-Host "    [OK] $m" -ForegroundColor Green }
function Write-Skip  { param($m) Write-Host "    [SKIP] $m" -ForegroundColor DarkYellow }

Write-Host @"
============================================================
   Adobe Total Removal Tool
   Mode : $(if ($WhatIfPreference) {'DRY RUN (WhatIf)'} else {'LIVE REMOVAL'})
   KeepReader : $KeepReader
   Log  : $logFile
============================================================
"@ -ForegroundColor Magenta

if (-not $WhatIfPreference) {
    Write-Warning 'This will permanently remove Adobe software and data. CLOSE all Adobe apps now.'
    $confirm = Read-Host 'Type YES to continue'
    if ($confirm -ne 'YES') { Write-Host 'Aborted.' -ForegroundColor Red; try { Stop-Transcript | Out-Null } catch {}; return }
}

# A product is "kept" if KeepReader is set and its name matches Reader.
function Test-IsReader { param($name)
    return ($name -match 'Acrobat\s*Reader' -or $name -match 'Adobe Reader')
}

#--------------------------------------------------------------------------
# 1. Kill Adobe processes
#--------------------------------------------------------------------------
Write-Step '1. Stopping Adobe processes'
$adobeProcs = Get-Process -ErrorAction SilentlyContinue | Where-Object {
    $p = $_
    ($p.Path -and $p.Path -match '\\Adobe\\') -or
    ($p.Name -match '^(Acro|Adobe|AGS|AGM|CCX|CCLibrary|CoreSync|armsvc|AcroCEF|AdobeIPCBroker|AdobeGCClient|AdobeCollabSync|AdobeNotification|AdobeGenuine|Creative)')
}
foreach ($proc in $adobeProcs) {
    if ($KeepReader -and (Test-IsReader $proc.Name)) { Write-Skip "process $($proc.Name) (Reader kept)"; continue }
    if ($PSCmdlet.ShouldProcess($proc.Name, 'Stop-Process')) {
        try { Stop-Process -Id $proc.Id -Force -ErrorAction Stop; Write-Good "killed $($proc.Name) (PID $($proc.Id))" }
        catch { Write-Info "could not kill $($proc.Name): $($_.Exception.Message)" }
    }
}

#--------------------------------------------------------------------------
# 2. Stop & delete Adobe services
#--------------------------------------------------------------------------
Write-Step '2. Stopping and removing Adobe services'
$adobeServices = Get-Service -ErrorAction SilentlyContinue | Where-Object {
    $_.Name        -match 'Adobe|AdobeARM|AGSService|AGMService|AdobeUpdate|CCXProcess|CoreSync|AdobeGenuine' -or
    $_.DisplayName -match 'Adobe'
}
foreach ($svc in $adobeServices) {
    if ($KeepReader -and (Test-IsReader $svc.DisplayName)) { Write-Skip "service $($svc.Name) (Reader kept)"; continue }
    if ($PSCmdlet.ShouldProcess($svc.Name, 'Stop & delete service')) {
        try {
            Stop-Service -Name $svc.Name -Force -ErrorAction SilentlyContinue
            & sc.exe delete $svc.Name | Out-Null
            Write-Good "removed service $($svc.Name)"
        } catch { Write-Info "could not remove service $($svc.Name): $($_.Exception.Message)" }
    }
}

#--------------------------------------------------------------------------
# 3. Run registered uninstallers
#--------------------------------------------------------------------------
if (-not $NoUninstall) {
    Write-Step '3. Uninstalling registered Adobe products'
    $uninstallKeys = @(
        'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',
        'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*',
        'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
    )
    $products = foreach ($k in $uninstallKeys) {
        Get-ItemProperty $k -ErrorAction SilentlyContinue | Where-Object {
            $_.DisplayName -match 'Adobe' -or $_.Publisher -match 'Adobe'
        }
    }
    if (-not $products) { Write-Info 'No registered Adobe products found.' }

    foreach ($p in $products) {
        $name = $p.DisplayName
        if (-not $name) { continue }
        if ($KeepReader -and (Test-IsReader $name)) { Write-Skip "$name (Reader kept)"; continue }

        $cmd = $p.UninstallString
        if (-not $cmd) { Write-Info "no uninstall string for '$name'"; continue }

        if ($PSCmdlet.ShouldProcess($name, 'Uninstall')) {
            Write-Info "uninstalling '$name'..."
            try {
                if ($cmd -match 'MsiExec' -or $cmd -match '\{[0-9A-Fa-f\-]{36}\}') {
                    # MSI product — force silent uninstall by GUID
                    $guid = [regex]::Match($cmd, '\{[0-9A-Fa-f\-]{36}\}').Value
                    if ($guid) {
                        Start-Process msiexec.exe -ArgumentList "/x $guid /qn /norestart REBOOT=ReallySuppress" -Wait -NoNewWindow
                    }
                } else {
                    # EXE uninstaller — try to append a silent switch
                    $exe  = $cmd
                    $args = ''
                    if ($cmd -match '^"([^"]+)"\s*(.*)$') { $exe = $matches[1]; $args = $matches[2] }
                    elseif ($cmd -match '^(\S+)\s*(.*)$')  { $exe = $matches[1]; $args = $matches[2] }
                    if ($args -notmatch '/S|/silent|/quiet|--silent') { $args = "$args --silent".Trim() }
                    Start-Process -FilePath $exe -ArgumentList $args -Wait -NoNewWindow -ErrorAction SilentlyContinue
                }
                Write-Good "uninstalled '$name'"
            } catch { Write-Info "uninstaller for '$name' failed: $($_.Exception.Message)" }
        }
    }
} else {
    Write-Step '3. Skipping registered uninstallers (-NoUninstall)'
}

#--------------------------------------------------------------------------
# 4. Delete leftover Adobe folders
#--------------------------------------------------------------------------
Write-Step '4. Removing leftover Adobe folders'
$folderTargets = @(
    "$env:ProgramFiles\Adobe",
    "$env:ProgramFiles\Common Files\Adobe",
    "${env:ProgramFiles(x86)}\Adobe",
    "${env:ProgramFiles(x86)}\Common Files\Adobe",
    "$env:ProgramData\Adobe",
    "$env:ProgramData\Application Data\Adobe",
    "$env:LOCALAPPDATA\Adobe",
    "$env:APPDATA\Adobe",
    "$env:LOCALAPPDATA\Temp\Adobe",
    "$env:SystemRoot\Temp\Adobe"
)

# Also sweep every user profile, not just the one running the script.
$userProfiles = Get-ChildItem 'C:\Users' -Directory -ErrorAction SilentlyContinue |
                Where-Object { $_.Name -notin @('Public', 'Default', 'Default User', 'All Users') }
foreach ($up in $userProfiles) {
    $folderTargets += "$($up.FullName)\AppData\Local\Adobe"
    $folderTargets += "$($up.FullName)\AppData\Roaming\Adobe"
    $folderTargets += "$($up.FullName)\AppData\LocalLow\Adobe"
}

foreach ($path in $folderTargets) {
    $resolved = Get-Item -Path $path -ErrorAction SilentlyContinue
    if (-not $resolved) { continue }
    foreach ($item in $resolved) {
        if ($KeepReader -and (Test-IsReader $item.FullName)) { Write-Skip "$($item.FullName) (Reader kept)"; continue }
        if ($PSCmdlet.ShouldProcess($item.FullName, 'Remove folder')) {
            try {
                # Clear read-only/hidden/system attributes that block deletion
                Get-ChildItem $item.FullName -Recurse -Force -ErrorAction SilentlyContinue |
                    ForEach-Object { try { $_.Attributes = 'Normal' } catch {} }
                Remove-Item -LiteralPath $item.FullName -Recurse -Force -ErrorAction Stop
                Write-Good "removed $($item.FullName)"
            } catch { Write-Info "could not fully remove $($item.FullName): $($_.Exception.Message)" }
        }
    }
}

#--------------------------------------------------------------------------
# 5. Remove Adobe registry keys
#--------------------------------------------------------------------------
Write-Step '5. Removing Adobe registry keys'
$regTargets = @(
    'HKLM:\SOFTWARE\Adobe',
    'HKLM:\SOFTWARE\WOW6432Node\Adobe',
    'HKCU:\SOFTWARE\Adobe',
    'HKLM:\SOFTWARE\Policies\Adobe',
    'HKLM:\SYSTEM\CurrentControlSet\Services\AdobeARMservice',
    'HKLM:\SYSTEM\CurrentControlSet\Services\AGSService',
    'HKLM:\SYSTEM\CurrentControlSet\Services\AGMService'
)
foreach ($rk in $regTargets) {
    if (Test-Path $rk) {
        if ($KeepReader -and (Test-IsReader $rk)) { Write-Skip "$rk (Reader kept)"; continue }
        if ($PSCmdlet.ShouldProcess($rk, 'Remove registry key')) {
            try { Remove-Item -Path $rk -Recurse -Force -ErrorAction Stop; Write-Good "removed $rk" }
            catch { Write-Info "could not remove ${rk}: $($_.Exception.Message)" }
        }
    }
}

# Remove Adobe entries from Uninstall list that no longer have working uninstallers
foreach ($base in @(
    'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall',
    'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall',
    'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall')) {
    Get-ChildItem $base -ErrorAction SilentlyContinue | ForEach-Object {
        $props = Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue
        if ($props.DisplayName -match 'Adobe' -or $props.Publisher -match 'Adobe') {
            if ($KeepReader -and (Test-IsReader $props.DisplayName)) { return }
            if ($PSCmdlet.ShouldProcess($_.PSChildName, "Remove stale uninstall entry '$($props.DisplayName)'")) {
                try { Remove-Item $_.PSPath -Recurse -Force -ErrorAction Stop; Write-Good "removed uninstall entry '$($props.DisplayName)'" }
                catch { Write-Info "could not remove uninstall entry: $($_.Exception.Message)" }
            }
        }
    }
}

#--------------------------------------------------------------------------
# 6. Remove Adobe scheduled tasks
#--------------------------------------------------------------------------
Write-Step '6. Removing Adobe scheduled tasks'
try {
    Get-ScheduledTask -ErrorAction SilentlyContinue |
        Where-Object { $_.TaskName -match 'Adobe' -or $_.TaskPath -match 'Adobe' -or ($_.Actions.Execute -match '\\Adobe\\') } |
        ForEach-Object {
            if ($KeepReader -and (Test-IsReader $_.TaskName)) { Write-Skip "task $($_.TaskName) (Reader kept)"; return }
            if ($PSCmdlet.ShouldProcess($_.TaskName, 'Unregister scheduled task')) {
                try { Unregister-ScheduledTask -TaskName $_.TaskName -TaskPath $_.TaskPath -Confirm:$false -ErrorAction Stop; Write-Good "removed task $($_.TaskName)" }
                catch { Write-Info "could not remove task $($_.TaskName): $($_.Exception.Message)" }
            }
        }
} catch { Write-Info "scheduled task enumeration unavailable: $($_.Exception.Message)" }

#--------------------------------------------------------------------------
# 7. Clean Adobe activation/licensing entries from the hosts file
#--------------------------------------------------------------------------
Write-Step '7. Cleaning Adobe entries from the hosts file'
$hosts = "$env:SystemRoot\System32\drivers\etc\hosts"
if (Test-Path $hosts) {
    if ($PSCmdlet.ShouldProcess($hosts, 'Strip Adobe licensing entries')) {
        try {
            $content  = Get-Content $hosts -ErrorAction Stop
            $filtered = $content | Where-Object { $_ -notmatch 'adobe' }
            if ($content.Count -ne $filtered.Count) {
                Copy-Item $hosts "$hosts.adobe-backup_$stamp" -Force
                Set-Content -Path $hosts -Value $filtered -Force -Encoding ASCII
                Write-Good "removed $($content.Count - $filtered.Count) Adobe line(s) from hosts (backup saved)"
            } else { Write-Info 'no Adobe entries found in hosts file' }
        } catch { Write-Info "could not edit hosts file: $($_.Exception.Message)" }
    }
}

#--------------------------------------------------------------------------
# Done
#--------------------------------------------------------------------------
Write-Host @"

============================================================
   Adobe removal pass complete.
   Log saved to: $logFile
   REBOOT the computer to finish clearing locked files.
============================================================
"@ -ForegroundColor Magenta

try { Stop-Transcript | Out-Null } catch {}
Running this PowerShell script

By default, Windows blocks unsigned PowerShell scripts from running. Pick one of the options below to allow it.

Option 1 — Run once (no permanent change)

Open PowerShell in the folder containing the script and run:

powershell.exe -ExecutionPolicy Bypass -File .\Remove-AllAdobe.ps1

Option 2 — Allow scripts for your user (persistent)

Open PowerShell as Administrator and run:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

RemoteSigned lets local scripts run while still requiring signatures on scripts downloaded from the internet.

Option 3 — Fully unrestricted (not recommended)

If you want zero restrictions, run PowerShell as Administrator and:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted

If Windows blocks the file after download

Downloaded files get a "Mark of the Web" flag. Unblock with:

Unblock-File .\Remove-AllAdobe.ps1
Copied to clipboard