Skip to content
  • There are no suggestions because the search field is empty.

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
}