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 -->
@@ -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"
|
||||
}
|
||||
@@ -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
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 8.7 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 6.3 KiB |
|
After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 6.7 KiB |