**Related issue:** N/A — part of the ongoing Windows Fleet-maintained apps (FMA) parity workstream (letter G). ## What this does Adds **19** Windows Fleet-maintained apps for the letter-G batch. Each app has a winget-sourced input, generated output manifest, and (where a cleanly-licensed ≥256px icon was found) a catalog icon. **MSI (clean, upgrade-code uninstall):** - Gadwin PrintScreen, Gadwin PrintScreen Pro, Gadwin ScreenRecorder — free + the two paid editions are distinct products (separate ProductCodes/UpgradeCodes), so each matches by exact ARP name to avoid cross-matching - GitHub CLI, Go, gsudo, grepWin - GeoGebra Classic — the machine MSI; the winget manifest's top-level `Scope: user` forced `installer_scope: user` in the input + custom machine-MSI install/uninstall scripts - Google Ads Editor — dual user/machine WiX MSI; custom install forces `ALLUSERS=1` **MSI (custom uninstall):** - GoodSync — `ignore_hash` (non-versioned "latest" URL drifts from the manifest version/SHA, Chrome/TeamViewer pattern); process-stopping uninstall for its tray app + sync service **NSIS / exe (custom install + uninstall):** - Google Web Designer, Gpg4win (x86-only; versioned ARP name → fuzzy match), GoAnywhere OpenPGP Studio (install4j `-q`), GoldenDict-ng (maintained fork; name-only exists query), Graphviz - Streamlabs Desktop — electron-builder `/S /allusers` + process-stopping uninstall (versioned ARP name → fuzzy match) **WiX burn / electron (custom install + uninstall):** - Garmin BaseCamp, Garmin Express (`ignore_hash` — rolling URL + self-updating app), Galaxy Modeler (`/S /allusers`) ## Dropped from this batch (recorded in the workstream tracker) - **Genesys Cloud Background Assistant** — WiX burn bootstrapper with a hard `VCRedist 2015+ x86` dependency Fleet won't resolve, x86-only, non-standard burn uninstall. - **GoldenDict.GoldenDict** — stale original, superseded by the actively-maintained `xiaoyifang.GoldenDict-ng` fork (shipped instead). - **GeoGebra GraphingCalculator + Geometry** — user-scope-only exe installers (no machine option); shipped GeoGebra Classic (MSI) instead. - **Garden Gnome Package Viewer** — `ggnome.com` download URLs sit behind a Cloudflare `cf-mitigated: challenge` and return 403 to all automated requests (even with the Chrome UA), so Fleet's downloader can't fetch it. ## Notes - **Gadwin ScreenRecorder** and **Garmin Express** ship without a custom catalog icon — no cleanly-licensed ≥256px source was found (they fall back to the generic icon). - Verification (winget manifest identity, installer type/scope/arch, ProductCode/UpgradeCode, silent switches, URL stability) was done per the `new-fma` skill against the winget-pkgs manifests and, where needed, the real installers. ## Testing - [ ] FMA CI validator (install → detect → uninstall) on the SYSTEM-context Windows runner — pending. - Generated outputs verified locally: all 19 produce valid manifests; MSI apps carry the correct UpgradeCode-based uninstall; exists/patched queries reviewed for name + publisher correctness. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added maintained Windows software catalog entries for 13 applications (Gadwin PrintScreen/Pro/ScreenRecorder, Galaxy Modeler, Garmin BaseCamp, GeoGebra Classic, Go, GoAnywhere OpenPGP Studio, GoldenDict-ng, Google Ads Editor, Google Web Designer, Graphviz, grepWin). * Enabled silent install/upgrade detection and automated uninstall behavior for the newly supported apps. * Added app icons and expanded software-name keyword matching for improved identification in the catalog. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
52 lines
1.9 KiB
PowerShell
52 lines
1.9 KiB
PowerShell
# Uninstalls Garmin BaseCamp (WiX Burn bundle). Runs the cached bundle's
|
|
# QuietUninstallString (/uninstall /quiet).
|
|
|
|
$softwareNameLike = "Garmin BaseCamp*"
|
|
|
|
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
|
|
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
|
|
|
|
$exitCode = $null
|
|
|
|
try {
|
|
|
|
[array]$uninstallKeys = Get-ChildItem `
|
|
-Path @($machineKey, $machineKey32on64) `
|
|
-ErrorAction SilentlyContinue |
|
|
ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }
|
|
|
|
$selected = $uninstallKeys |
|
|
Where-Object { $_.DisplayName -like $softwareNameLike } |
|
|
Select-Object -First 1
|
|
if (-not $selected -or -not $selected.UninstallString) {
|
|
Write-Host "Uninstall entry not found for $softwareNameLike"
|
|
Exit 1
|
|
}
|
|
|
|
# WiX Burn: prefer QuietUninstallString; else force /uninstall /quiet onto the bundle exe.
|
|
$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }
|
|
if ($raw -match '^\s*"([^"]+)"\s*(.*)$') {
|
|
$exe = $matches[1]; $exeArgs = $matches[2].Trim()
|
|
} elseif ($raw -match '(?i)^\s*(.+?\.exe)\s*(.*)$') {
|
|
$exe = $matches[1]; $exeArgs = $matches[2].Trim()
|
|
} else {
|
|
$exe = $raw; $exeArgs = ""
|
|
}
|
|
if ($exeArgs -notmatch '(?i)(^|\s)/uninstall(\s|$)') { $exeArgs = "/uninstall $exeArgs".Trim() }
|
|
if ($exeArgs -notmatch '(?i)(^|\s)/quiet(\s|$)') { $exeArgs = "$exeArgs /quiet".Trim() }
|
|
if ($exeArgs -notmatch '(?i)/norestart') { $exeArgs = "$exeArgs /norestart".Trim() }
|
|
|
|
Write-Host "Uninstall command: $exe"
|
|
Write-Host "Uninstall args: $exeArgs"
|
|
$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait
|
|
$exitCode = $process.ExitCode
|
|
Write-Host "Uninstall exit code: $exitCode"
|
|
|
|
} catch {
|
|
Write-Host "Error: $_"
|
|
Exit 1
|
|
}
|
|
|
|
if ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }
|
|
Exit $exitCode
|