<#
.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 {}
By default, Windows blocks unsigned PowerShell scripts from running. Pick one of the options below to allow it.
Open PowerShell in the folder containing the script and run:
Open PowerShell as Administrator and run:
RemoteSigned lets local scripts run while still requiring signatures on scripts downloaded from the internet.
If you want zero restrictions, run PowerShell as Administrator and:
Downloaded files get a "Mark of the Web" flag. Unblock with: