<# .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_.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 {}