Remove-SnapAgent.ps1
|
#Requires -RunAsAdministrator $snapProcesses = @("SnapAgent", "snap", "snapw", "ztac") $snapFolders = @( "$env:ProgramFiles\Blackpoint\SNAP Agent", "$env:ProgramFiles(x86)\Blackpoint\SNAP Agent" ) $ztacFolders = @( "$env:ProgramFiles\Blackpoint\ZTAC", "$env:ProgramFiles(x86)\Blackpoint\ZTAC" ) $ztacServices = @("ZTAC", "ZtacFltr") # Stop any running processes Write-Host "Stopping any SNAP or ZTAC processes..." -ForegroundColor Green Get-Process $snapProcesses -ErrorAction SilentlyContinue | Stop-Process -Force # Stop and remove ZTAC services Write-Host "Stopping and removing ZTAC services..." -ForegroundColor Green foreach ($service in $ztacServices) { $svc = Get-Service $service -ErrorAction SilentlyContinue if ($svc) { try { if ($svc.Status -ne 'Stopped') { Stop-Service $service -Force -ErrorAction Continue Write-Host "Stopped service: $service" -ForegroundColor Green } # Use sc.exe to delete the service sc.exe delete $service Write-Host "Removed service: $service" -ForegroundColor Green } catch { Write-Warning "Failed to remove service: $service. Error: $_" } } } # Uninstall using MSI for all SnapAgent versions Write-Host "Uninstalling all SnapAgent versions via MSI..." -ForegroundColor Yellow $snapPackages = Get-Package -Name "SnapAgent" -ErrorAction SilentlyContinue if ($snapPackages) { $pkgCount = 0 $totalPkgs = @($snapPackages).Count foreach ($pkg in $snapPackages) { $pkgCount++ Write-Progress -Activity "Uninstalling SnapAgent packages" -Status "Processing $($pkg.Name) $($pkg.Version) ($pkgCount of $totalPkgs)" -PercentComplete (($pkgCount / $totalPkgs) * 100) Write-Host "Found SnapAgent version $($pkg.Version) - Uninstalling..." -ForegroundColor Yellow try { # Try using Uninstall-Package first Uninstall-Package -Name $pkg.Name -RequiredVersion $pkg.Version -Force -ErrorAction Stop Write-Host "Uninstalled SnapAgent $($pkg.Version)" -ForegroundColor Green } catch { Write-Host "Uninstall-Package failed for version $($pkg.Version) (expected, will try msiexec)" -ForegroundColor DarkGray } } Write-Progress -Activity "Uninstalling SnapAgent packages" -Completed } # Dynamically find and uninstall using msiexec with all SnapAgent GUIDs Write-Host "Searching for SnapAgent installations in registry..." -ForegroundColor Yellow $uninstallPaths = @( "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" ) $snapProducts = @() foreach ($path in $uninstallPaths) { $products = Get-ItemProperty $path -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -like "*Snap*" -or $_.Publisher -like "*Blackpoint*" } $snapProducts += $products } if ($snapProducts) { foreach ($product in $snapProducts) { $guid = $product.PSChildName $name = $product.DisplayName $version = $product.DisplayVersion Write-Host "Found: $name $version (GUID: $guid)" -ForegroundColor Yellow Write-Host "Uninstalling via msiexec..." -ForegroundColor Yellow try { # Use msiexec for silent uninstall $uninstallArgs = "/x $guid /qn /norestart" $process = Start-Process "msiexec.exe" -ArgumentList $uninstallArgs -Wait -PassThru -NoNewWindow if ($process.ExitCode -eq 0) { Write-Host "Successfully uninstalled: $name $version" -ForegroundColor Green } else { Write-Warning "msiexec returned exit code $($process.ExitCode) for $name $version" } } catch { Write-Warning "Failed to uninstall $name $version via msiexec: $_" } } } # Uninstall ZTAC packages Write-Host "Removing any existing versions of ZTAC..." -ForegroundColor Green try { Uninstall-Package -Name "ZTAC" -AllVersions -Force -ErrorAction Stop Write-Host "Uninstalled ZTAC packages" -ForegroundColor Green } catch { Write-Host "No ZTAC packages found or uninstall failed (not critical)" -ForegroundColor DarkGray } # Remove folders Write-Host "Removing program directories..." -ForegroundColor Green foreach ($folder in $snapFolders + $ztacFolders) { if (Test-Path $folder) { try { Remove-Item -Path $folder -Recurse -Force Write-Host "Removed folder: $folder" -ForegroundColor Green } catch { Write-Warning "Failed to remove folder: $folder. Error: $_" } } } # Clean up registry keys Write-Host "Cleaning up registry keys..." -ForegroundColor Green # Build list of all discovered product GUIDs plus hardcoded known keys $registryKeys = @( "HKLM:\SOFTWARE\Classes\Installer\Features\0E1D3F0C2B974FA4AA0418F12B055384", "HKLM:\SOFTWARE\Classes\Installer\Products\0E1D3F0C2B974FA4AA0418F12B055384", "HKLM:\SOFTWARE\Classes\Installer\Products\0E1D3F0C2B974FA4AA0418F12B055384\SourceList", "HKLM:\SOFTWARE\Classes\Installer\Products\0E1D3F0C2B974FA4AA0418F12B055384\SourceList\Media", "HKLM:\SOFTWARE\Classes\Installer\Products\0E1D3F0C2B974FA4AA0418F12B055384\SourceList\Net", "HKLM:\SOFTWARE\Classes\Installer\UpgradeCodes\7CF0653F8B24F2647B3A70510A96BEE6", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes\7CF0653F8B24F2647B3A70510A96BEE6", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\08C8C87010175A141912F6695F06EB95", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\5E3D36BBC4ADCA749AC6CC3774478B04", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\74A044CACC826754BB48542EA5681E4C", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\A3129D8FE202CCF47B233E82C70367D2", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\A73F059633BC8314597EE7F81A662796", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\C0016A60CBED93E41900FCBD4BC10AB4", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\DB4ABEA1DA4832048BCCF78860ADA944", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\F1AB931B4E8A02A4F8E5F828409E4DD1", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\F81ECEA5C9A7CA3409D05D38A602B11C", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\0E1D3F0C2B974FA4AA0418F12B055384", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\0E1D3F0C2B974FA4AA0418F12B055384\Features", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\0E1D3F0C2B974FA4AA0418F12B055384\InstallProperties", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\0E1D3F0C2B974FA4AA0418F12B055384\Patches", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\0E1D3F0C2B974FA4AA0418F12B055384\Usage", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{C0F3D1E0-79B2-4AF4-AA40-811FB2503548}", "HKLM:\SYSTEM\CurrentControlSet\Services\ZTAC", "HKLM:\SYSTEM\CurrentControlSet\Services\ZtacFltr" ) # Add registry keys for any discovered product GUIDs if ($snapProducts) { foreach ($product in $snapProducts) { $guid = $product.PSChildName $registryKeys += "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$guid" $registryKeys += "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\$guid" } } $i = 0 foreach ($key in $registryKeys) { Write-Progress -Activity "Cleaning up registry keys" -Status "Processing key $($i + 1) of $($registryKeys.Count)" -PercentComplete (($i / $registryKeys.Count) * 100) if (Test-Path $key) { try { Remove-Item -Path $key -Recurse -Force Write-Host "Removed registry key: $key" -ForegroundColor Green } catch { Write-Warning "Failed to remove registry key: $key. Error: $_" } } $i++ } Write-Progress -Activity "Cleaning up registry keys" -Completed -Status "All registry keys processed." # Final verification Write-Host "`nVerifying cleanup..." -ForegroundColor Cyan $remainingPackages = Get-Package -Name "*Snap*" -ErrorAction SilentlyContinue if ($remainingPackages) { Write-Warning "The following packages are still installed:" $remainingPackages | Format-Table Name, Version, ProviderName } else { Write-Host "No SnapAgent packages found - cleanup successful!" -ForegroundColor Green } # Check for remaining folders $remainingFolders = $snapFolders + $ztacFolders | Where-Object { Test-Path $_ } if ($remainingFolders) { Write-Warning "The following folders still exist:" $remainingFolders | ForEach-Object { Write-Host " $_" -ForegroundColor Yellow } } else { Write-Host "All program folders removed successfully!" -ForegroundColor Green } Write-Host "`nCleanup script completed!" -ForegroundColor Cyan |