Clean uninstall of PowerSyncPro Migration Agent
Completely remove the PowerSyncPro Migration Agent by uninstalling the software, deleting registry keys, services, and leftover program data.
There may be times where you need or want a complete uninstall of PowerSyncPro Migration Agent. The following script will achieve this for you. You can use this script stand-alone, or incorporate it into your software deployment tools and also Intune as a Platform Script under Scripts and remediations.
It will:
Check for the presence of PowerSyncPro
- Stop the Service
- Find the correct UninstallString
- Uninstall PowerSyncPro Migration Agent
- Delete the associated ProgramData directory
- Delete the associated PowerSyncPro Registry Keys
- Write a txt Log in c:\ProgramData
- Write entries to the Windows Event Log
$RegPath = 'HKLM:\SOFTWARE\Declaration Software\'
$UninstallKeyPath = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'
$ServiceName = 'PowerSyncPro Migration Agent'
$AppName = 'PowerSyncPro Migration Agent'
$AppDataPath = 'C:\ProgramData\Declaration Software\'
$LogFile = "C:\ProgramData\PowerSyncProCleanup.log"
$EventSource = "Intune PowerSyncPro Cleanup"
function Log-Message {
param (
[string]$Message,
[string]$EventType = "Information"
)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$logEntry = "$timestamp - $Message"
# Write to file
Add-Content -Path $LogFile -Value $logEntry
# Attempt to log to Windows Event Log
try {
if (-not [System.Diagnostics.EventLog]::SourceExists($EventSource)) {
New-EventLog -LogName Application -Source $EventSource -ErrorAction SilentlyContinue
}
Write-EventLog -LogName Application -Source $EventSource -EntryType $EventType -EventId 1000 -Message $Message
} catch {
# If we can't write to event log (common in Intune SYSTEM context), just skip
}
}
# Begin script
Log-Message "Starting PowerSyncPro cleanup..."
# Only proceed if the key exists
if (Test-Path $RegPath) {
try {
# Stop service if it exists
$svc = Get-Service -Name $ServiceName -ErrorAction SilentlyContinue
if ($svc) {
Stop-Service -Name $ServiceName -Force -ErrorAction Stop
Log-Message "Service '$ServiceName' stopped successfully."
} else {
Log-Message "Service '$ServiceName' not found." -EventType "Warning"
}
# Look for the uninstall string
$UninstallKey = Get-ChildItem $UninstallKeyPath |
Where-Object { $_.GetValue('DisplayName') -eq $AppName }
if ($UninstallKey) {
$UninstallString = $UninstallKey.GetValue('UninstallString')
if ($UninstallString) {
$cmd = "$UninstallString /norestart /quiet"
Log-Message "Uninstalling: $cmd"
Start-Process -FilePath "cmd.exe" -ArgumentList "/c $cmd" -Wait
Log-Message "Uninstallation completed."
} else {
Log-Message "Uninstall string not found." -EventType "Warning"
}
} else {
Log-Message "Uninstall key not found in registry." -EventType "Warning"
}
# Remove registry key
Remove-Item -Path $RegPath -Recurse -Force -ErrorAction Stop
Log-Message "Registry key '$RegPath' deleted."
# Remove application data folder
if (Test-Path $AppDataPath) {
Remove-Item -Path $AppDataPath -Recurse -Force -ErrorAction Stop
Log-Message "AppData folder '$AppDataPath' deleted."
} else {
Log-Message "AppData folder '$AppDataPath' not found." -EventType "Warning"
}
# Final check
if (-not (Test-Path $RegPath)) {
Log-Message "Cleanup successful. Exiting with code 0."
exit 0
} else {
Log-Message "Registry key still exists. Cleanup incomplete." -EventType "Error"
exit 1
}
} catch {
Log-Message "An error occurred: $_" -EventType "Error"
exit 1
}
} else {
Log-Message "Registry key not found. No action taken."
exit 0
}