Add Windows FMAs (letter G): 13 apps (#49281)

**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 -->
This commit is contained in:
Allen Houchins
2026-07-14 21:33:12 -05:00
committed by GitHub
parent b256e86661
commit e1ab5b56fd
67 changed files with 1301 additions and 0 deletions
@@ -0,0 +1,12 @@
{
"name": "Gadwin PrintScreen Pro",
"slug": "gadwin-printscreen-pro/windows",
"package_identifier": "Gadwin.PrintScreen.Pro",
"unique_identifier": "Gadwin PrintScreenPro (64-Bit)",
"installer_arch": "x64",
"installer_type": "msi",
"installer_scope": "machine",
"default_categories": [
"Productivity"
]
}
@@ -0,0 +1,12 @@
{
"name": "Gadwin PrintScreen",
"slug": "gadwin-printscreen/windows",
"package_identifier": "Gadwin.PrintScreen",
"unique_identifier": "Gadwin PrintScreen (64-Bit)",
"installer_arch": "x64",
"installer_type": "msi",
"installer_scope": "machine",
"default_categories": [
"Productivity"
]
}
@@ -0,0 +1,12 @@
{
"name": "Gadwin ScreenRecorder",
"slug": "gadwin-screenrecorder/windows",
"package_identifier": "Gadwin.ScreenRecorder",
"unique_identifier": "Gadwin ScreenRecorder (64-Bit)",
"installer_arch": "x64",
"installer_type": "msi",
"installer_scope": "machine",
"default_categories": [
"Productivity"
]
}
@@ -0,0 +1,14 @@
{
"name": "Galaxy Modeler",
"slug": "galaxy-modeler/windows",
"package_identifier": "Ideamerit.GalaxyModeler",
"unique_identifier": "Galaxy Modeler",
"installer_arch": "x64",
"installer_type": "exe",
"installer_scope": "machine",
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/galaxy-modeler_install.ps1",
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/galaxy-modeler_uninstall.ps1",
"default_categories": [
"Developer tools"
]
}
@@ -0,0 +1,15 @@
{
"name": "Garmin BaseCamp",
"slug": "garmin-basecamp/windows",
"package_identifier": "Garmin.BaseCamp",
"unique_identifier": "Garmin BaseCamp",
"installer_arch": "x86",
"installer_type": "exe",
"installer_scope": "machine",
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/garmin-basecamp_install.ps1",
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/garmin-basecamp_uninstall.ps1",
"default_categories": [
"Productivity"
],
"program_publisher": "Garmin Ltd. or its subsidiaries"
}
@@ -0,0 +1,14 @@
{
"name": "GeoGebra Classic",
"slug": "geogebra-classic/windows",
"package_identifier": "GeoGebra.Classic",
"unique_identifier": "GeoGebra Classic",
"installer_arch": "x86",
"installer_type": "msi",
"installer_scope": "user",
"default_categories": [
"Productivity"
],
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/geogebra-classic_install.ps1",
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/geogebra-classic_uninstall.ps1"
}
+13
View File
@@ -0,0 +1,13 @@
{
"name": "Go",
"slug": "go/windows",
"package_identifier": "GoLang.Go",
"unique_identifier": "Go Programming Language",
"fuzzy_match_name": "Go Programming Language%",
"installer_arch": "x64",
"installer_type": "msi",
"installer_scope": "machine",
"default_categories": [
"Developer tools"
]
}
@@ -0,0 +1,14 @@
{
"name": "GoAnywhere OpenPGP Studio",
"slug": "goanywhere-openpgp-studio/windows",
"package_identifier": "Fortra.GoAnywhereOpenPGPStudio",
"unique_identifier": "GoAnywhere OpenPGP Studio",
"installer_arch": "x64",
"installer_type": "exe",
"installer_scope": "machine",
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/goanywhere-openpgp-studio_install.ps1",
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/goanywhere-openpgp-studio_uninstall.ps1",
"default_categories": [
"Security"
]
}
@@ -0,0 +1,15 @@
{
"name": "GoldenDict-ng",
"slug": "goldendict-ng/windows",
"package_identifier": "xiaoyifang.GoldenDict-ng",
"unique_identifier": "GoldenDict-ng",
"installer_arch": "x64",
"installer_type": "exe",
"installer_scope": "machine",
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/goldendict-ng_install.ps1",
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/goldendict-ng_uninstall.ps1",
"default_categories": [
"Productivity"
],
"exists_query": "SELECT 1 FROM programs WHERE name = 'GoldenDict-ng';"
}
@@ -0,0 +1,13 @@
{
"name": "Google Ads Editor",
"slug": "google-ads-editor/windows",
"package_identifier": "Google.AdsEditor",
"unique_identifier": "Google Ads Editor",
"installer_arch": "x64",
"installer_type": "msi",
"installer_scope": "machine",
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/google-ads-editor_install.ps1",
"default_categories": [
"Productivity"
]
}
@@ -0,0 +1,14 @@
{
"name": "Google Web Designer",
"slug": "google-web-designer/windows",
"package_identifier": "Google.GoogleWebDesigner",
"unique_identifier": "Google Web Designer",
"installer_arch": "x64",
"installer_type": "exe",
"installer_scope": "machine",
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/google-web-designer_install.ps1",
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/google-web-designer_uninstall.ps1",
"default_categories": [
"Developer tools"
]
}
@@ -0,0 +1,14 @@
{
"name": "Graphviz",
"slug": "graphviz/windows",
"package_identifier": "Graphviz.Graphviz",
"unique_identifier": "Graphviz",
"installer_arch": "x64",
"installer_type": "exe",
"installer_scope": "machine",
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/graphviz_install.ps1",
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/graphviz_uninstall.ps1",
"default_categories": [
"Developer tools"
]
}
@@ -0,0 +1,12 @@
{
"name": "grepWin",
"slug": "grepwin/windows",
"package_identifier": "StefansTools.grepWin",
"unique_identifier": "grepWin",
"installer_arch": "x64",
"installer_type": "msi",
"installer_scope": "machine",
"default_categories": [
"Developer tools"
]
}
@@ -0,0 +1,22 @@
# Learn more about .exe install scripts:
# http://fleetdm.com/learn-more-about/exe-install-scripts
#
# Galaxy Modeler is an electron-builder (NSIS) installer; /S runs silent and
# /allusers forces the machine-wide install per the winget machine-scope switch.
$exeFilePath = "${env:INSTALLER_PATH}"
try {
$process = Start-Process -FilePath "$exeFilePath" -ArgumentList "/S /allusers" -PassThru -Wait
$exitCode = $process.ExitCode
Write-Host "Install exit code: $exitCode"
# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated
if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }
Exit $exitCode
} catch {
Write-Host "Error: $_"
Exit 1
}
@@ -0,0 +1,56 @@
# Uninstalls Galaxy Modeler. Locates the electron-builder NSIS uninstaller from
# the registry by DisplayName and runs it with /allusers /S after stopping the app.
$softwareNameLike = "Galaxy Modeler*"
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
$exitCode = $null
try {
foreach ($p in @("Galaxy Modeler")) {
Stop-Process -Name $p -Force -ErrorAction SilentlyContinue
}
Start-Sleep -Seconds 2
[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
}
$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 = ""
}
# electron-builder NSIS uninstaller: /allusers matches the machine install, /S is silent.
if ($exeArgs -notmatch '(?i)(^|\s)/allusers(\s|$)') { $exeArgs = "$exeArgs /allusers".Trim() }
if ($exeArgs -notmatch '(?i)(^|\s)/S(\s|$)') { $exeArgs = "$exeArgs /S".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
@@ -0,0 +1,22 @@
# Learn more about .exe install scripts:
# http://fleetdm.com/learn-more-about/exe-install-scripts
#
# Garmin BaseCamp is a WiX Burn bundle; /quiet /norestart runs it silently and
# installs machine-wide.
$exeFilePath = "${env:INSTALLER_PATH}"
try {
$process = Start-Process -FilePath "$exeFilePath" -ArgumentList "/quiet /norestart" -PassThru -Wait
$exitCode = $process.ExitCode
Write-Host "Install exit code: $exitCode"
# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated
if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }
Exit $exitCode
} catch {
Write-Host "Error: $_"
Exit 1
}
@@ -0,0 +1,51 @@
# 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
@@ -0,0 +1,24 @@
# Learn more about install scripts:
# http://fleetdm.com/learn-more-about/install-scripts
#
# GeoGebra Classic's winget manifest declares Scope: user at the top level, but
# its WiX MSI installer is machine-wide (installs to Program Files (x86)). We run
# the MSI silently; ALLUSERS is set inside the package, so it lands per-machine.
$logFile = "${env:TEMP}/fleet-install-software.log"
try {
$installProcess = Start-Process msiexec.exe `
-ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" `
-PassThru -Verb RunAs -Wait
Get-Content $logFile -Tail 500
if ($installProcess.ExitCode -eq 3010 -or $installProcess.ExitCode -eq 1641) { Exit 0 }
Exit $installProcess.ExitCode
} catch {
Write-Host "Error: $_"
Exit 1
}
@@ -0,0 +1,46 @@
# Uninstalls GeoGebra Classic (machine-wide WiX MSI). Resolve the ProductCode
# from the registry by DisplayName and uninstall via msiexec.
$softwareName = "GeoGebra Classic"
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
$successCodes = @(0, 3010, 1641)
$exitCode = $null
try {
[array]$uninstallKeys = Get-ChildItem `
-Path @($machineKey, $machineKey32on64) `
-ErrorAction SilentlyContinue |
ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }
$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1
if (-not $selected) {
Write-Host "Uninstall entry not found for '$softwareName'."
Exit 1
}
$productCode = $selected.PSChildName
if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') {
$raw = $selected.UninstallString
if ($raw -match '(\{[0-9A-Fa-f-]+\})') { $productCode = $matches[1] }
}
if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') {
Write-Host "Could not determine ProductCode for '$softwareName'."
Exit 1
}
Write-Host "Uninstalling product code: $productCode"
$process = Start-Process msiexec.exe `
-ArgumentList "/x $productCode /qn /norestart" -NoNewWindow -PassThru -Wait
$exitCode = $process.ExitCode
Write-Host "Uninstall exit code: $exitCode"
} catch {
Write-Host "Error: $_"
Exit 1
}
if ($successCodes -contains $exitCode) { Exit 0 }
Exit $exitCode
@@ -0,0 +1,22 @@
# Learn more about .exe install scripts:
# http://fleetdm.com/learn-more-about/exe-install-scripts
#
# GoAnywhere OpenPGP Studio ships as an install4j installer (bundled JRE). -q
# runs it unattended; suppressUnattendedReboot avoids an automatic reboot.
$exeFilePath = "${env:INSTALLER_PATH}"
try {
$process = Start-Process -FilePath "$exeFilePath" `
-ArgumentList "-q -Dinstall4j.suppressUnattendedReboot=true" -PassThru -Wait
$exitCode = $process.ExitCode
Write-Host "Install exit code: $exitCode"
if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }
Exit $exitCode
} catch {
Write-Host "Error: $_"
Exit 1
}
@@ -0,0 +1,54 @@
# Uninstalls GoAnywhere OpenPGP Studio. install4j registers an ARP entry whose
# UninstallString points at its uninstall.exe; -q runs it unattended.
$softwareNameLike = "GoAnywhere OpenPGP Studio*"
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
$exitCode = $null
try {
foreach ($p in @("OpenPGPStudio", "GoAnywhere OpenPGP Studio")) {
Stop-Process -Name $p -Force -ErrorAction SilentlyContinue
}
[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
}
$raw = $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 = ""
}
# install4j silent uninstall flag.
if ($exeArgs -notmatch '(?i)(^|\s)-q(\s|$)') { $exeArgs = "$exeArgs -q".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
@@ -0,0 +1,22 @@
# Learn more about .exe install scripts:
# http://fleetdm.com/learn-more-about/exe-install-scripts
#
# GoldenDict-ng is a Nullsoft (NSIS) installer declaring machine scope;
# /S runs it silently and installs machine-wide to Program Files.
$exeFilePath = "${env:INSTALLER_PATH}"
try {
$process = Start-Process -FilePath "$exeFilePath" -ArgumentList "/S" -PassThru -Wait
$exitCode = $process.ExitCode
Write-Host "Install exit code: $exitCode"
# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated
if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }
Exit $exitCode
} catch {
Write-Host "Error: $_"
Exit 1
}
@@ -0,0 +1,57 @@
# Uninstalls GoldenDict-ng. Locates the NSIS uninstaller from the registry by
# DisplayName and runs it silently with /S. Stop the app first so files unlock.
$softwareNameLike = "GoldenDict-ng*"
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
$exitCode = $null
try {
foreach ($p in @("GoldenDict")) {
Stop-Process -Name $p -Force -ErrorAction SilentlyContinue
}
Start-Sleep -Seconds 2
[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
}
$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }
# Parse exe + args (quoted / unquoted / bare).
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 = ""
}
# NSIS uninstallers require /S for a silent uninstall.
if ($exeArgs -notmatch '(?i)(^|\s)/S(\s|$)') { $exeArgs = "$exeArgs /S".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
@@ -0,0 +1,28 @@
# Learn more about install scripts:
# http://fleetdm.com/learn-more-about/install-scripts
#
# The Google Ads Editor MSI ships as both a per-user and a per-machine package
# (same binary; the machine variant sets ALLUSERS=1). A plain silent install
# under Fleet's SYSTEM context can land per-user (in the SYSTEM profile), so we
# force a true per-machine install by passing ALLUSERS=1 explicitly.
$logFile = "${env:TEMP}/fleet-install-software.log"
try {
$installProcess = Start-Process msiexec.exe `
-ArgumentList "/quiet /norestart /lv ${logFile} ALLUSERS=1 /i `"${env:INSTALLER_PATH}`"" `
-PassThru -Verb RunAs -Wait
Get-Content $logFile -Tail 500
# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated
if ($installProcess.ExitCode -eq 3010 -or $installProcess.ExitCode -eq 1641) {
Exit 0
}
Exit $installProcess.ExitCode
} catch {
Write-Host "Error: $_"
Exit 1
}
@@ -0,0 +1,22 @@
# Learn more about .exe install scripts:
# http://fleetdm.com/learn-more-about/exe-install-scripts
#
# Google Web Designer is a Nullsoft (NSIS) installer declaring machine scope;
# /S runs it silently and installs machine-wide to Program Files.
$exeFilePath = "${env:INSTALLER_PATH}"
try {
$process = Start-Process -FilePath "$exeFilePath" -ArgumentList "/S" -PassThru -Wait
$exitCode = $process.ExitCode
Write-Host "Install exit code: $exitCode"
# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated
if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }
Exit $exitCode
} catch {
Write-Host "Error: $_"
Exit 1
}
@@ -0,0 +1,52 @@
# Uninstalls Google Web Designer. Locates the NSIS uninstaller from the registry
# by DisplayName and runs it silently with /S.
$softwareNameLike = "Google Web Designer*"
$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
}
$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }
# Parse exe + args (quoted / unquoted / bare).
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 = ""
}
# NSIS uninstallers require /S for a silent uninstall.
if ($exeArgs -notmatch '(?i)(^|\s)/S(\s|$)') { $exeArgs = "$exeArgs /S".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
@@ -0,0 +1,22 @@
# Learn more about .exe install scripts:
# http://fleetdm.com/learn-more-about/exe-install-scripts
#
# Graphviz is a Nullsoft (NSIS) installer declaring machine scope; /S runs it
# silently and installs machine-wide to Program Files.
$exeFilePath = "${env:INSTALLER_PATH}"
try {
$process = Start-Process -FilePath "$exeFilePath" -ArgumentList "/S" -PassThru -Wait
$exitCode = $process.ExitCode
Write-Host "Install exit code: $exitCode"
# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated
if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }
Exit $exitCode
} catch {
Write-Host "Error: $_"
Exit 1
}
@@ -0,0 +1,52 @@
# Uninstalls Graphviz. Locates the NSIS uninstaller from the registry by
# DisplayName and runs it silently with /S.
$softwareNameLike = "Graphviz*"
$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
}
$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }
# Parse exe + args (quoted / unquoted / bare).
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 = ""
}
# NSIS uninstallers require /S for a silent uninstall.
if ($exeArgs -notmatch '(?i)(^|\s)/S(\s|$)') { $exeArgs = "$exeArgs /S".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
+91
View File
@@ -3473,6 +3473,41 @@
"unique_identifier": "com.nektony.Funter-SIII",
"description": "Funter is a shows hidden files and folders and switches their visibility in Finder."
},
{
"name": "Gadwin PrintScreen Pro",
"slug": "gadwin-printscreen-pro/windows",
"platform": "windows",
"unique_identifier": "Gadwin PrintScreenPro (64-Bit)",
"description": "Gadwin PrintScreen Pro is a screen capture tool for saving, printing, and sharing screenshots."
},
{
"name": "Gadwin PrintScreen",
"slug": "gadwin-printscreen/windows",
"platform": "windows",
"unique_identifier": "Gadwin PrintScreen (64-Bit)",
"description": "Gadwin PrintScreen is a screen capture tool that saves screenshots in multiple graphics formats."
},
{
"name": "Gadwin ScreenRecorder",
"slug": "gadwin-screenrecorder/windows",
"platform": "windows",
"unique_identifier": "Gadwin ScreenRecorder (64-Bit)",
"description": "Gadwin ScreenRecorder is a screen recording tool for creating videos of on-screen activity."
},
{
"name": "Galaxy Modeler",
"slug": "galaxy-modeler/windows",
"platform": "windows",
"unique_identifier": "Galaxy Modeler",
"description": "Galaxy Modeler is a visual schema design tool for GraphQL data modeling."
},
{
"name": "Garmin BaseCamp",
"slug": "garmin-basecamp/windows",
"platform": "windows",
"unique_identifier": "Garmin BaseCamp",
"description": "Garmin BaseCamp is a trip-planning application for organizing maps, routes, and outdoor activities."
},
{
"name": "Garmin Express",
"slug": "garmin-express/darwin",
@@ -3543,6 +3578,13 @@
"unique_identifier": "GenesysCloud",
"description": "Genesys Cloud is a desktop app for running the Genesys Cloud contact center platform as a stand-alone program, separate from the web browser."
},
{
"name": "GeoGebra Classic",
"slug": "geogebra-classic/windows",
"platform": "windows",
"unique_identifier": "GeoGebra Classic",
"description": "GeoGebra Classic is a math tool bundle for geometry, algebra, spreadsheets, and calculus."
},
{
"name": "Gephi",
"slug": "gephi/darwin",
@@ -3648,6 +3690,13 @@
"unique_identifier": "com.GeorgSeifert.Glyphs3",
"description": "Glyphs is a font editor."
},
{
"name": "Go",
"slug": "go/windows",
"platform": "windows",
"unique_identifier": "Go Programming Language",
"description": "Go is an open-source programming language for building secure, scalable systems."
},
{
"name": "Go2Shell",
"slug": "go2shell/darwin",
@@ -3655,6 +3704,13 @@
"unique_identifier": "com.zipzapmac.Go2Shell",
"description": "Go2Shell is an opens a terminal window to the current directory in Finder."
},
{
"name": "GoAnywhere OpenPGP Studio",
"slug": "goanywhere-openpgp-studio/windows",
"platform": "windows",
"unique_identifier": "GoAnywhere OpenPGP Studio",
"description": "GoAnywhere OpenPGP Studio is a free PGP encryption tool for securing files."
},
{
"name": "Godot Engine",
"slug": "godot/darwin",
@@ -3697,6 +3753,13 @@
"unique_identifier": "GoLand",
"description": "GoLand is a Go (golang) IDE by JetBrains"
},
{
"name": "GoldenDict-ng",
"slug": "goldendict-ng/windows",
"platform": "windows",
"unique_identifier": "GoldenDict-ng",
"description": "GoldenDict-ng is an open-source dictionary lookup program supporting multiple dictionary formats."
},
{
"name": "GoodSync",
"slug": "goodsync/darwin",
@@ -3704,6 +3767,13 @@
"unique_identifier": "com.sibersystems.goodsyncmac2000",
"description": "GoodSync is a file synchronisation and backup software."
},
{
"name": "Google Ads Editor",
"slug": "google-ads-editor/windows",
"platform": "windows",
"unique_identifier": "Google Ads Editor",
"description": "Google Ads Editor is a free application for managing Google Ads campaigns."
},
{
"name": "Google Chrome",
"slug": "google-chrome/darwin",
@@ -3753,6 +3823,13 @@
"unique_identifier": "com.google.GeminiMacOS",
"description": "Google Gemini is a native desktop AI assistant from Google."
},
{
"name": "Google Web Designer",
"slug": "google-web-designer/windows",
"platform": "windows",
"unique_identifier": "Google Web Designer",
"description": "Google Web Designer is a tool for creating HTML5-based ads, videos, and interactive designs."
},
{
"name": "GoToMeeting",
"slug": "gotomeeting/darwin",
@@ -3816,6 +3893,20 @@
"unique_identifier": "Granola",
"description": "Granola is an AI-powered notepad for meetings."
},
{
"name": "Graphviz",
"slug": "graphviz/windows",
"platform": "windows",
"unique_identifier": "Graphviz",
"description": "Graphviz is open-source graph visualization software for representing structural information as diagrams."
},
{
"name": "grepWin",
"slug": "grepwin/windows",
"platform": "windows",
"unique_identifier": "grepWin",
"description": "grepWin is a regular expression search-and-replace tool for Windows."
},
{
"name": "Grids",
"slug": "grids/darwin",
@@ -0,0 +1,23 @@
{
"versions": [
{
"version": "6.5.0.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Gadwin PrintScreenPro (64-Bit)' AND publisher = 'Gadwin, Ltd.';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Gadwin PrintScreenPro (64-Bit)' AND publisher = 'Gadwin, Ltd.' AND version_compare(version, '6.5.0.0') < 0);"
},
"installer_url": "https://www.gadwin.com/download/PrintScreenPro650_Win64.msi",
"install_script_ref": "8959087b",
"uninstall_script_ref": "9290bdad",
"sha256": "4affdc0955cf0c7d84f4916304d7faf2f0f4240ad13cecef1364b470dfc73ca6",
"default_categories": [
"Productivity"
],
"upgrade_code": "{482A9C7A-6CB8-4B90-AABC-06AF4A94327D}"
}
],
"refs": {
"8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"9290bdad": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{482A9C7A-6CB8-4B90-AABC-06AF4A94327D}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($successCodes -notcontains $process.ExitCode) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n"
}
}
@@ -0,0 +1,23 @@
{
"versions": [
{
"version": "6.5.0.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Gadwin PrintScreen (64-Bit)' AND publisher = 'Gadwin, Ltd.';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Gadwin PrintScreen (64-Bit)' AND publisher = 'Gadwin, Ltd.' AND version_compare(version, '6.5.0.0') < 0);"
},
"installer_url": "https://www.gadwin.com/download/PrintScreen650_Win64.msi",
"install_script_ref": "8959087b",
"uninstall_script_ref": "faa268fb",
"sha256": "46315da911ecc82191d77bf2686e24ec0b02a6846f5e046e62f5642431eaf1a1",
"default_categories": [
"Productivity"
],
"upgrade_code": "{56218125-6D61-40D5-922A-F2651C8988AC}"
}
],
"refs": {
"8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"faa268fb": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{56218125-6D61-40D5-922A-F2651C8988AC}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($successCodes -notcontains $process.ExitCode) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n"
}
}
@@ -0,0 +1,23 @@
{
"versions": [
{
"version": "4.5.0.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Gadwin ScreenRecorder (64-Bit)' AND publisher = 'Gadwin, Ltd.';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Gadwin ScreenRecorder (64-Bit)' AND publisher = 'Gadwin, Ltd.' AND version_compare(version, '4.5.0.0') < 0);"
},
"installer_url": "https://www.gadwin.com/download/ScreenRecorder450_Win64.msi",
"install_script_ref": "8959087b",
"uninstall_script_ref": "38f42353",
"sha256": "2119b9f8c7d2353662ae5141d51eb8581ac308a6964a101a3e83a03156962efd",
"default_categories": [
"Productivity"
],
"upgrade_code": "{FD892A1E-972D-428C-BF97-5494CD7795C5}"
}
],
"refs": {
"38f42353": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{FD892A1E-972D-428C-BF97-5494CD7795C5}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($successCodes -notcontains $process.ExitCode) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n",
"8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
}
}
@@ -0,0 +1,22 @@
{
"versions": [
{
"version": "12.6.2",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Galaxy Modeler' AND publisher = 'Ideamerit';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Galaxy Modeler' AND publisher = 'Ideamerit' AND version_compare(version, '12.6.2') < 0);"
},
"installer_url": "https://www.datensen.com/downloads/Galaxy%20Modeler-12.6.2-x64.exe",
"install_script_ref": "44443700",
"uninstall_script_ref": "5719b9f7",
"sha256": "c82fc58b557d629c46206f898f23aa103aac5cb08831d8aa17e4a3728bb917a6",
"default_categories": [
"Developer tools"
]
}
],
"refs": {
"44443700": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# Galaxy Modeler is an electron-builder (NSIS) installer; /S runs silent and\n# /allusers forces the machine-wide install per the winget machine-scope switch.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$process = Start-Process -FilePath \"$exeFilePath\" -ArgumentList \"/S /allusers\" -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Install exit code: $exitCode\"\n\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"5719b9f7": "# Uninstalls Galaxy Modeler. Locates the electron-builder NSIS uninstaller from\n# the registry by DisplayName and runs it with /allusers /S after stopping the app.\n\n$softwareNameLike = \"Galaxy Modeler*\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\n$exitCode = $null\n\ntry {\n\nforeach ($p in @(\"Galaxy Modeler\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 2\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys |\n Where-Object { $_.DisplayName -like $softwareNameLike } |\n Select-Object -First 1\nif (-not $selected -or -not $selected.UninstallString) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 1\n}\n\n$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }\nif ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} else {\n $exe = $raw; $exeArgs = \"\"\n}\n\n# electron-builder NSIS uninstaller: /allusers matches the machine install, /S is silent.\nif ($exeArgs -notmatch '(?i)(^|\\s)/allusers(\\s|$)') { $exeArgs = \"$exeArgs /allusers\".Trim() }\nif ($exeArgs -notmatch '(?i)(^|\\s)/S(\\s|$)') { $exeArgs = \"$exeArgs /S\".Trim() }\n\nWrite-Host \"Uninstall command: $exe\"\nWrite-Host \"Uninstall args: $exeArgs\"\n$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n"
}
}
@@ -0,0 +1,22 @@
{
"versions": [
{
"version": "4.7.5.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Garmin BaseCamp' AND publisher = 'Garmin Ltd. or its subsidiaries';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Garmin BaseCamp' AND publisher = 'Garmin Ltd. or its subsidiaries' AND version_compare(version, '4.7.5.0') < 0);"
},
"installer_url": "https://download.garmin.com/software/BaseCamp_475.exe",
"install_script_ref": "df742bcc",
"uninstall_script_ref": "71f96656",
"sha256": "12c753fc067acb51b4a28cb01946edfb6a2545e8865fa2a346689526aeba30ca",
"default_categories": [
"Productivity"
]
}
],
"refs": {
"71f96656": "# Uninstalls Garmin BaseCamp (WiX Burn bundle). Runs the cached bundle's\n# QuietUninstallString (/uninstall /quiet).\n\n$softwareNameLike = \"Garmin BaseCamp*\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\n$exitCode = $null\n\ntry {\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys |\n Where-Object { $_.DisplayName -like $softwareNameLike } |\n Select-Object -First 1\nif (-not $selected -or -not $selected.UninstallString) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 1\n}\n\n# WiX Burn: prefer QuietUninstallString; else force /uninstall /quiet onto the bundle exe.\n$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }\nif ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} else {\n $exe = $raw; $exeArgs = \"\"\n}\nif ($exeArgs -notmatch '(?i)(^|\\s)/uninstall(\\s|$)') { $exeArgs = \"/uninstall $exeArgs\".Trim() }\nif ($exeArgs -notmatch '(?i)(^|\\s)/quiet(\\s|$)') { $exeArgs = \"$exeArgs /quiet\".Trim() }\nif ($exeArgs -notmatch '(?i)/norestart') { $exeArgs = \"$exeArgs /norestart\".Trim() }\n\nWrite-Host \"Uninstall command: $exe\"\nWrite-Host \"Uninstall args: $exeArgs\"\n$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n",
"df742bcc": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# Garmin BaseCamp is a WiX Burn bundle; /quiet /norestart runs it silently and\n# installs machine-wide.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$process = Start-Process -FilePath \"$exeFilePath\" -ArgumentList \"/quiet /norestart\" -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Install exit code: $exitCode\"\n\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
}
}
@@ -0,0 +1,22 @@
{
"versions": [
{
"version": "6.0.920",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'GeoGebra Classic' AND publisher = 'International GeoGebra Institute';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'GeoGebra Classic' AND publisher = 'International GeoGebra Institute' AND version_compare(version, '6.0.920') < 0);"
},
"installer_url": "https://download.geogebra.org/installers/6.0/GeoGebra-Windows-Installer-6-0-920-0.msi",
"install_script_ref": "ebe19da8",
"uninstall_script_ref": "2d02bc56",
"sha256": "65a63d49cc15d64a459338d622c4dde34a2b811ec5dddefe9e4e9c3f7d830ae7",
"default_categories": [
"Productivity"
]
}
],
"refs": {
"2d02bc56": "# Uninstalls GeoGebra Classic (machine-wide WiX MSI). Resolve the ProductCode\n# from the registry by DisplayName and uninstall via msiexec.\n\n$softwareName = \"GeoGebra Classic\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$successCodes = @(0, 3010, 1641)\n$exitCode = $null\n\ntry {\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1\nif (-not $selected) {\n Write-Host \"Uninstall entry not found for '$softwareName'.\"\n Exit 1\n}\n\n$productCode = $selected.PSChildName\nif ($productCode -notmatch '^\\{[0-9A-Fa-f-]+\\}$') {\n $raw = $selected.UninstallString\n if ($raw -match '(\\{[0-9A-Fa-f-]+\\})') { $productCode = $matches[1] }\n}\nif ($productCode -notmatch '^\\{[0-9A-Fa-f-]+\\}$') {\n Write-Host \"Could not determine ProductCode for '$softwareName'.\"\n Exit 1\n}\n\nWrite-Host \"Uninstalling product code: $productCode\"\n$process = Start-Process msiexec.exe `\n -ArgumentList \"/x $productCode /qn /norestart\" -NoNewWindow -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($successCodes -contains $exitCode) { Exit 0 }\nExit $exitCode\n",
"ebe19da8": "# Learn more about install scripts:\n# http://fleetdm.com/learn-more-about/install-scripts\n#\n# GeoGebra Classic's winget manifest declares Scope: user at the top level, but\n# its WiX MSI installer is machine-wide (installs to Program Files (x86)). We run\n# the MSI silently; ALLUSERS is set inside the package, so it lands per-machine.\n\n$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nif ($installProcess.ExitCode -eq 3010 -or $installProcess.ExitCode -eq 1641) { Exit 0 }\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
}
}
@@ -0,0 +1,23 @@
{
"versions": [
{
"version": "1.26.5",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name LIKE 'Go Programming Language%' AND publisher = 'https://go.dev';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Go Programming Language%' AND publisher = 'https://go.dev' AND version_compare(version, '1.26.5') < 0);"
},
"installer_url": "https://go.dev/dl/go1.26.5.windows-amd64.msi",
"install_script_ref": "8959087b",
"uninstall_script_ref": "0047620c",
"sha256": "d554dc209403b101225fc2b54647ef47df09bea23291b1246fe1b35198f55f50",
"default_categories": [
"Developer tools"
],
"upgrade_code": "{22EA7650-4AC6-4001-BF29-F4B8775DB1C0}"
}
],
"refs": {
"0047620c": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{22EA7650-4AC6-4001-BF29-F4B8775DB1C0}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($successCodes -notcontains $process.ExitCode) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n",
"8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
}
}
@@ -0,0 +1,22 @@
{
"versions": [
{
"version": "1.2.3",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'GoAnywhere OpenPGP Studio' AND publisher = 'Fortra';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'GoAnywhere OpenPGP Studio' AND publisher = 'Fortra' AND version_compare(version, '1.2.3') < 0);"
},
"installer_url": "https://static.goanywhere.com/releases/goanywhere/openpgpstudio/gapgpstudio1_2_3_windows-x64.exe",
"install_script_ref": "d871f28a",
"uninstall_script_ref": "b0caf715",
"sha256": "8c50532e3ba8f8fcf2333787741c132be6dc36ab97f50f04d35764a197bf0d5d",
"default_categories": [
"Security"
]
}
],
"refs": {
"b0caf715": "# Uninstalls GoAnywhere OpenPGP Studio. install4j registers an ARP entry whose\n# UninstallString points at its uninstall.exe; -q runs it unattended.\n\n$softwareNameLike = \"GoAnywhere OpenPGP Studio*\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\n$exitCode = $null\n\ntry {\n\nforeach ($p in @(\"OpenPGPStudio\", \"GoAnywhere OpenPGP Studio\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys |\n Where-Object { $_.DisplayName -like $softwareNameLike } |\n Select-Object -First 1\nif (-not $selected -or -not $selected.UninstallString) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 1\n}\n\n$raw = $selected.UninstallString\nif ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} else {\n $exe = $raw; $exeArgs = \"\"\n}\n\n# install4j silent uninstall flag.\nif ($exeArgs -notmatch '(?i)(^|\\s)-q(\\s|$)') { $exeArgs = \"$exeArgs -q\".Trim() }\n\nWrite-Host \"Uninstall command: $exe\"\nWrite-Host \"Uninstall args: $exeArgs\"\n$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n",
"d871f28a": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# GoAnywhere OpenPGP Studio ships as an install4j installer (bundled JRE). -q\n# runs it unattended; suppressUnattendedReboot avoids an automatic reboot.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$process = Start-Process -FilePath \"$exeFilePath\" `\n -ArgumentList \"-q -Dinstall4j.suppressUnattendedReboot=true\" -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Install exit code: $exitCode\"\n\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
}
}
@@ -0,0 +1,22 @@
{
"versions": [
{
"version": "26.6.2",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'GoldenDict-ng';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'GoldenDict-ng' AND version_compare(version, '26.6.2') < 0);"
},
"installer_url": "https://github.com/xiaoyifang/goldendict-ng/releases/download/v26.6.2/GoldenDict-ng-26.6.2-Qt6.8.3-Windows-installer.exe",
"install_script_ref": "cfd3838e",
"uninstall_script_ref": "ae5457ec",
"sha256": "8225752610bc6f3669c5a07df6f14ce05a538ed3a97ee789c06efd4ff17f09e2",
"default_categories": [
"Productivity"
]
}
],
"refs": {
"ae5457ec": "# Uninstalls GoldenDict-ng. Locates the NSIS uninstaller from the registry by\n# DisplayName and runs it silently with /S. Stop the app first so files unlock.\n\n$softwareNameLike = \"GoldenDict-ng*\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\n$exitCode = $null\n\ntry {\n\nforeach ($p in @(\"GoldenDict\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 2\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys |\n Where-Object { $_.DisplayName -like $softwareNameLike } |\n Select-Object -First 1\nif (-not $selected -or -not $selected.UninstallString) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 1\n}\n\n$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }\n\n# Parse exe + args (quoted / unquoted / bare).\nif ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} else {\n $exe = $raw; $exeArgs = \"\"\n}\n\n# NSIS uninstallers require /S for a silent uninstall.\nif ($exeArgs -notmatch '(?i)(^|\\s)/S(\\s|$)') { $exeArgs = \"$exeArgs /S\".Trim() }\n\nWrite-Host \"Uninstall command: $exe\"\nWrite-Host \"Uninstall args: $exeArgs\"\n$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n",
"cfd3838e": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# GoldenDict-ng is a Nullsoft (NSIS) installer declaring machine scope;\n# /S runs it silently and installs machine-wide to Program Files.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$process = Start-Process -FilePath \"$exeFilePath\" -ArgumentList \"/S\" -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Install exit code: $exitCode\"\n\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
}
}
@@ -0,0 +1,23 @@
{
"versions": [
{
"version": "14.12.6.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Google Ads Editor' AND publisher = 'Google';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Google Ads Editor' AND publisher = 'Google' AND version_compare(version, '14.12.6.0') < 0);"
},
"installer_url": "https://dl.google.com/release2/misc/ccmy7b6t6gzbw2miz232rfkch4_14.12.6.0/google_ads_editor.msi",
"install_script_ref": "bdccfcda",
"uninstall_script_ref": "36567b20",
"sha256": "ad7b17f20fc0e1696e92f9b165ec66e41b45adc202324770ad7ba1c280329a9f",
"default_categories": [
"Productivity"
],
"upgrade_code": "{2C881436-87C2-4224-B264-38277EB91B37}"
}
],
"refs": {
"36567b20": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{2C881436-87C2-4224-B264-38277EB91B37}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($successCodes -notcontains $process.ExitCode) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n",
"bdccfcda": "# Learn more about install scripts:\n# http://fleetdm.com/learn-more-about/install-scripts\n#\n# The Google Ads Editor MSI ships as both a per-user and a per-machine package\n# (same binary; the machine variant sets ALLUSERS=1). A plain silent install\n# under Fleet's SYSTEM context can land per-user (in the SYSTEM profile), so we\n# force a true per-machine install by passing ALLUSERS=1 explicitly.\n\n$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} ALLUSERS=1 /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($installProcess.ExitCode -eq 3010 -or $installProcess.ExitCode -eq 1641) {\n Exit 0\n}\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
}
}
@@ -0,0 +1,22 @@
{
"versions": [
{
"version": "14.3.0.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Google Web Designer' AND publisher = 'Google LLC.';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Google Web Designer' AND publisher = 'Google LLC.' AND version_compare(version, '14.3.0.0') < 0);"
},
"installer_url": "https://dl.google.com/release2/Webdesigner/acky5xyddb2r44okdi2iwoujpiwa_14.3.0.0/googlewebdesigner_win_x64_14.3.0.0.exe",
"install_script_ref": "a7d586ca",
"uninstall_script_ref": "ecb2fc92",
"sha256": "0bd982d5af4ba0cf4178dfbf25730ae27bd79b597a6096498b66563eae338faf",
"default_categories": [
"Developer tools"
]
}
],
"refs": {
"a7d586ca": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# Google Web Designer is a Nullsoft (NSIS) installer declaring machine scope;\n# /S runs it silently and installs machine-wide to Program Files.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$process = Start-Process -FilePath \"$exeFilePath\" -ArgumentList \"/S\" -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Install exit code: $exitCode\"\n\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"ecb2fc92": "# Uninstalls Google Web Designer. Locates the NSIS uninstaller from the registry\n# by DisplayName and runs it silently with /S.\n\n$softwareNameLike = \"Google Web Designer*\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\n$exitCode = $null\n\ntry {\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys |\n Where-Object { $_.DisplayName -like $softwareNameLike } |\n Select-Object -First 1\nif (-not $selected -or -not $selected.UninstallString) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 1\n}\n\n$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }\n\n# Parse exe + args (quoted / unquoted / bare).\nif ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} else {\n $exe = $raw; $exeArgs = \"\"\n}\n\n# NSIS uninstallers require /S for a silent uninstall.\nif ($exeArgs -notmatch '(?i)(^|\\s)/S(\\s|$)') { $exeArgs = \"$exeArgs /S\".Trim() }\n\nWrite-Host \"Uninstall command: $exe\"\nWrite-Host \"Uninstall args: $exeArgs\"\n$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n"
}
}
@@ -0,0 +1,22 @@
{
"versions": [
{
"version": "15.1.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Graphviz' AND publisher = 'Graphviz';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Graphviz' AND publisher = 'Graphviz' AND version_compare(version, '15.1.0') < 0);"
},
"installer_url": "https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/15.1.0/windows_10_cmake_Release_graphviz-install-15.1.0-win64.exe",
"install_script_ref": "8456d4ce",
"uninstall_script_ref": "f6831952",
"sha256": "45f20128e6b86e54eb3c2f0ac94d4232d33b9c8a7a81ac171c3d393b8d19bcdc",
"default_categories": [
"Developer tools"
]
}
],
"refs": {
"8456d4ce": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# Graphviz is a Nullsoft (NSIS) installer declaring machine scope; /S runs it\n# silently and installs machine-wide to Program Files.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$process = Start-Process -FilePath \"$exeFilePath\" -ArgumentList \"/S\" -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Install exit code: $exitCode\"\n\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"f6831952": "# Uninstalls Graphviz. Locates the NSIS uninstaller from the registry by\n# DisplayName and runs it silently with /S.\n\n$softwareNameLike = \"Graphviz*\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\n$exitCode = $null\n\ntry {\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys |\n Where-Object { $_.DisplayName -like $softwareNameLike } |\n Select-Object -First 1\nif (-not $selected -or -not $selected.UninstallString) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 1\n}\n\n$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }\n\n# Parse exe + args (quoted / unquoted / bare).\nif ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} else {\n $exe = $raw; $exeArgs = \"\"\n}\n\n# NSIS uninstallers require /S for a silent uninstall.\nif ($exeArgs -notmatch '(?i)(^|\\s)/S(\\s|$)') { $exeArgs = \"$exeArgs /S\".Trim() }\n\nWrite-Host \"Uninstall command: $exe\"\nWrite-Host \"Uninstall args: $exeArgs\"\n$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n"
}
}
@@ -0,0 +1,23 @@
{
"versions": [
{
"version": "2.1.1434",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'grepWin' AND publisher = 'Stefans Tools';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'grepWin' AND publisher = 'Stefans Tools' AND version_compare(version, '2.1.1434') < 0);"
},
"installer_url": "https://github.com/stefankueng/grepWin/releases/download/2.1.12/grepWin-2.1.12-x64.msi",
"install_script_ref": "8959087b",
"uninstall_script_ref": "249e28e5",
"sha256": "e70cbcc64c966d333940779bf4c5a041bfd9d093a47bb48b48933033ee76fdfc",
"default_categories": [
"Developer tools"
],
"upgrade_code": "{C73ED533-953E-47E5-9A42-A48292BB7C6C}"
}
],
"refs": {
"249e28e5": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{C73ED533-953E-47E5-9A42-A48292BB7C6C}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n\n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n\n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n\n # If the uninstall failed, bail\n if ($successCodes -notcontains $process.ExitCode) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n",
"8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -412,6 +412,10 @@ import Freefilesync from "./Freefilesync";
import Front from "./Front";
import Fsmonitor from "./Fsmonitor";
import Funter from "./Funter";
import GadwinPrintscreen from "./GadwinPrintscreen";
import GadwinPrintscreenPro from "./GadwinPrintscreenPro";
import GalaxyModeler from "./GalaxyModeler";
import GarminBasecamp from "./GarminBasecamp";
import GarminExpress from "./GarminExpress";
import Gather from "./Gather";
import Gdevelop from "./Gdevelop";
@@ -419,6 +423,7 @@ import Geany from "./Geany";
import Geekbench from "./Geekbench";
import Gemini2 from "./Gemini2";
import GenesysCloud from "./GenesysCloud";
import GeogebraClassic from "./GeogebraClassic";
import Gephi from "./Gephi";
import Ghostty from "./Ghostty";
import Gimp from "./Gimp";
@@ -430,22 +435,29 @@ import Gitify from "./Gitify";
import GitKraken from "./GitKraken";
import GitupApp from "./GitupApp";
import Glyphs from "./Glyphs";
import Go from "./Go";
import Go2Shell from "./Go2Shell";
import GoanywhereOpenpgpStudio from "./GoanywhereOpenpgpStudio";
import Godot from "./Godot";
import Godspeed from "./Godspeed";
import GogGalaxy from "./GogGalaxy";
import GoLand from "./GoLand";
import GoldendictNg from "./GoldendictNg";
import Goodsync from "./Goodsync";
import GoogleAdsEditor from "./GoogleAdsEditor";
import GoogleCredentialProviderForWindows from "./GoogleCredentialProviderForWindows";
import GoogleDrive from "./GoogleDrive";
import GoogleEarthPro from "./GoogleEarthPro";
import GoogleGemini from "./GoogleGemini";
import GoogleWebDesigner from "./GoogleWebDesigner";
import GoToMeeting from "./GoToMeeting";
import GpgKeychain from "./GpgKeychain";
import Gpodder from "./Gpodder";
import GrammarlyDesktop from "./GrammarlyDesktop";
import Grandperspective from "./Grandperspective";
import Granola from "./Granola";
import Graphviz from "./Graphviz";
import Grepwin from "./Grepwin";
import Grids from "./Grids";
import GrooveOmniDialer from "./GrooveOmniDialer";
import Gyazo from "./Gyazo";
@@ -1518,6 +1530,10 @@ export const SOFTWARE_NAME_TO_ICON_MAP = {
front: Front,
fsmonitor: Fsmonitor,
funter: Funter,
"gadwin printscreen": GadwinPrintscreen,
"gadwin printscreen pro": GadwinPrintscreenPro,
"galaxy modeler": GalaxyModeler,
"garmin basecamp": GarminBasecamp,
"garmin express": GarminExpress,
"gather town": Gather,
gdevelop: Gdevelop,
@@ -1526,6 +1542,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = {
gemini: GoogleGemini,
"gemini 2": Gemini2,
"genesys cloud": GenesysCloud,
"geogebra classic": GeogebraClassic,
gephi: Gephi,
ghostty: Ghostty,
gimp: Gimp,
@@ -1537,12 +1554,16 @@ export const SOFTWARE_NAME_TO_ICON_MAP = {
gitkraken: GitKraken,
gitup: GitupApp,
glyphs: Glyphs,
go: Go,
go2shell: Go2Shell,
"goanywhere openpgp studio": GoanywhereOpenpgpStudio,
"godot engine": Godot,
godspeed: Godspeed,
"gog galaxy": GogGalaxy,
goland: GoLand,
"goldendict-ng": GoldendictNg,
goodsync: Goodsync,
"google ads editor": GoogleAdsEditor,
"google antigravity": Antigravity,
"google antigravity ide": AntigravityIde,
"google chrome": ChromeApp,
@@ -1550,6 +1571,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = {
"google drive": GoogleDrive,
"google earth pro": GoogleEarthPro,
"google gemini": GoogleGemini,
"google web designer": GoogleWebDesigner,
gotomeeting: GoToMeeting,
"gpg keychain": GpgKeychain,
"gpg suite": GpgKeychain,
@@ -1558,6 +1580,8 @@ export const SOFTWARE_NAME_TO_ICON_MAP = {
grandperspective: Grandperspective,
granola: Granola,
"graphpad prism": Prism,
graphviz: Graphviz,
grepwin: Grepwin,
grids: Grids,
"groove omnidialer": GrooveOmniDialer,
hammerspoon: Hammerspoon,
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB