Skip to content

Add Windows FMAs (letter A): 14 apps#48881

Merged
allenhouchins merged 4 commits into
mainfrom
add-windows-fmas-letter-a
Jul 7, 2026
Merged

Add Windows FMAs (letter A): 14 apps#48881
allenhouchins merged 4 commits into
mainfrom
add-windows-fmas-letter-a

Conversation

@allenhouchins

@allenhouchins allenhouchins commented Jul 7, 2026

Copy link
Copy Markdown
Member

This pull request adds support for several new Windows applications to the maintained apps catalog, primarily by introducing new JSON manifest files for each app and, in some cases, associated PowerShell install/uninstall scripts. These additions expand the catalog's coverage of productivity, developer, utility, and communication tools, and include detailed installation and uninstallation logic for certain apps.

New application manifests:

  • Added JSON manifests for a variety of applications, including but not limited to: Adobe AIR, Agent Ransack, AIMP, Air Explorer, alfaview, Allway Sync, Amazon Corretto (versions 8, 11, 17), Amazon Redshift ODBC Driver, AnyBurn, AnyDesk, AVS Image Converter, AVS Media Player, AWS Session Manager Plugin, Azure Functions Core Tools, CutePDF Writer, and iTunes. Each manifest specifies installation parameters, categories, and (where applicable) custom install/uninstall scripts. [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18]

Custom installation and uninstallation scripts:

  • Added PowerShell scripts for silent installation and uninstallation of Adobe AIR, including logic to extract and execute the correct uninstall command from the Windows registry, ensuring a clean and unattended removal process. [1] [2]

These changes improve the breadth and automation capabilities of the maintained apps catalog, especially for environments that require silent and reliable software deployment and removal.…esk, iTunes, Azure Functions Core Tools

Related issue: Resolves #

Checklist for submitter

If some of the following don't apply, delete the relevant line.

  • Changes file added for user-visible changes in changes/, orbit/changes/ or ee/fleetd-chrome/changes.
    See Changes files for more information.

  • 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.

  • Timeouts are implemented and retries are limited to avoid infinite loops

  • If paths of existing endpoints are modified without backwards compatibility, checked the frontend/CLI for any necessary changes

Testing

For unreleased bug fixes in a release candidate, one of:

  • Confirmed that the fix is not expected to adversely impact load test results
  • Alerted the release DRI if additional load testing is needed

Database migrations

  • Checked schema for all modified table for columns that will auto-update timestamps during migration.
  • Confirmed that updating the timestamps is acceptable, and will not cause unwanted side effects.
  • Ensured the correct collation is explicitly set for character columns (COLLATE utf8mb4_unicode_ci).

New Fleet configuration settings

  • Setting(s) is/are explicitly excluded from GitOps

If you didn't check the box above, follow this checklist for GitOps-enabled settings:

  • Verified that the setting is exported via fleetctl generate-gitops
  • Verified the setting is documented in a separate PR to the GitOps documentation
  • Verified that the setting is cleared on the server if it is not supplied in a YAML file (or that it is documented as being optional)
  • Verified that any relevant UI is disabled when GitOps mode is enabled

fleetd/orbit/Fleet Desktop

  • Verified compatibility with the latest released version of Fleet (see Must rule)
  • If the change applies to only one platform, confirmed that runtime.GOOS is used as needed to isolate changes
  • Verified that fleetd runs on macOS, Linux and Windows
  • Verified auto-update works from the released version of component to the new version (see tools/tuf/test)

Summary by CodeRabbit

  • New Features
    • Added support for more Windows apps in the software catalog, including Agent Ransack, Air Explorer, Alfaview, Allway Sync, Amazon Corretto, AnyBurn, AVS apps, AWS Session Manager Plugin, Azure Functions Core Tools, and iTunes.
    • Added matching app icons so these products display correctly in the UI.
    • Expanded install/uninstall support for these apps, including quieter installs, safer removals, and better handling of restart-required outcomes.

fleet-release
fleet-release previously approved these changes Jul 7, 2026
@codecov

codecov Bot commented Jul 7, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 50.00000% with 9 lines in your changes missing coverage. Please review.
✅ Project coverage is 68.10%. Comparing base (af51636) to head (318cb45).
⚠️ Report is 9 commits behind head on main.

Files with missing lines Patch % Lines
...ges/SoftwarePage/components/icons/AgentRansack.tsx 50.00% 1 Missing ⚠️
...ages/SoftwarePage/components/icons/AirExplorer.tsx 50.00% 1 Missing ⚠️
...d/pages/SoftwarePage/components/icons/Alfaview.tsx 50.00% 1 Missing ⚠️
...pages/SoftwarePage/components/icons/AllwaySync.tsx 50.00% 1 Missing ⚠️
...nd/pages/SoftwarePage/components/icons/Anyburn.tsx 50.00% 1 Missing ⚠️
...oftwarePage/components/icons/AvsImageConverter.tsx 50.00% 1 Missing ⚠️
...s/SoftwarePage/components/icons/AvsMediaPlayer.tsx 50.00% 1 Missing ⚠️
...ePage/components/icons/AzureFunctionsCoreTools.tsx 50.00% 1 Missing ⚠️
...end/pages/SoftwarePage/components/icons/Itunes.tsx 50.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #48881      +/-   ##
==========================================
- Coverage   68.10%   68.10%   -0.01%     
==========================================
  Files        3694     3706      +12     
  Lines      234425   234457      +32     
  Branches    12464    12317     -147     
==========================================
+ Hits       159647   159667      +20     
- Misses      60450    60462      +12     
  Partials    14328    14328              
Flag Coverage Δ
frontend 59.27% <50.00%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

fleet-release
fleet-release previously approved these changes Jul 7, 2026
…idation

Validator results (run 1): Adobe AIR's updater rejects extra switches
('too many arguments'), so the uninstall now runs the registered
UninstallString as-is. AnyDesk reports DisplayVersion 'ad 9.7.9' (prefix
breaks version matching), CutePDF Writer reports ' 4.0' (leading space),
and aimp.ru's download redirects unreliably -- all three deferred.
@allenhouchins allenhouchins changed the title Add Windows FMAs (letter A): 18 apps Add Windows FMAs (letter A): 15 apps Jul 7, 2026
@allenhouchins

Copy link
Copy Markdown
Member Author

Validation run 1 results — scope reduced from 18 to 15 apps (commit f82a39b)

14/18 passed. Actions taken:

  • Adobe AIR (fixed): the ARP-registered "Adobe AIR Updater.exe" rejects any switch beyond -arp:uninstall (too many arguments, exit 2). The uninstall script no longer appends -silent and runs the registered command as-is.
  • AnyDesk (dropped/deferred): installs fine, but the registry DisplayVersion is literally ad 9.7.9 — the ad prefix breaks version matching, so the patch policy could never work. Needs a MutateSoftwareOnIngestion rule (like the JetBrains one) to strip the prefix before this FMA can ship.
  • CutePDF Writer (dropped/deferred): registry DisplayVersion is 4.0 with a leading space, which fails version matching.
  • AIMP (dropped/deferred): the validator's download failed because aimp.ru redirected to a bare / path; direct requests to the installer URL also hang intermittently — the vendor appears to use hotlink/referer protection, making the download source too unreliable for an FMA.

All three drops are recorded in the workstream tracker with reasons. The remaining 15: Corretto 8/11/17, Redshift ODBC Driver, AWS Session Manager Plugin, Azure Functions Core Tools, Agent Ransack, AnyBurn, Allway Sync, Air Explorer, Adobe AIR, alfaview, AVS Image Converter, AVS Media Player, iTunes.

fleet-release
fleet-release previously approved these changes Jul 7, 2026
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/adobe-air/windows.json

=== Install Script (no changes) ===
=== Uninstall // 63355e67 -> 7fd55b2a ===

--- /tmp/old.AEm6Xl	2026-07-07 19:15:42.974417386 +0000
+++ /tmp/new.gBDweC	2026-07-07 19:15:42.974417386 +0000
@@ -2,8 +2,9 @@
 #
 # The inner MSI sets ARPSYSTEMCOMPONENT, so the visible ARP entry is the
 # vendor-written key "Adobe AIR" whose UninstallString runs
-# "...\Adobe AIR Updater.exe" -arp:uninstall. We take that command from the
-# registry and add -silent to keep it quiet.
+# "...\Adobe AIR Updater.exe" -arp:uninstall. Run that command exactly as
+# registered: the updater rejects any extra switches ("too many arguments",
+# exit 2), including -silent.
 
 $softwareName = "Adobe AIR"
 
@@ -34,8 +35,6 @@
             $exe = $raw; $exeArgs = ""
         }
 
-        if ($exeArgs -notmatch '(?i)-silent') { $exeArgs = "$exeArgs -silent".Trim() }
-
         Write-Host "Uninstall command: $exe"
         Write-Host "Uninstall args: $exeArgs"
         $process = Start-Process -FilePath $exe -ArgumentList $exeArgs -NoNewWindow -PassThru -Wait

ee/maintained-apps/outputs/agent-ransack/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/air-explorer/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/alfaview/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/allway-sync/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-corretto-11/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-corretto-17/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-corretto-8/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/amazon-redshift-odbc-driver/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/anyburn/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/avs-image-converter/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/avs-media-player/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/aws-session-manager-plugin/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/azure-functions-core-tools/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/itunes/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

The updater's -arp:uninstall hangs on UI in the SYSTEM session (validator
timeout after 11 minutes) and rejects extra switches like -silent
('too many arguments'), so there is no silent uninstall path.
@allenhouchins allenhouchins changed the title Add Windows FMAs (letter A): 15 apps Add Windows FMAs (letter A): 14 apps Jul 7, 2026
@allenhouchins

Copy link
Copy Markdown
Member Author

Validation run 2: 14/15 — Adobe AIR dropped (commit 318cb45)

The remaining failure was Adobe AIR's uninstall: run 1 showed the updater rejects -arp:uninstall -silent ("too many arguments"), and run 2 showed the bare -arp:uninstall hangs on UI in the SYSTEM session until the 11-minute timeout. There is no silent uninstall path, so Adobe AIR is removed and deferred in the tracker. The other 14 apps all passed.

@allenhouchins allenhouchins marked this pull request as ready for review July 7, 2026 19:59
@allenhouchins allenhouchins requested a review from a team as a code owner July 7, 2026 19:59
Copilot AI review requested due to automatic review settings July 7, 2026 19:59
@fleet-release fleet-release requested a review from eashaw July 7, 2026 19:59
@allenhouchins allenhouchins merged commit 0b929a1 into main Jul 7, 2026
30 of 31 checks passed
@allenhouchins allenhouchins deleted the add-windows-fmas-letter-a branch July 7, 2026 20:00
@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 2cc8f497-f694-4871-ab37-522ebfbfb3b0

📥 Commits

Reviewing files that changed from the base of the PR and between 2d64dcc and 318cb45.

⛔ Files ignored due to path filters (9)
  • website/assets/images/app-icon-agent-ransack-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-air-explorer-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-alfaview-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-allway-sync-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-anyburn-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-avs-image-converter-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-avs-media-player-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-azure-functions-core-tools-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-itunes-60x60@2x.png is excluded by !**/*.png
📒 Files selected for processing (54)
  • ee/maintained-apps/inputs/winget/agent-ransack.json
  • ee/maintained-apps/inputs/winget/air-explorer.json
  • ee/maintained-apps/inputs/winget/alfaview.json
  • ee/maintained-apps/inputs/winget/allway-sync.json
  • ee/maintained-apps/inputs/winget/amazon-corretto-11.json
  • ee/maintained-apps/inputs/winget/amazon-corretto-17.json
  • ee/maintained-apps/inputs/winget/amazon-corretto-8.json
  • ee/maintained-apps/inputs/winget/amazon-redshift-odbc-driver.json
  • ee/maintained-apps/inputs/winget/anyburn.json
  • ee/maintained-apps/inputs/winget/avs-image-converter.json
  • ee/maintained-apps/inputs/winget/avs-media-player.json
  • ee/maintained-apps/inputs/winget/aws-session-manager-plugin.json
  • ee/maintained-apps/inputs/winget/azure-functions-core-tools.json
  • ee/maintained-apps/inputs/winget/itunes.json
  • ee/maintained-apps/inputs/winget/scripts/agent-ransack_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/agent-ransack_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/air-explorer_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/air-explorer_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/anyburn_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/anyburn_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/avs-image-converter_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/avs-image-converter_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/avs-media-player_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/avs-media-player_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/aws-session-manager-plugin_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/aws-session-manager-plugin_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/azure-functions-core-tools_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/itunes_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/itunes_uninstall.ps1
  • ee/maintained-apps/outputs/agent-ransack/windows.json
  • ee/maintained-apps/outputs/air-explorer/windows.json
  • ee/maintained-apps/outputs/alfaview/windows.json
  • ee/maintained-apps/outputs/allway-sync/windows.json
  • ee/maintained-apps/outputs/amazon-corretto-11/windows.json
  • ee/maintained-apps/outputs/amazon-corretto-17/windows.json
  • ee/maintained-apps/outputs/amazon-corretto-8/windows.json
  • ee/maintained-apps/outputs/amazon-redshift-odbc-driver/windows.json
  • ee/maintained-apps/outputs/anyburn/windows.json
  • ee/maintained-apps/outputs/apps.json
  • ee/maintained-apps/outputs/avs-image-converter/windows.json
  • ee/maintained-apps/outputs/avs-media-player/windows.json
  • ee/maintained-apps/outputs/aws-session-manager-plugin/windows.json
  • ee/maintained-apps/outputs/azure-functions-core-tools/windows.json
  • ee/maintained-apps/outputs/itunes/windows.json
  • frontend/pages/SoftwarePage/components/icons/AgentRansack.tsx
  • frontend/pages/SoftwarePage/components/icons/AirExplorer.tsx
  • frontend/pages/SoftwarePage/components/icons/Alfaview.tsx
  • frontend/pages/SoftwarePage/components/icons/AllwaySync.tsx
  • frontend/pages/SoftwarePage/components/icons/Anyburn.tsx
  • frontend/pages/SoftwarePage/components/icons/AvsImageConverter.tsx
  • frontend/pages/SoftwarePage/components/icons/AvsMediaPlayer.tsx
  • frontend/pages/SoftwarePage/components/icons/AzureFunctionsCoreTools.tsx
  • frontend/pages/SoftwarePage/components/icons/Itunes.tsx
  • frontend/pages/SoftwarePage/components/icons/index.ts

Walkthrough

This PR adds fourteen new maintained Windows applications to the fleet catalog: Agent Ransack, Air Explorer, alfaview, Allway Sync, Amazon Corretto (8/11/17), Amazon Redshift ODBC Driver, AnyBurn, AVS Image Converter, AVS Media Player, AWS Session Manager Plugin, Azure Functions Core Tools, and iTunes. Changes include new winget input JSON manifests, standalone and embedded PowerShell install/uninstall scripts (handling MSI, EXE, and zip installers with registry-based uninstall lookup), output windows.json definitions per app, new entries in the shared apps.json registry, and new frontend React SVG icon components wired into the SOFTWARE_NAME_TO_ICON_MAP mapping.

Changes

Cohort / Layer Changes
Agent Ransack Input manifest, install/uninstall scripts, output windows.json with embedded scripts
Air Explorer & AnyBurn Input manifests, EXE install/registry-based uninstall scripts, output manifests
AVS Image Converter & AVS Media Player Input manifests, Inno Setup install/uninstall scripts, output manifests
MSI-based apps (alfaview, Allway Sync, Corretto 8/11/17, Redshift ODBC, Azure Functions Core Tools) Input manifests, msiexec-based embedded install/uninstall logic, output manifests
AWS Session Manager Plugin Input manifest, WiX burn/MSI uninstall handling scripts, output manifest
iTunes Input manifest, ProductCode-based install/uninstall scripts, output manifest
apps.json registry New catalog entries for all fourteen apps
Frontend icons New SVG icon components and SOFTWARE_NAME_TO_ICON_MAP entries

Sequence Diagram(s)

sequenceDiagram
  participant InputManifest as winget input JSON
  participant InstallScript
  participant Msiexec_or_EXE
  participant Registry
  participant OutputManifest as output windows.json
  InputManifest->>InstallScript: reference install script path
  InstallScript->>Msiexec_or_EXE: run installer silently
  Msiexec_or_EXE-->>InstallScript: exit code
  InstallScript-->>OutputManifest: propagate normalized exit code
  Registry->>OutputManifest: uninstall entry lookup for uninstall script
Loading

Related issues: None found in provided context.

Possibly related PRs

  • fleetdm/fleet#46877: Both PRs extend the maintained-app catalog by adding new Windows app definitions and shared registries (apps.json, icons index).
  • fleetdm/fleet#47732: Both PRs update apps.json and frontend icons/index.ts with new maintained Windows app entries.
  • fleetdm/fleet#48762: Both PRs follow the same pattern of adding a new maintained Windows app with a corresponding icon mapping in icons/index.ts.

Suggested labels: enhancement, maintained-apps, frontend

Suggested reviewers: (none available from provided context)

🐰 A rabbit hops through winget's den,
Fourteen new apps join in again,
Scripts that install, uninstall with care,
Icons now shine, mapped everywhere,
Fleet's software list grows wide — amen!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch add-windows-fmas-letter-a

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR expands Fleet’s Windows maintained apps catalog (“FMAs”) by adding new Winget input manifests + install/uninstall scripts, generating corresponding output manifests, and wiring up new Software page icons/mappings so these apps show up with branded icons.

Changes:

  • Added/updated Windows maintained-app output manifests (versions, queries, installer URLs, scripts) and appended new entries to apps.json.
  • Added new Winget input manifests and PowerShell install/uninstall scripts for the new Windows apps.
  • Added new frontend icon components and updated the software-name → icon map.

Reviewed changes

Copilot reviewed 54 out of 63 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
frontend/pages/SoftwarePage/components/icons/Itunes.tsx Adds iTunes icon component.
frontend/pages/SoftwarePage/components/icons/AzureFunctionsCoreTools.tsx Adds Azure Functions Core Tools icon component.
frontend/pages/SoftwarePage/components/icons/AvsMediaPlayer.tsx Adds AVS Media Player icon component.
frontend/pages/SoftwarePage/components/icons/AllwaySync.tsx Adds Allway Sync icon component.
frontend/pages/SoftwarePage/components/icons/Alfaview.tsx Adds alfaview icon component.
frontend/pages/SoftwarePage/components/icons/AirExplorer.tsx Adds Air Explorer icon component.
frontend/pages/SoftwarePage/components/icons/AgentRansack.tsx Adds Agent Ransack icon component.
frontend/pages/SoftwarePage/components/icons/index.ts Registers new icons + extends SOFTWARE_NAME_TO_ICON_MAP.
ee/maintained-apps/outputs/itunes/windows.json Adds generated Windows maintained-app output for iTunes, including embedded scripts.
ee/maintained-apps/outputs/azure-functions-core-tools/windows.json Adds generated Windows maintained-app output for Azure Functions Core Tools, including embedded scripts.
ee/maintained-apps/outputs/aws-session-manager-plugin/windows.json Adds generated Windows maintained-app output for AWS Session Manager Plugin, including embedded scripts.
ee/maintained-apps/outputs/avs-media-player/windows.json Adds generated Windows maintained-app output for AVS Media Player, including embedded scripts.
ee/maintained-apps/outputs/avs-image-converter/windows.json Adds generated Windows maintained-app output for AVS Image Converter, including embedded scripts.
ee/maintained-apps/outputs/anyburn/windows.json Adds generated Windows maintained-app output for AnyBurn, including embedded scripts.
ee/maintained-apps/outputs/amazon-redshift-odbc-driver/windows.json Adds generated Windows maintained-app output for Amazon Redshift ODBC Driver, including embedded scripts.
ee/maintained-apps/outputs/amazon-corretto-8/windows.json Adds generated Windows maintained-app output for Amazon Corretto 8, including embedded scripts.
ee/maintained-apps/outputs/amazon-corretto-17/windows.json Adds generated Windows maintained-app output for Amazon Corretto 17, including embedded scripts.
ee/maintained-apps/outputs/amazon-corretto-11/windows.json Adds generated Windows maintained-app output for Amazon Corretto 11, including embedded scripts.
ee/maintained-apps/outputs/allway-sync/windows.json Adds generated Windows maintained-app output for Allway Sync, including embedded scripts.
ee/maintained-apps/outputs/alfaview/windows.json Adds generated Windows maintained-app output for alfaview, including embedded scripts.
ee/maintained-apps/outputs/air-explorer/windows.json Adds generated Windows maintained-app output for Air Explorer, including embedded scripts.
ee/maintained-apps/outputs/agent-ransack/windows.json Adds generated Windows maintained-app output for Agent Ransack, including embedded scripts.
ee/maintained-apps/outputs/apps.json Adds new app metadata entries to the catalog index.
ee/maintained-apps/inputs/winget/scripts/itunes_install.ps1 Adds iTunes EXE wrapper silent install script.
ee/maintained-apps/inputs/winget/scripts/itunes_uninstall.ps1 Adds iTunes uninstall script that finds MSI ProductCode via ARP.
ee/maintained-apps/inputs/winget/scripts/azure-functions-core-tools_install.ps1 Adds MSI install script forcing ALLUSERS=1.
ee/maintained-apps/inputs/winget/scripts/aws-session-manager-plugin_install.ps1 Adds burn bundle silent install script.
ee/maintained-apps/inputs/winget/scripts/aws-session-manager-plugin_uninstall.ps1 Adds burn/MSI-aware uninstall script.
ee/maintained-apps/inputs/winget/scripts/avs-media-player_install.ps1 Adds silent Inno Setup install script.
ee/maintained-apps/inputs/winget/scripts/avs-media-player_uninstall.ps1 Adds uninstall script matching versioned ARP DisplayName prefix.
ee/maintained-apps/inputs/winget/scripts/avs-image-converter_install.ps1 Adds silent Inno Setup install script.
ee/maintained-apps/inputs/winget/scripts/avs-image-converter_uninstall.ps1 Adds uninstall script matching versioned ARP DisplayName prefix.
ee/maintained-apps/inputs/winget/scripts/anyburn_install.ps1 Adds silent NSIS install script.
ee/maintained-apps/inputs/winget/scripts/anyburn_uninstall.ps1 Adds NSIS uninstall script.
ee/maintained-apps/inputs/winget/scripts/air-explorer_install.ps1 Adds silent NSIS install script.
ee/maintained-apps/inputs/winget/scripts/air-explorer_uninstall.ps1 Adds NSIS uninstall script.
ee/maintained-apps/inputs/winget/scripts/agent-ransack_install.ps1 Adds zip extraction + MSI install script for Agent Ransack.
ee/maintained-apps/inputs/winget/scripts/agent-ransack_uninstall.ps1 Adds MSI uninstall script locating ProductCode via ARP.
ee/maintained-apps/inputs/winget/itunes.json Adds Winget input manifest for iTunes.
ee/maintained-apps/inputs/winget/azure-functions-core-tools.json Adds Winget input manifest for Azure Functions Core Tools.
ee/maintained-apps/inputs/winget/aws-session-manager-plugin.json Adds Winget input manifest for AWS Session Manager Plugin.
ee/maintained-apps/inputs/winget/avs-media-player.json Adds Winget input manifest for AVS Media Player.
ee/maintained-apps/inputs/winget/avs-image-converter.json Adds Winget input manifest for AVS Image Converter.
ee/maintained-apps/inputs/winget/anyburn.json Adds Winget input manifest for AnyBurn.
ee/maintained-apps/inputs/winget/amazon-redshift-odbc-driver.json Adds Winget input manifest for Amazon Redshift ODBC Driver.
ee/maintained-apps/inputs/winget/amazon-corretto-8.json Adds Winget input manifest for Amazon Corretto 8.
ee/maintained-apps/inputs/winget/amazon-corretto-17.json Adds Winget input manifest for Amazon Corretto 17.
ee/maintained-apps/inputs/winget/amazon-corretto-11.json Adds Winget input manifest for Amazon Corretto 11.
ee/maintained-apps/inputs/winget/allway-sync.json Adds Winget input manifest for Allway Sync.
ee/maintained-apps/inputs/winget/alfaview.json Adds Winget input manifest for alfaview.
ee/maintained-apps/inputs/winget/air-explorer.json Adds Winget input manifest for Air Explorer.
ee/maintained-apps/inputs/winget/agent-ransack.json Adds Winget input manifest for Agent Ransack.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 1149 to 1151
"aws sam command line interface": AwsSamCli,
"aws session manager plugin": AwsCli,
"aws vpn client": AwsVpnClient,
}
],
"refs": {
"105b8804": "$product_code = '{E8687AC8-92C2-4516-8A3A-A7829B82C57B}'\n$timeoutSeconds = 300 # 5 minute timeout\n\n# Fleet uninstalls app using product code that's extracted on upload\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\nif (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n}\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\n# Check exit code and output result\nif ($successCodes -contains $process.ExitCode) {\n Write-Output \"Exit 0\"\n Exit 0\n} else {\n Write-Output \"Exit $($process.ExitCode)\"\n Exit $process.ExitCode\n}\n",
],
"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",
"96f31cd6": "$product_code = '{51CDB2E7-BFE8-41A5-B1DC-2AFFD139C646}'\n$timeoutSeconds = 300 # 5 minute timeout\n\n# Fleet uninstalls app using product code that's extracted on upload\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\nif (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n}\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\n# Check exit code and output result\nif ($successCodes -contains $process.ExitCode) {\n Write-Output \"Exit 0\"\n Exit 0\n} else {\n Write-Output \"Exit $($process.ExitCode)\"\n Exit $process.ExitCode\n}\n"
Comment on lines +17 to +21
$msi = Get-ChildItem -Path $extractPath -Filter "*.msi" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1
if (-not $msi) {
Write-Host "Error: MSI not found under $extractPath"
Exit 1
}
allenhouchins added a commit that referenced this pull request Jul 8, 2026
**Related issue:** N/A — part of the Windows Fleet-maintained apps
catalog expansion (letter B batch; follows #48872 and #48881).

Adds six new Windows Fleet-maintained apps:

| App | winget package | Installer | Notes |
|-----|----------------|-----------|-------|
| BandiView | `Bandisoft.BandiView` | EXE (NSIS-style), machine, x64 |
Unversioned InstallerUrl → `ignore_hash` (URL verified to serve the
binary reliably without Referer tricks). DisplayName "BandiView" stable
across releases. |
| BleachBit | `BleachBit.BleachBit` | EXE (NsisMultiUser), machine, x86
| Install script passes the case-sensitive `/allusers /S` — without
`/allusers` the NsisMultiUser installer's scope is ambiguous. winget
declares a VCRedist 2010 x86 dependency Fleet can't satisfy; noted as a
caveat. |
| Bulk Crap Uninstaller | `Klocman.BulkCrapUninstaller` | EXE (Inno),
machine, x86 | ARP DisplayName is versioned ("BCUninstaller 6.2.0.0")
and never matches the friendly name, so `unique_identifier`
"BCUninstaller" + `fuzzy_match_name`. Registry version is 4-part vs
winget's "6.2" — `version_compare` pads, verified consistent. |
| BrowserStackLocal | `BrowserStack.BrowserStackLocal` | MSI (WiX),
machine, x64 | Clean MSI (ALLUSERS=1, identity verified via msiinfo).
Unversioned InstallerUrl → `ignore_hash`. |
| Burp Suite Professional | `PortSwigger.BurpSuite.Professional` | EXE
(install4j), machine, x64 | Mirrors the existing Burp Suite Community
FMA: `-q -Dinstall4j.suppressUnattendedReboot=true` plus the
load-bearing `-dir` into Program Files (install4j defaults to per-user
otherwise). DisplayName is versioned **without** "Edition" ("Burp Suite
Professional 2026.3.3"), unlike Community — fuzzy pattern `Burp Suite
Professional %` can't collide with Community's. |
| Bytello Share | `Bytello.BytelloShare` | EXE (NSIS), machine, x86 |
Uses the nullsoft `agent=d` variant whose ARP identity ("Bytello Share"
/ publisher "Bytello Share") matches real-world inventory; the zip
variant registers a different name ("BytelloShare") and its nested-MSI
path is version-pinned and already stale. Vendor URL is a latest-pointer
already ahead of winget → `ignore_hash`. **Note:** the input says
`installer_type: "msi"` — the ingester classifies this nullsoft entry as
msi because its URL has no file extension (vendor-type → URL-extension →
machine-scope fallback chain in `ingester.go`); the custom scripts
handle the actual NSIS exe. |

Considered but **not** added (recorded in the workstream tracker):
- **Bambu Studio** (`Bambulab.Bambustudio`): the uninstaller shows a
keep-user-data confirmation dialog even with `/S` (deployment guides
work around it with Send-Keys, impossible in a SYSTEM session) — same
failure class that disqualified Adobe AIR in the letter A batch.
- **Bridge Designer** (`StephenRessler.BridgeDesigner`): installer URL
404s (file removed from SourceForge) and the desktop product was
discontinued July 1, 2026 in favor of a browser-based edition.
- **BurnAware Free** (`Burnaware.BurnAwareFree`): the vendor deletes
each old release URL — the winget-pinned installer already redirects to
their homepage, so pinned downloads break every release cycle.

Registry identities were verified per app (msiinfo Property tables for
MSIs; vendor installer sources, winget AppsAndFeaturesEntries, and
uninstall-database corroboration for EXEs). Installer SHAs verified
against manifests where URLs are version-pinned; unversioned URLs use
`ignore_hash` per the TeamViewer/Chrome precedent. Icons generated via
`tools/software/icons/generate-icons.sh`.

# 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)
allenhouchins added a commit that referenced this pull request Jul 8, 2026
**Related issue:** N/A — part of the Windows Fleet-maintained apps
catalog expansion (letter C batch; follows #48872, #48881, #48950).

Adds seventeen new Windows Fleet-maintained apps:

| App | winget package | Installer | Notes |
|-----|----------------|-----------|-------|
| Advanced Installer | `Caphyon.AdvancedInstaller` | MSI, machine, x64 |
Versioned ARP name ("Advanced Installer 23.8") → fuzzy match. |
| Certify The Web | `CertifyTheWeb.CertifySSLManager` | Inno, machine,
x64 | ARP name is "Certify Certificate Manager version 7.1.0.0" (product
renamed at v7) → fuzzy on "Certify Certificate Manager". |
| Chatbox | `Bin-Huang.Chatbox` | NSIS (electron-builder), machine, x64
| `/allusers /S`; custom exists query excludes the separate Chatbox
Community Edition; uninstall matches `Chatbox [0-9]*`. |
| Citrix Workspace | `Citrix.Workspace` | Vendor bootstrapper EXE,
machine, x86 universal | ARP name "Citrix Workspace \<YYMM\>" → fuzzy.
Uninstall runs the registered TrolleyExpress with `/uninstall /cleanup
/silent`; 3010 treated as success. See "not added" for the LTSR caveat.
|
| CPU-Z | `CPUID.CPU-Z` | Inno, machine | `installer_locale` pinned to
en-US (manifest also carries zh-CN); `/ALLUSERS` added to Inno switches;
versioned ARP name → fuzzy. |
| CodeMeter Runtime Kit | `Wibu-Systems.CodeMeterRuntimeKit` | Vendor
bootstrapper embedding MSI, x64 | `installer_scope: ""` (manifest
declares no scope; embedded MSI is per-machine). Install `/q /nosplash
/ComponentArgs "*":"/quiet /norestart"`; uninstall via msiexec by ARP
name prefix. Identity verified by carving the embedded MSI. |
| ClipboardFusion | `BinaryFortress.ClipboardFusion` | Inno, machine,
x64 | ARP name carries a locale-dependent "(64-bit)" suffix → fuzzy
pattern `ClipboardFusion%`; `/LAUNCHAFTER=0` prevents post-install
launch. |
| CloudShow | `BinaryFortress.CloudShow` | Inno, machine, x64 | Same
Binary Fortress framework; ARP name "CloudShow Launcher (64-bit)" is
framework-inferred (no third-party corroboration exists) — the CI
validator is the confirmation. |
| ClockAssist | `ClockAssist.ClockAssist` | MSI, machine, x64 |
Latest-pointer URL but actively maintained manifest (bot replaces the
single version dir ~6-weekly) → `ignore_hash`. |
| Crestron AirMedia | `Crestron.AirMedia` | MSI, machine, x86 | ARP name
is "Crestron AirMedia Machine-Wide Installer" (Teams-style per-user
stamping); identity from msiinfo. |
| Crestron AirMedia Peripherals | `Crestron.AirMediaPeripherals` | MSI,
machine, x64 | Clean MSI. LaunchCondition fails install (1603) on hosts
with a pending reboot — noted. |
| CrisisGo | `CrisisGo.CrisisGo` | InstallShield Basic MSI, machine, x86
| Custom install script passes `ISSETUPDRIVEN=1` to defuse the "must run
setup.exe" guard (vendor ships this bare MSI for network deployment;
winget sandbox validates it). |
| Cyberduck CLI | `Iterate.CyberduckCLI` | MSI, machine, x64 | Clean WiX
MSI. winget lags the vendor by ~4 releases, but pinned URLs stay live,
so installs work — just not bleeding-edge. |
| Cisco Webex Recorder and Player | `Cisco.WebexRecorderAndPlayer` |
InstallShield MSI, machine, x86 | Legacy WRF player but actively updated
by Cisco (8 winget bumps in 10 months); latest-pointer URL →
`ignore_hash`. |
| Creative Force Kelvin | `CreativeForce.Kelvin` | WiX MSI, machine, x64
| Manifest offers per-user NSIS, machine NSIS, and MSI — the MSI is
selected (unversioned ARP name "Kelvin"). |
| Creative Force Triad | `CreativeForce.Triad` | NSIS
(electron-builder), machine, x64 | `/allusers /S`; versioned ARP name →
fuzzy. |
| Cube Browser | `RystadEnergy.CubeBrowser` | WiX burn bundle, machine,
x64 | Bundle Arp manifest carved from the installer ("Cube Browser (64
bit)"); dual-mode uninstall (prefers bundle entry, msiexec fallback)
since bundle + chained MSI may both register the same name. |

Considered but **not** added (recorded in the workstream tracker):
- **Citrix Workspace app LTSR** (`Citrix.Workspace.LTSR`): the LTSR and
current tracks register the **identical** ARP key
(`CitrixOnlinePluginPackWeb`) and the same "Citrix Workspace \<YYMM\>"
DisplayName with no LTSR marker — the only discriminator is a registry
value outside the programs table, so Fleet inventory cannot tell the
tracks apart. An LTSR FMA would cross-match current-release installs
(and vice versa). **Consequence for the shipped Citrix Workspace FMA:**
hosts running LTSR will match it and may show "update available" toward
the current release — flagged here for reviewer judgment.
- **Charles** (`XK72.Charles`): all winget 5.x manifests are per-user
MSIX only. The vendor ships a machine-scope MSI for 5.2 but it isn't
indexed in winget; revisit if the manifest adds it.
- **Calibrite Profiler** (`Calibrite.PROFILER`): abandoned winget
manifest — one version dir ever while the vendor is five releases and a
major version ahead.
- **Cloud Drive Mapper** (`IAMCloud.CloudDriveMapperV3`): latest-pointer
URL whose manifest SHA is already stale, and the MSI sets
`ARPSYSTEMCOMPONENT=1`, hiding the ARP entry from inventory entirely.
- **CloudCompare** (`CloudCompare.CloudCompare`): registry
DisplayVersion (and the winget PackageVersion itself) embed a
parenthetical date — "2.13.2 (07-06-2024)" — which breaks version
comparison; manifest also stale.
- **Classic Shell** (`IvoSoft.ClassicShell`): development ended in 2017;
superseded by Open-Shell. (CutePDF Writer was already deferred in the
letter A batch.)

Identities verified per app (msiinfo Property tables; burn bundle Arp
manifests carved from installers; AppxManifest/electron-builder sources;
uninstall-database corroboration). SHAs verified against manifests for
pinned URLs; `ignore_hash` used only where the manifest is demonstrably
actively maintained. Icons via `tools/software/icons/generate-icons.sh`;
the pre-existing CitrixWorkspace icon component is reused untouched.

# 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)
selhorn pushed a commit to selhorn/fleet that referenced this pull request Jul 8, 2026
This pull request adds support for several new Windows applications to
the maintained apps catalog, primarily by introducing new JSON manifest
files for each app and, in some cases, associated PowerShell
install/uninstall scripts. These additions expand the catalog's coverage
of productivity, developer, utility, and communication tools, and
include detailed installation and uninstallation logic for certain apps.

**New application manifests:**

* Added JSON manifests for a variety of applications, including but not
limited to: Adobe AIR, Agent Ransack, AIMP, Air Explorer, alfaview,
Allway Sync, Amazon Corretto (versions 8, 11, 17), Amazon Redshift ODBC
Driver, AnyBurn, AnyDesk, AVS Image Converter, AVS Media Player, AWS
Session Manager Plugin, Azure Functions Core Tools, CutePDF Writer, and
iTunes. Each manifest specifies installation parameters, categories, and
(where applicable) custom install/uninstall scripts.
[[1]](diffhunk://#diff-891e1b685eea289f7535f5cb3e80299b2d53d22f1ecb4123a6db873b4715d5d3R1-R13)
[[2]](diffhunk://#diff-33d1963698285631553094360f1dab939589c853b20b13046aeed9c36b484120R1-R12)
[[3]](diffhunk://#diff-48b51963ae1bc8ce2e6d2aa494c7db8df854a0a6f392df70528dc80efb0d4341R1-R12)
[[4]](diffhunk://#diff-8177fe092e9e1cc91dd1582d1e4c01b05176d36dbad36ca16397a681aef7c4a5R1-R13)
[[5]](diffhunk://#diff-c1fd695df858d34d29653fb1db79c04123bbfcf432726f9356d893c7bc4e4b16R1-R11)
[[6]](diffhunk://#diff-4024c71281805493b749ec7aa95819583015483d652481954a3dd4d2ba3803e4R1-R10)
[[7]](diffhunk://#diff-8ab1198cecc28b2b9b77a8668355fd505524a59d414eb7623e9676794c03511eR1-R11)
[[8]](diffhunk://#diff-d8534d1ac84c02c1f87dae2798feae0d03fdb332d19a03fd780c9664c337ce41R1-R11)
[[9]](diffhunk://#diff-375f7eb8d9daf96d4952a5f834a4ba5fa272c034ff808b3f21dbd33cf57b7b7eR1-R10)
[[10]](diffhunk://#diff-0710c7d70ff8eb04379932f0ffd0b754626381372ef6a747858eb7b51c230723R1-R10)
[[11]](diffhunk://#diff-ce4007e90efa1fdfff5c1ca96c8dded2108642a522f30baddcefd9327c23c980R1-R13)
[[12]](diffhunk://#diff-9a7ba8c0afb32ab31c2950a4a95847fa1293411416302cd6698dc2bcb519fbfdR1-R13)
[[13]](diffhunk://#diff-02ae7cdbe54f1736023e830b66036c6f32e5eec642d888f51c6dcfbbb0bf12d0R1-R14)
[[14]](diffhunk://#diff-4d3d9fbb9e19bdf5269ff241fc1549a17b9045a04b0358c988fb81ceb03512e1R1-R14)
[[15]](diffhunk://#diff-c22a0370648cd85f36926d2412d10cb46d3f3da4a623ad4595c115496ac6cd41R1-R13)
[[16]](diffhunk://#diff-5dfe747ae19dfa1572611d72dc109a8cbfe8b379410c4154627e9d1c699670d1R1-R12)
[[17]](diffhunk://#diff-4afa6cde8c52e27d865f759ab7f2aabf5f60522cb8bfe120637a4a954194a237R1-R13)
[[18]](diffhunk://#diff-d5ad3e810b587a379fdb2722806be5a0c47eebefad540077db86d356cfd30e17R1-R12)

**Custom installation and uninstallation scripts:**

* Added PowerShell scripts for silent installation and uninstallation of
Adobe AIR, including logic to extract and execute the correct uninstall
command from the Windows registry, ensuring a clean and unattended
removal process.
[[1]](diffhunk://#diff-75bb214bff0533824521c36d0f6ff369ac7848554824f5f44faadc7c7c3225ffR1-R30)
[[2]](diffhunk://#diff-e10832f9465648bd3c3055d3ab2bde1d4cb3170db6ede0de0b0dc347ab3077f3R1-R58)

These changes improve the breadth and automation capabilities of the
maintained apps catalog, especially for environments that require silent
and reliable software deployment and removal.…esk, iTunes, Azure
Functions Core Tools

<!-- Add the related story/sub-task/bug number, like Resolves fleetdm#123, or
remove if NA -->
**Related issue:** Resolves #

# Checklist for submitter

If some of the following don't apply, delete the relevant line.

- [ ] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files)
for more information.

- [ ] 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.
- [ ] Timeouts are implemented and retries are limited to avoid infinite
loops
- [ ] If paths of existing endpoints are modified without backwards
compatibility, checked the frontend/CLI for any necessary changes

## Testing

- [ ] Added/updated automated tests
- [ ] Where appropriate, [automated tests simulate multiple hosts and
test for host
isolation](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/reference/patterns-backend.md#unit-testing)
(updates to one hosts's records do not affect another)

- [ ] QA'd all new/changed functionality manually

For unreleased bug fixes in a release candidate, one of:

- [ ] Confirmed that the fix is not expected to adversely impact load
test results
- [ ] Alerted the release DRI if additional load testing is needed

## Database migrations

- [ ] Checked schema for all modified table for columns that will
auto-update timestamps during migration.
- [ ] Confirmed that updating the timestamps is acceptable, and will not
cause unwanted side effects.
- [ ] Ensured the correct collation is explicitly set for character
columns (`COLLATE utf8mb4_unicode_ci`).

## New Fleet configuration settings

- [ ] Setting(s) is/are explicitly excluded from GitOps

If you didn't check the box above, follow this checklist for
GitOps-enabled settings:

- [ ] Verified that the setting is exported via `fleetctl
generate-gitops`
- [ ] Verified the setting is documented in a separate PR to [the GitOps
documentation](https://github.com/fleetdm/fleet/blob/main/docs/Configuration/yaml-files.md#L485)
- [ ] Verified that the setting is cleared on the server if it is not
supplied in a YAML file (or that it is documented as being optional)
- [ ] Verified that any relevant UI is disabled when GitOps mode is
enabled

## fleetd/orbit/Fleet Desktop

- [ ] Verified compatibility with the latest released version of Fleet
(see [Must
rule](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/workflows/fleetd-development-and-release-strategy.md))
- [ ] If the change applies to only one platform, confirmed that
`runtime.GOOS` is used as needed to isolate changes
- [ ] Verified that fleetd runs on macOS, Linux and Windows
- [ ] Verified auto-update works from the released version of component
to the new version (see [tools/tuf/test](../tools/tuf/test/README.md))
allenhouchins added a commit that referenced this pull request Jul 10, 2026
**Related issue:** N/A — part of the Windows Fleet-maintained apps
catalog expansion (letter D batch; follows #48872, #48881, #48950,
#48969).

Adds twelve new Windows Fleet-maintained apps:

| App | winget package | Installer | Notes |
|-----|----------------|-----------|-------|
| DataSpell | `JetBrains.DataSpell` | NSIS (install4j), machine, x64 |
Mirrors the DataGrip FMA pattern: `fuzzy_match_name` +
`use_display_version_for_patch` (registry version is a JetBrains build
number; marketing version parsed from the name). |
| dnGrep | `dnGrep.dnGrep` | MSI, machine, x64 | Versioned+arch ARP name
("dnGrep 5.0.9 (x64)") → fuzzy match. |
| Draftable Desktop | `Draftable.Draftable` | MSI, machine, x64 | Uses
the machine-scope `DraftableDesktopSystem` MSI. **Caveat:** hard winget
dependency on .NET 10 Desktop Runtime — installs fine but won't launch
without it (same class as the BleachBit VCRedist dependency). |
| dRofus | `dRofus.dRofus` | MSI, machine, x64 | Versioned ARP name
("dRofus 2.18") → fuzzy match. |
| Devolutions Launcher | `Devolutions.Launcher` | MSI, machine, x64 |
Distinct ARP identity from the existing Remote Desktop Manager FMA. |
| Devolutions Workspace | `Devolutions.Workspace` | MSI, machine, x64 |
Product renamed: ARP DisplayName is **"Devolutions Password Manager"**
(set as `unique_identifier`). `program_publisher` overridden to
"Devolutions Inc." (capital I) — verified via msiinfo; the
locale-derived lowercase would not match. |
| Delinea Connection Manager | `Delinea.DelineaConnectionManager` | MSI,
machine, x64 | Dual-purpose MSI defaults to **per-user** (ALLUSERS=2 +
MSIINSTALLPERUSER=1); custom install script forces `ALLUSERS=1
MSIINSTALLPERUSER=""`. `program_publisher` = "Delinea Inc.." (double
period, as stored in the MSI). Unversioned URL → `ignore_hash`. |
| DAX Studio | `DaxStudio.DaxStudio` | Inno, machine, x64 | `/ALLUSERS`
for machine scope; versioned ARP name → fuzzy. |
| DevPod | `LoftLabs.DevPod` | MSI, machine, x64 | Uses the WiX MSI
variant (the manifest also has an NSIS per-user one). |
| Directory Opus | `GPSoftware.DirectoryOpus` | Inno, machine, x64 |
Standard Inno silent install/uninstall. |
| DYMO ID | `DYMO.DYMOID` | InstallShield→MSI, machine, x86 | `/S /V"/qn
/norestart"`; uninstall via msiexec by ProductCode. |
| digiSeal Reader | `secrypt.digiSealreader` | EXE (self-extracting),
machine, x86 | `installer_scope: ""` (manifest declares no scope);
`-silent` install, shipped uninstaller with `-silent`. Unversioned URL →
`ignore_hash`. |

Considered but **not** added (recorded in the workstream tracker):
- **Datadog Agent** (`Datadog.Agent`): winget PackageVersion is
`7.81.0.1` but the MSI and registry report `7.81.0.0`, so the patch
policy would flag every install as perpetually outdated.
`use_display_version_for_patch` can't fix it (the manifest has no
`AppsAndFeaturesEntries`); it needs a version-normalizing ingester ref
(like `onepassword_version_shortener`). Deferred pending that helper
(task spawned).
- **Dell Display and Peripheral Manager**
(`Dell.DisplayAndPeripheralManager`, covers both "Dell Display Manager"
and "Dell Peripheral Manager"): the winget-pinned host `dl.dell.com`
returns **403** to non-browser User-Agents, and Fleet's downloader sends
`Go-http-client` (same failure that dropped Crestron AirMedia in letter
C). The `downloads.dell.com` mirror serves the identical path to any UA,
but there's no input field to override the manifest URL. Deferred
pending a downloader User-Agent fix (task spawned — would also unblock
Crestron).
- **Dell EMC System Update** (`Dell.SystemUpdate`): registers its ARP
entry under **HKCU** (per-user) under a SYSTEM install; legacy product
Dell steers users away from (toward Dell Command Update, already an
FMA); firmware/driver DUP bootstrapper.
- **Devolutions Remote Desktop Manager Agent**
(`Devolutions.RemoteDesktopManagerAgent`): legacy/superseded by
"Devolutions Agent" (2026.1); winget manifest frozen at 2025.2.28.0
since Sept 2025; vendor docs page 404s.
- **Dedoose** (`Dedoose.Dedoose`): per-user-only scope, x86,
latest-pointer URL (CloudShow class).
- **Defraggler** (`Piriform.Defraggler`): abandoned (final release 2020,
no winget commits since 2023); legacy defrag tool with an unverified ARP
publisher string.
- **DiRoots ProSheets** (`DiRoots.ProSheets`): validated install but its
Advanced Installer bootstrapper uninstall hung to the timeout and it
drags bundled PDF24 Creator entries into inventory (dropped at
validation).
- **DroidCam Client** (`dev47apps.DroidCam`): NSIS `/S` install hung
headless to the timeout (inline vc_redist); 3DxWare/Citrix headless-hang
class (dropped at validation).

Identities verified per app (msiinfo Property tables; installer
PE/version resources; winget AppsAndFeaturesEntries; uninstall-database
corroboration). Two publisher-casing mismatches (Devolutions Workspace,
Delinea) were caught by direct MSI inspection and fixed with
`program_publisher` before they could silently break the exists queries.
SHAs verified against manifests for pinned URLs; `ignore_hash` used only
where the manifest is demonstrably actively maintained. Icons via
`tools/software/icons/generate-icons.sh` (the pre-existing DataSpell
icon component is reused untouched).

# 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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants