Add Windows FMAs (letter F): 5 apps (#49218)
**Related issue:** N/A — part of the Windows Fleet-maintained apps catalog expansion (letter F batch; follows #48872, #48881, #48950, #48969, #49086, #49186). Adds eight new Windows Fleet-maintained apps: | App | winget package | Installer | Notes | |-----|----------------|-----------|-------| | Foxit PDF Editor | `Foxit.PhantomPDF` | WiX bootstrapper EXE, machine, x64 | Covers both "Foxit PDF Editor" and "…Pro" from the inventory (one package). Runs an updater service → process-stopping uninstall. ARP key lives in the WOW6432Node hive. | | Foxit PDF Reader | `Foxit.FoxitReader` | WiX bootstrapper EXE, machine, x64 | Distinct DisplayName from the Editor (verified via msiinfo). Updater service → process-stopping uninstall. | | FreeCAD | `FreeCAD.FreeCAD` | NSIS (MultiUser), machine, x64 | `/AllUsers /S`; versioned ARP name ("FreeCAD 1.1.1") → `FreeCAD%` fuzzy. | | FastPictureViewer Professional | `AxelRietschin.FastPictureViewer.Professional` | MSI, machine, x64 | Versioned ARP name → fuzzy. Unversioned URL → `ignore_hash`. Declares VCRedist deps (near-ubiquitous; noted). | | FastStone Capture | `FastStone.Capture` | NSIS, machine, x86 | `/S`; versioned ARP name → fuzzy. Paid trialware, but silent install/detect/uninstall are clean. | | FastStone Image Viewer | `FastStone.Viewer` | NSIS, machine, x86 | `/S`; versioned ARP name → fuzzy. | | FlexWhere for Desktop | `Dutchview.Flexwhere` | MSI, machine, x64 | Auto-start tray app → process-stopping uninstall (stop process, then msiexec /x via UpgradeCode). | | Fortify | `PeculiarVentures.Fortify` | WiX MSI, machine, x64 (en-US) | Smart-card/cert bridge; auto-start tray → process-stopping uninstall. Per-arch+locale ProductCode, so `installer_locale: en-US`. | Considered but **not** added (recorded in the workstream tracker): - **FactSet Workstation** (`FactSet.FactSetWorkstation`): MSI defaults to per-user (ALLUSERS=2 + MSIINSTALLPERUSER=1) with no machine-scope override, AND a `SpawnFDSWorkstation` custom action launches the app at install (headless-hang risk in a SYSTEM session). Niche licensed terminal. - **Filius** (`StefanFreischlad.Filius`): winget manifest is de-DE only (no en-US locale); the ingester hard-codes the en-US locale fetch (same limitation that deferred Araxis Merge). - **FlashFXP** (`OpenSight.FlashFXP`): abandoned (frozen at 2017), the vendor site returns HTTP 500, only a 16×16 icon is available, and its InstallAware uninstall needs a fragile cached-setup `/s` injection. - **Front** (`FrontApp.Front`): per-user-only electron-builder installer (`Front-user-*.exe` → `%LocalAppData%`, HKCU); no machine/all-users artifact in winget. - **Autodesk Fusion** (`Autodesk.Fusion`): the winget "installer" is `Fusion Client Downloader.exe`, a per-user streaming/web bootstrapper that downloads at runtime, hangs headless, and needs interactive Autodesk sign-in. Identities verified per app (msiinfo Property tables; NSIS header decompilation; winget AppsAndFeaturesEntries; uninstall-database corroboration). Apps that run a service or auto-start tray (both Foxit products, FlexWhere, Fortify) get process-stopping uninstalls up front to avoid the MSI-rollback failure class. SHAs verified against manifests for pinned URLs; `ignore_hash` only for FastPictureViewer's actively-maintained latest-pointer URL. Icons via `tools/software/icons/generate-icons.sh` (all ≥256px except FastPictureViewer/Fortify at 256/180). # Checklist for submitter - [x] Input data is properly validated, `SELECT *` is avoided, SQL injection is prevented (using placeholders for values in statements), JS inline code is prevented especially for url redirects, and untrusted data interpolated into shell scripts/commands is validated against shell metacharacters. - [x] Timeouts are implemented and retries are limited to avoid infinite loops ## Testing - [ ] QA'd all new/changed functionality manually (relying on the FMA CI validator for Windows install/uninstall validation)
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "FlexWhere for Desktop",
|
||||
"slug": "flexwhere/windows",
|
||||
"package_identifier": "Dutchview.Flexwhere",
|
||||
"unique_identifier": "Flexwhere for Desktop",
|
||||
"installer_arch": "x64",
|
||||
"installer_type": "msi",
|
||||
"installer_scope": "machine",
|
||||
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/flexwhere_uninstall.ps1",
|
||||
"default_categories": ["Productivity"]
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "Fortify",
|
||||
"slug": "fortify/windows",
|
||||
"package_identifier": "PeculiarVentures.Fortify",
|
||||
"unique_identifier": "Fortify",
|
||||
"installer_arch": "x64",
|
||||
"installer_type": "msi",
|
||||
"installer_scope": "machine",
|
||||
"installer_locale": "en-US",
|
||||
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/fortify_uninstall.ps1",
|
||||
"default_categories": ["Security"]
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "Foxit PDF Editor",
|
||||
"slug": "foxit-pdf-editor/windows",
|
||||
"package_identifier": "Foxit.PhantomPDF",
|
||||
"unique_identifier": "Foxit PDF Editor",
|
||||
"installer_arch": "x64",
|
||||
"installer_type": "exe",
|
||||
"installer_scope": "machine",
|
||||
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/foxit-pdf-editor_install.ps1",
|
||||
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/foxit-pdf-editor_uninstall.ps1",
|
||||
"default_categories": ["Productivity"]
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "Foxit PDF Reader",
|
||||
"slug": "foxit-pdf-reader/windows",
|
||||
"package_identifier": "Foxit.FoxitReader",
|
||||
"unique_identifier": "Foxit PDF Reader",
|
||||
"installer_arch": "x64",
|
||||
"installer_type": "exe",
|
||||
"installer_scope": "machine",
|
||||
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/foxit-pdf-reader_install.ps1",
|
||||
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/foxit-pdf-reader_uninstall.ps1",
|
||||
"default_categories": ["Productivity"]
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "FreeCAD",
|
||||
"slug": "freecad/windows",
|
||||
"package_identifier": "FreeCAD.FreeCAD",
|
||||
"unique_identifier": "FreeCAD",
|
||||
"fuzzy_match_name": "FreeCAD%",
|
||||
"installer_arch": "x64",
|
||||
"installer_type": "exe",
|
||||
"installer_scope": "machine",
|
||||
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/freecad_install.ps1",
|
||||
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/freecad_uninstall.ps1",
|
||||
"default_categories": ["Productivity"]
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
# Uninstalls Flexwhere for Desktop.
|
||||
#
|
||||
# Flexwhere for Desktop auto-starts a tray process (no Windows service), which can hold files
|
||||
# and make msiexec roll back the uninstall. Stop anything running from the
|
||||
# install dir (plus known process names) FIRST, then resolve the ProductCode(s)
|
||||
# via the stable UpgradeCode and msiexec /x each.
|
||||
|
||||
$upgradeCode = '{5916547D-CBFA-451B-AF68-D475E2DA9022}'
|
||||
$softwareName = 'Flexwhere for Desktop'
|
||||
$successCodes = @(0, 3010, 1641)
|
||||
|
||||
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
|
||||
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
|
||||
|
||||
try {
|
||||
|
||||
# Stop the app's processes so the MSI uninstall isn't rolled back by locked files.
|
||||
$entry = Get-ChildItem -Path @($machineKey, $machineKey32on64) -ErrorAction SilentlyContinue |
|
||||
ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } |
|
||||
Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1
|
||||
if ($entry -and $entry.InstallLocation -and (Test-Path -LiteralPath $entry.InstallLocation)) {
|
||||
$loc = $entry.InstallLocation.TrimEnd('\')
|
||||
Get-Process | Where-Object { $_.Path -and $_.Path -like "$loc\*" } |
|
||||
ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue }
|
||||
}
|
||||
foreach ($p in @("Flexwhere for Desktop")) {
|
||||
Stop-Process -Name $p -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
Start-Sleep -Seconds 3
|
||||
|
||||
# Resolve ProductCode(s) from the stable UpgradeCode and uninstall each.
|
||||
$inst = New-Object -ComObject "WindowsInstaller.Installer"
|
||||
$productCodes = @($inst.RelatedProducts($upgradeCode))
|
||||
if ($productCodes.Count -eq 0) {
|
||||
Write-Host "No products found for upgrade code $upgradeCode"
|
||||
Exit 1
|
||||
}
|
||||
|
||||
foreach ($productCode in $productCodes) {
|
||||
Write-Host "Uninstalling product code: $productCode"
|
||||
$process = Start-Process msiexec.exe `
|
||||
-ArgumentList "/x $productCode /quiet /norestart" `
|
||||
-NoNewWindow -PassThru -Wait
|
||||
Write-Host "Uninstall exit code: $($process.ExitCode)"
|
||||
if ($successCodes -notcontains $process.ExitCode) { Exit $process.ExitCode }
|
||||
}
|
||||
|
||||
Exit 0
|
||||
|
||||
} catch {
|
||||
Write-Host "Error: $_"
|
||||
Exit 1
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
# Uninstalls Fortify.
|
||||
#
|
||||
# Fortify auto-starts a tray process (no Windows service), which can hold files
|
||||
# and make msiexec roll back the uninstall. Stop anything running from the
|
||||
# install dir (plus known process names) FIRST, then resolve the ProductCode(s)
|
||||
# via the stable UpgradeCode and msiexec /x each.
|
||||
|
||||
$upgradeCode = '{AB87B5E7-17F6-5394-8A15-9EE6AA6B06B8}'
|
||||
$softwareName = 'Fortify'
|
||||
$successCodes = @(0, 3010, 1641)
|
||||
|
||||
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
|
||||
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
|
||||
|
||||
try {
|
||||
|
||||
# Stop the app's processes so the MSI uninstall isn't rolled back by locked files.
|
||||
$entry = Get-ChildItem -Path @($machineKey, $machineKey32on64) -ErrorAction SilentlyContinue |
|
||||
ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } |
|
||||
Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1
|
||||
if ($entry -and $entry.InstallLocation -and (Test-Path -LiteralPath $entry.InstallLocation)) {
|
||||
$loc = $entry.InstallLocation.TrimEnd('\')
|
||||
Get-Process | Where-Object { $_.Path -and $_.Path -like "$loc\*" } |
|
||||
ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue }
|
||||
}
|
||||
foreach ($p in @("Fortify")) {
|
||||
Stop-Process -Name $p -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
Start-Sleep -Seconds 3
|
||||
|
||||
# Resolve ProductCode(s) from the stable UpgradeCode and uninstall each.
|
||||
$inst = New-Object -ComObject "WindowsInstaller.Installer"
|
||||
$productCodes = @($inst.RelatedProducts($upgradeCode))
|
||||
if ($productCodes.Count -eq 0) {
|
||||
Write-Host "No products found for upgrade code $upgradeCode"
|
||||
Exit 1
|
||||
}
|
||||
|
||||
foreach ($productCode in $productCodes) {
|
||||
Write-Host "Uninstalling product code: $productCode"
|
||||
$process = Start-Process msiexec.exe `
|
||||
-ArgumentList "/x $productCode /quiet /norestart" `
|
||||
-NoNewWindow -PassThru -Wait
|
||||
Write-Host "Uninstall exit code: $($process.ExitCode)"
|
||||
if ($successCodes -notcontains $process.ExitCode) { Exit $process.ExitCode }
|
||||
}
|
||||
|
||||
Exit 0
|
||||
|
||||
} catch {
|
||||
Write-Host "Error: $_"
|
||||
Exit 1
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
# Learn more about .exe install scripts:
|
||||
# http://fleetdm.com/learn-more-about/exe-install-scripts
|
||||
#
|
||||
# Foxit PDF Editor ships as a Foxit WiX MultiLangBootstrapper EXE. /quiet /norestart
|
||||
# performs a silent per-machine install.
|
||||
|
||||
$exeFilePath = "${env:INSTALLER_PATH}"
|
||||
|
||||
try {
|
||||
if (-not (Test-Path $exeFilePath)) {
|
||||
Write-Host "Error: Installer file not found at: $exeFilePath"
|
||||
Exit 1
|
||||
}
|
||||
|
||||
$processOptions = @{
|
||||
FilePath = "$exeFilePath"
|
||||
ArgumentList = "/quiet"
|
||||
PassThru = $true
|
||||
Wait = $true
|
||||
NoNewWindow = $true
|
||||
}
|
||||
|
||||
$process = Start-Process @processOptions
|
||||
$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,64 @@
|
||||
# Uninstalls Foxit PDF Editor.
|
||||
#
|
||||
# Foxit PDF Editor is a Foxit WiX MultiLangBootstrapper install that runs an auto-updater
|
||||
# service; its visible ARP entry is the inner MSI (its UninstallString uses
|
||||
# "MsiExec.exe /I{ProductCode}", the maintenance/repair form). We stop the
|
||||
# Foxit services/processes first so files aren't locked, then resolve the
|
||||
# ProductCode GUID and run a clean "msiexec /x {ProductCode} /qn /norestart"
|
||||
# (never reuse the /I from the registry string). The ARP entry lives in the
|
||||
# WOW6432Node (32-bit) hive even on x64.
|
||||
|
||||
$softwareName = "Foxit PDF Editor"
|
||||
|
||||
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
|
||||
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
|
||||
$successCodes = @(0, 3010, 1641)
|
||||
$exitCode = $null
|
||||
|
||||
try {
|
||||
|
||||
foreach ($svc in @("FoxitPhantomPDFUpdateService")) {
|
||||
Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
foreach ($p in @("FoxitPDFEditor", "FoxitPhantomPDF", "FoxitUpdater")) {
|
||||
Stop-Process -Name $p -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
Start-Sleep -Seconds 3
|
||||
|
||||
[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: prefer the ARP key name (it is the MSI ProductCode), else pull
|
||||
# the first GUID out of the UninstallString. Never carry over its /I switch.
|
||||
$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,34 @@
|
||||
# Learn more about .exe install scripts:
|
||||
# http://fleetdm.com/learn-more-about/exe-install-scripts
|
||||
#
|
||||
# Foxit PDF Reader ships as a Foxit WiX MultiLangBootstrapper EXE. /quiet /norestart
|
||||
# performs a silent per-machine install.
|
||||
|
||||
$exeFilePath = "${env:INSTALLER_PATH}"
|
||||
|
||||
try {
|
||||
if (-not (Test-Path $exeFilePath)) {
|
||||
Write-Host "Error: Installer file not found at: $exeFilePath"
|
||||
Exit 1
|
||||
}
|
||||
|
||||
$processOptions = @{
|
||||
FilePath = "$exeFilePath"
|
||||
ArgumentList = "/quiet"
|
||||
PassThru = $true
|
||||
Wait = $true
|
||||
NoNewWindow = $true
|
||||
}
|
||||
|
||||
$process = Start-Process @processOptions
|
||||
$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,64 @@
|
||||
# Uninstalls Foxit PDF Reader.
|
||||
#
|
||||
# Foxit PDF Reader is a Foxit WiX MultiLangBootstrapper install that runs an auto-updater
|
||||
# service; its visible ARP entry is the inner MSI (its UninstallString uses
|
||||
# "MsiExec.exe /I{ProductCode}", the maintenance/repair form). We stop the
|
||||
# Foxit services/processes first so files aren't locked, then resolve the
|
||||
# ProductCode GUID and run a clean "msiexec /x {ProductCode} /qn /norestart"
|
||||
# (never reuse the /I from the registry string). The ARP entry lives in the
|
||||
# WOW6432Node (32-bit) hive even on x64.
|
||||
|
||||
$softwareName = "Foxit PDF Reader"
|
||||
|
||||
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
|
||||
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
|
||||
$successCodes = @(0, 3010, 1641)
|
||||
$exitCode = $null
|
||||
|
||||
try {
|
||||
|
||||
foreach ($svc in @("FoxitPDFReaderUpdateService")) {
|
||||
Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
foreach ($p in @("FoxitPDFReader", "FoxitReader", "FoxitUpdater")) {
|
||||
Stop-Process -Name $p -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
Start-Sleep -Seconds 3
|
||||
|
||||
[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: prefer the ARP key name (it is the MSI ProductCode), else pull
|
||||
# the first GUID out of the UninstallString. Never carry over its /I switch.
|
||||
$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,27 @@
|
||||
# Learn more about .exe install scripts:
|
||||
# http://fleetdm.com/learn-more-about/exe-install-scripts
|
||||
#
|
||||
# FreeCAD ships as a MultiUser NSIS installer. /S runs it silently and
|
||||
# /AllUsers forces the machine-wide install (HKLM + C:\Program Files).
|
||||
|
||||
$exeFilePath = "${env:INSTALLER_PATH}"
|
||||
|
||||
try {
|
||||
|
||||
$processOptions = @{
|
||||
FilePath = "$exeFilePath"
|
||||
ArgumentList = "/AllUsers /S"
|
||||
PassThru = $true
|
||||
Wait = $true
|
||||
}
|
||||
|
||||
$process = Start-Process @processOptions
|
||||
$exitCode = $process.ExitCode
|
||||
|
||||
Write-Host "Install exit code: $exitCode"
|
||||
Exit $exitCode
|
||||
|
||||
} catch {
|
||||
Write-Host "Error: $_"
|
||||
Exit 1
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
# Uninstalls FreeCAD.
|
||||
#
|
||||
# FreeCAD (MultiUser NSIS) registers a versioned DisplayName ("FreeCAD 1.1.1")
|
||||
# under HKLM when installed with /AllUsers, so match on the "FreeCAD" prefix.
|
||||
# Its QuietUninstallString runs "Uninstall-FreeCAD.exe" /S (real silent, no
|
||||
# service to block removal).
|
||||
|
||||
$softwareNameLike = "FreeCAD*"
|
||||
$publisherLike = "FreeCAD*"
|
||||
|
||||
$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 -and $_.Publisher -like $publisherLike } |
|
||||
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
|
||||
@@ -3312,6 +3312,13 @@
|
||||
"unique_identifier": "net.flexoptix.flexoptix.app",
|
||||
"description": "FLEXOPTIX App is a connect to your FLEXBOX without cables and configure transceivers."
|
||||
},
|
||||
{
|
||||
"name": "FlexWhere for Desktop",
|
||||
"slug": "flexwhere/windows",
|
||||
"platform": "windows",
|
||||
"unique_identifier": "Flexwhere for Desktop",
|
||||
"description": "FlexWhere for Desktop shows real-time workplace and colleague availability from FlexWhere."
|
||||
},
|
||||
{
|
||||
"name": "Fluid",
|
||||
"slug": "fluid/darwin",
|
||||
@@ -3382,6 +3389,27 @@
|
||||
"unique_identifier": "com.binarynights.ForkLift-4",
|
||||
"description": "ForkLift is a finder replacement and FTP, SFTP, WebDAV and Amazon s3 client."
|
||||
},
|
||||
{
|
||||
"name": "Fortify",
|
||||
"slug": "fortify/windows",
|
||||
"platform": "windows",
|
||||
"unique_identifier": "Fortify",
|
||||
"description": "Fortify enables cross-browser use of local certificates and smart cards."
|
||||
},
|
||||
{
|
||||
"name": "Foxit PDF Editor",
|
||||
"slug": "foxit-pdf-editor/windows",
|
||||
"platform": "windows",
|
||||
"unique_identifier": "Foxit PDF Editor",
|
||||
"description": "Foxit PDF Editor is a desktop application for creating and editing PDF documents."
|
||||
},
|
||||
{
|
||||
"name": "Foxit PDF Reader",
|
||||
"slug": "foxit-pdf-reader/windows",
|
||||
"platform": "windows",
|
||||
"unique_identifier": "Foxit PDF Reader",
|
||||
"description": "Foxit PDF Reader is a desktop application for viewing and annotating PDF documents."
|
||||
},
|
||||
{
|
||||
"name": "Framer",
|
||||
"slug": "framer/darwin",
|
||||
@@ -3410,6 +3438,13 @@
|
||||
"unique_identifier": "org.freedownloadmanager.fdm6",
|
||||
"description": "Free Download Manager is a download accelerator and organizer."
|
||||
},
|
||||
{
|
||||
"name": "FreeCAD",
|
||||
"slug": "freecad/windows",
|
||||
"platform": "windows",
|
||||
"unique_identifier": "FreeCAD",
|
||||
"description": "FreeCAD is a general-purpose, open-source parametric 3D CAD modeler."
|
||||
},
|
||||
{
|
||||
"name": "FreeFileSync",
|
||||
"slug": "freefilesync/darwin",
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"versions": [
|
||||
{
|
||||
"version": "3.5",
|
||||
"queries": {
|
||||
"exists": "SELECT 1 FROM programs WHERE name = 'Flexwhere for Desktop' AND publisher = 'Dutchview';",
|
||||
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Flexwhere for Desktop' AND publisher = 'Dutchview' AND version_compare(version, '3.5') < 0);"
|
||||
},
|
||||
"installer_url": "https://s3.eu-central-1.amazonaws.com/releases.flexwhere.net/Flexwhere+for+Desktop+3.5.msi",
|
||||
"install_script_ref": "8959087b",
|
||||
"uninstall_script_ref": "a679a246",
|
||||
"sha256": "50786b5d742a5f90ede3790e8a47153eaf3137cf1c6b3dc9e786ba3363d0ef70",
|
||||
"default_categories": [
|
||||
"Productivity"
|
||||
],
|
||||
"upgrade_code": "{5916547D-CBFA-451B-AF68-D475E2DA9022}"
|
||||
}
|
||||
],
|
||||
"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",
|
||||
"a679a246": "# Uninstalls Flexwhere for Desktop.\n#\n# Flexwhere for Desktop auto-starts a tray process (no Windows service), which can hold files\n# and make msiexec roll back the uninstall. Stop anything running from the\n# install dir (plus known process names) FIRST, then resolve the ProductCode(s)\n# via the stable UpgradeCode and msiexec /x each.\n\n$upgradeCode = '{5916547D-CBFA-451B-AF68-D475E2DA9022}'\n$softwareName = 'Flexwhere for Desktop'\n$successCodes = @(0, 3010, 1641)\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\ntry {\n\n# Stop the app's processes so the MSI uninstall isn't rolled back by locked files.\n$entry = Get-ChildItem -Path @($machineKey, $machineKey32on64) -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } |\n Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1\nif ($entry -and $entry.InstallLocation -and (Test-Path -LiteralPath $entry.InstallLocation)) {\n $loc = $entry.InstallLocation.TrimEnd('\\')\n Get-Process | Where-Object { $_.Path -and $_.Path -like \"$loc\\*\" } |\n ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue }\n}\nforeach ($p in @(\"Flexwhere for Desktop\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 3\n\n# Resolve ProductCode(s) from the stable UpgradeCode and uninstall each.\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$productCodes = @($inst.RelatedProducts($upgradeCode))\nif ($productCodes.Count -eq 0) {\n Write-Host \"No products found for upgrade code $upgradeCode\"\n Exit 1\n}\n\nforeach ($productCode in $productCodes) {\n Write-Host \"Uninstalling product code: $productCode\"\n $process = Start-Process msiexec.exe `\n -ArgumentList \"/x $productCode /quiet /norestart\" `\n -NoNewWindow -PassThru -Wait\n Write-Host \"Uninstall exit code: $($process.ExitCode)\"\n if ($successCodes -notcontains $process.ExitCode) { Exit $process.ExitCode }\n}\n\nExit 0\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"versions": [
|
||||
{
|
||||
"version": "2.1.0",
|
||||
"queries": {
|
||||
"exists": "SELECT 1 FROM programs WHERE name = 'Fortify' AND publisher = 'Peculiar Ventures';",
|
||||
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Fortify' AND publisher = 'Peculiar Ventures' AND version_compare(version, '2.1.0') < 0);"
|
||||
},
|
||||
"installer_url": "https://github.com/PeculiarVentures/fortify-releases/releases/download/v2.1.0/Fortify_2.1.0_x64_en-US.msi",
|
||||
"install_script_ref": "8959087b",
|
||||
"uninstall_script_ref": "132b8cb2",
|
||||
"sha256": "57daec289ba8298d591427014e8ef3339d019907a207282ba61393fd271df04d",
|
||||
"default_categories": [
|
||||
"Security"
|
||||
],
|
||||
"upgrade_code": "{AB87B5E7-17F6-5394-8A15-9EE6AA6B06B8}"
|
||||
}
|
||||
],
|
||||
"refs": {
|
||||
"132b8cb2": "# Uninstalls Fortify.\n#\n# Fortify auto-starts a tray process (no Windows service), which can hold files\n# and make msiexec roll back the uninstall. Stop anything running from the\n# install dir (plus known process names) FIRST, then resolve the ProductCode(s)\n# via the stable UpgradeCode and msiexec /x each.\n\n$upgradeCode = '{AB87B5E7-17F6-5394-8A15-9EE6AA6B06B8}'\n$softwareName = 'Fortify'\n$successCodes = @(0, 3010, 1641)\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\ntry {\n\n# Stop the app's processes so the MSI uninstall isn't rolled back by locked files.\n$entry = Get-ChildItem -Path @($machineKey, $machineKey32on64) -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } |\n Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1\nif ($entry -and $entry.InstallLocation -and (Test-Path -LiteralPath $entry.InstallLocation)) {\n $loc = $entry.InstallLocation.TrimEnd('\\')\n Get-Process | Where-Object { $_.Path -and $_.Path -like \"$loc\\*\" } |\n ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue }\n}\nforeach ($p in @(\"Fortify\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 3\n\n# Resolve ProductCode(s) from the stable UpgradeCode and uninstall each.\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$productCodes = @($inst.RelatedProducts($upgradeCode))\nif ($productCodes.Count -eq 0) {\n Write-Host \"No products found for upgrade code $upgradeCode\"\n Exit 1\n}\n\nforeach ($productCode in $productCodes) {\n Write-Host \"Uninstalling product code: $productCode\"\n $process = Start-Process msiexec.exe `\n -ArgumentList \"/x $productCode /quiet /norestart\" `\n -NoNewWindow -PassThru -Wait\n Write-Host \"Uninstall exit code: $($process.ExitCode)\"\n if ($successCodes -notcontains $process.ExitCode) { Exit $process.ExitCode }\n}\n\nExit 0\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\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": "14.0.5.33580",
|
||||
"queries": {
|
||||
"exists": "SELECT 1 FROM programs WHERE name = 'Foxit PDF Editor' AND publisher = 'Foxit Software Inc.';",
|
||||
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Foxit PDF Editor' AND publisher = 'Foxit Software Inc.' AND version_compare(version, '14.0.5.33580') < 0);"
|
||||
},
|
||||
"installer_url": "https://cdn01.foxitsoftware.com/product/phantomPDF/desktop/win/14.0.5/FoxitPDFEditor1405_L10N_Setup_x64.exe",
|
||||
"install_script_ref": "a6208245",
|
||||
"uninstall_script_ref": "5d55608a",
|
||||
"sha256": "764aa7ca2679c568539ada4dfa4b1f7de91f9c006fdb8fb98489dea0bce354f7",
|
||||
"default_categories": [
|
||||
"Productivity"
|
||||
]
|
||||
}
|
||||
],
|
||||
"refs": {
|
||||
"5d55608a": "# Uninstalls Foxit PDF Editor.\n#\n# Foxit PDF Editor is a Foxit WiX MultiLangBootstrapper install that runs an auto-updater\n# service; its visible ARP entry is the inner MSI (its UninstallString uses\n# \"MsiExec.exe /I{ProductCode}\", the maintenance/repair form). We stop the\n# Foxit services/processes first so files aren't locked, then resolve the\n# ProductCode GUID and run a clean \"msiexec /x {ProductCode} /qn /norestart\"\n# (never reuse the /I from the registry string). The ARP entry lives in the\n# WOW6432Node (32-bit) hive even on x64.\n\n$softwareName = \"Foxit PDF Editor\"\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\nforeach ($svc in @(\"FoxitPhantomPDFUpdateService\")) {\n Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue\n}\nforeach ($p in @(\"FoxitPDFEditor\", \"FoxitPhantomPDF\", \"FoxitUpdater\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 3\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: prefer the ARP key name (it is the MSI ProductCode), else pull\n# the first GUID out of the UninstallString. Never carry over its /I switch.\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\" `\n -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",
|
||||
"a6208245": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# Foxit PDF Editor ships as a Foxit WiX MultiLangBootstrapper EXE. /quiet /norestart\n# performs a silent per-machine install.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n if (-not (Test-Path $exeFilePath)) {\n Write-Host \"Error: Installer file not found at: $exeFilePath\"\n Exit 1\n }\n\n $processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/quiet\"\n PassThru = $true\n Wait = $true\n NoNewWindow = $true\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n Write-Host \"Install exit code: $exitCode\"\n\n # 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\n if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\n Exit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"versions": [
|
||||
{
|
||||
"version": "2026.1.2.36540",
|
||||
"queries": {
|
||||
"exists": "SELECT 1 FROM programs WHERE name = 'Foxit PDF Reader' AND publisher = 'Foxit Software Inc.';",
|
||||
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Foxit PDF Reader' AND publisher = 'Foxit Software Inc.' AND version_compare(version, '2026.1.2.36540') < 0);"
|
||||
},
|
||||
"installer_url": "https://cdn01.foxitsoftware.com/product/reader/desktop/win/2026.1.2/FoxitPDFReader202612_L10N_Setup_x64.exe",
|
||||
"install_script_ref": "4ce619b8",
|
||||
"uninstall_script_ref": "8dbc0197",
|
||||
"sha256": "74bb18acd4970f2596d63a05a83421e256d272c37c12216de69984e3244c6485",
|
||||
"default_categories": [
|
||||
"Productivity"
|
||||
]
|
||||
}
|
||||
],
|
||||
"refs": {
|
||||
"4ce619b8": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# Foxit PDF Reader ships as a Foxit WiX MultiLangBootstrapper EXE. /quiet /norestart\n# performs a silent per-machine install.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n if (-not (Test-Path $exeFilePath)) {\n Write-Host \"Error: Installer file not found at: $exeFilePath\"\n Exit 1\n }\n\n $processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/quiet\"\n PassThru = $true\n Wait = $true\n NoNewWindow = $true\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n Write-Host \"Install exit code: $exitCode\"\n\n # 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\n if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\n Exit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
|
||||
"8dbc0197": "# Uninstalls Foxit PDF Reader.\n#\n# Foxit PDF Reader is a Foxit WiX MultiLangBootstrapper install that runs an auto-updater\n# service; its visible ARP entry is the inner MSI (its UninstallString uses\n# \"MsiExec.exe /I{ProductCode}\", the maintenance/repair form). We stop the\n# Foxit services/processes first so files aren't locked, then resolve the\n# ProductCode GUID and run a clean \"msiexec /x {ProductCode} /qn /norestart\"\n# (never reuse the /I from the registry string). The ARP entry lives in the\n# WOW6432Node (32-bit) hive even on x64.\n\n$softwareName = \"Foxit PDF Reader\"\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\nforeach ($svc in @(\"FoxitPDFReaderUpdateService\")) {\n Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue\n}\nforeach ($p in @(\"FoxitPDFReader\", \"FoxitReader\", \"FoxitUpdater\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 3\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: prefer the ARP key name (it is the MSI ProductCode), else pull\n# the first GUID out of the UninstallString. Never carry over its /I switch.\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\" `\n -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"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"versions": [
|
||||
{
|
||||
"version": "1.1.1",
|
||||
"queries": {
|
||||
"exists": "SELECT 1 FROM programs WHERE name LIKE 'FreeCAD%' AND publisher = 'FreeCAD Team';",
|
||||
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'FreeCAD%' AND publisher = 'FreeCAD Team' AND version_compare(version, '1.1.1') < 0);"
|
||||
},
|
||||
"installer_url": "https://github.com/FreeCAD/FreeCAD/releases/download/1.1.1/FreeCAD_1.1.1-Windows-x86_64-py311-installer.exe",
|
||||
"install_script_ref": "1cf2c1f5",
|
||||
"uninstall_script_ref": "6baebf4c",
|
||||
"sha256": "3e4caf58cc1d82e4e8d726572f741ae664b6e91a77c4d3cb59102d9b8bd51feb",
|
||||
"default_categories": [
|
||||
"Productivity"
|
||||
]
|
||||
}
|
||||
],
|
||||
"refs": {
|
||||
"1cf2c1f5": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# FreeCAD ships as a MultiUser NSIS installer. /S runs it silently and\n# /AllUsers forces the machine-wide install (HKLM + C:\\Program Files).\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/AllUsers /S\"\n PassThru = $true\n Wait = $true\n}\n\n$process = Start-Process @processOptions\n$exitCode = $process.ExitCode\n\nWrite-Host \"Install exit code: $exitCode\"\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
|
||||
"6baebf4c": "# Uninstalls FreeCAD.\n#\n# FreeCAD (MultiUser NSIS) registers a versioned DisplayName (\"FreeCAD 1.1.1\")\n# under HKLM when installed with /AllUsers, so match on the \"FreeCAD\" prefix.\n# Its QuietUninstallString runs \"Uninstall-FreeCAD.exe\" /S (real silent, no\n# service to block removal).\n\n$softwareNameLike = \"FreeCAD*\"\n$publisherLike = \"FreeCAD*\"\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 -and $_.Publisher -like $publisherLike } |\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"
|
||||
}
|
||||
}
|
||||
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
@@ -0,0 +1,14 @@
|
||||
import * as React from "react";
|
||||
|
||||
import type { SVGProps } from "react";
|
||||
|
||||
const Freecad = (props: SVGProps<SVGSVGElement>) => (
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width={32} height={32} {...props}>
|
||||
<image
|
||||
width={32}
|
||||
height={32}
|
||||
href="data:image/png;base64,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"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
export default Freecad;
|
||||
@@ -385,6 +385,7 @@ import Firefox from "./Firefox";
|
||||
import Fission from "./Fission";
|
||||
import FleetDesktop from "./FleetDesktop";
|
||||
import Flexoptix from "./Flexoptix";
|
||||
import Flexwhere from "./Flexwhere";
|
||||
import Fluid from "./Fluid";
|
||||
import FluxApp from "./FluxApp";
|
||||
import FocusriteControl2 from "./FocusriteControl2";
|
||||
@@ -394,14 +395,18 @@ import Fontlab from "./Fontlab";
|
||||
import Forecast from "./Forecast";
|
||||
import Fork from "./Fork";
|
||||
import Forklift from "./Forklift";
|
||||
import Fortify from "./Fortify";
|
||||
import FourKSlideshowMaker from "./FourKSlideshowMaker";
|
||||
import FourKStogram from "./FourKStogram";
|
||||
import FourKVideoDownloader from "./FourKVideoDownloader";
|
||||
import FourKVideoDownloaderPlus from "./FourKVideoDownloaderPlus";
|
||||
import FourKVideoToMp3 from "./FourKVideoToMp3";
|
||||
import FourKYoutubeToMp3 from "./FourKYoutubeToMp3";
|
||||
import FoxitPdfEditor from "./FoxitPdfEditor";
|
||||
import FoxitPdfReader from "./FoxitPdfReader";
|
||||
import Framer from "./Framer";
|
||||
import Franz from "./Franz";
|
||||
import Freecad from "./Freecad";
|
||||
import FreeDownloadManager from "./FreeDownloadManager";
|
||||
import Freefilesync from "./Freefilesync";
|
||||
import Front from "./Front";
|
||||
@@ -1492,6 +1497,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = {
|
||||
fission: Fission,
|
||||
"fleet desktop": FleetDesktop,
|
||||
"flexoptix app": Flexoptix,
|
||||
flexwhere: Flexwhere,
|
||||
fluid: Fluid,
|
||||
"focusrite control 2": FocusriteControl2,
|
||||
folx: Folx,
|
||||
@@ -1500,9 +1506,13 @@ export const SOFTWARE_NAME_TO_ICON_MAP = {
|
||||
forecast: Forecast,
|
||||
fork: Fork,
|
||||
forklift: Forklift,
|
||||
fortify: Fortify,
|
||||
"foxit pdf editor": FoxitPdfEditor,
|
||||
"foxit pdf reader": FoxitPdfReader,
|
||||
framer: Framer,
|
||||
franz: Franz,
|
||||
"free download manager": FreeDownloadManager,
|
||||
freecad: Freecad,
|
||||
freefilesync: Freefilesync,
|
||||
front: Front,
|
||||
fsmonitor: Fsmonitor,
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 7.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 7.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.4 KiB |
Reference in New Issue
Block a user