Skip to content

Add Windows FMAs (letter E): 13 apps - #49186

Merged
allenhouchins merged 6 commits into
mainfrom
add-windows-fmas-letter-e
Jul 13, 2026
Merged

Add Windows FMAs (letter E): 13 apps#49186
allenhouchins merged 6 commits into
mainfrom
add-windows-fmas-letter-e

Conversation

@allenhouchins

@allenhouchins allenhouchins commented Jul 13, 2026

Copy link
Copy Markdown
Member

Related issue: N/A — part of the Windows Fleet-maintained apps catalog expansion (letter E batch; follows #48872, #48881, #48950, #48969, #49086).

Adds eleven new Windows Fleet-maintained apps:

App winget package Installer Notes
Eclipse Temurin JDK 8 EclipseAdoptium.Temurin.8.JDK MSI (WiX), machine, x64 Per-major pin.
Eclipse Temurin JDK 11 EclipseAdoptium.Temurin.11.JDK MSI (WiX), machine, x64 Per-major pin.
Eclipse Temurin JDK 17 EclipseAdoptium.Temurin.17.JDK MSI (WiX), machine, x64 Per-major pin.
Eclipse Temurin JDK 21 EclipseAdoptium.Temurin.21.JDK MSI (WiX), machine, x64 Per-major pin.
Eclipse Temurin JRE 8 EclipseAdoptium.Temurin.8.JRE MSI (WiX), machine, x64 Per-major pin.
Eclipse Temurin JRE 11 EclipseAdoptium.Temurin.11.JRE MSI (WiX), machine, x64 Per-major pin.
Eclipse Temurin JRE 17 EclipseAdoptium.Temurin.17.JRE MSI (WiX), machine, x64 Per-major pin.
Eclipse Temurin JRE 21 EclipseAdoptium.Temurin.21.JRE MSI (WiX), machine, x64 Per-major pin.
exacqVision Client ExacqTechnologies.exacqVisionClient MSI, machine, x64 Clean MSI; ARP name exacqVision Client (x64).
Egnyte WebEdit Egnyte.EgnyteWebEdit MSI, machine, x86 Distinct product from the existing Egnyte Desktop FMA (separate ProductCode/UpgradeCode/ARP name).
Elevate UC Serverdata.ElevateUC MSI, machine, x64 Intermedia UC client. Unversioned latest-pointer URL with ~monthly cadence → ignore_hash.

Eclipse Temurin (8 apps). All are clean machine-scope WiX MSIs from Eclipse Adoptium. The ARP DisplayName embeds the full patch version — Eclipse Temurin JDK with Hotspot 17.0.19+10 (x64) — and JDK/JRE of the same major share a version prefix, so each major is pinned with an exists_query that combines the JDK-vs-JRE name prefix, the publisher, and a major version filter, e.g.:

SELECT 1 FROM programs WHERE name LIKE 'Eclipse Temurin JDK%' AND publisher = 'Eclipse Adoptium' AND version LIKE '17.%';

The JDK/JRE token in the name prefix keeps a JDK install from matching the JRE FMA and vice-versa; the version LIKE '<major>.%' keeps each major distinct. This mirrors the existing Amazon Corretto per-major FMAs. Identities (DisplayName, publisher Eclipse Adoptium, 4-part ProductVersion) were verified via msiinfo on the real x64 MSIs.

Considered but not added (recorded in the workstream tracker):

  • ESET Endpoint Antivirus (ESET.EndpointAntivirus) and ESET Endpoint Security (ESET.EndpointSecurity): the install succeeds headless without a license, but uninstall is Self-Defense (HIPS) protected — it requires a reboot to complete and is widely documented to fail unattended (needing the ESET Uninstaller Tool in Safe Mode), so a reliable silent SYSTEM-context removal can't be guaranteed. They're also managed enterprise agents meant for central ESET PROTECT deployment (standalone installs land unactivated and disable Windows Defender).

Still to verify (not in this PR): EndNote, Enpass, Evernote, and UltraISO — their verification pass was interrupted and will be handled separately.

Identities verified via msiinfo Property tables. SHAs verified against manifests for pinned URLs; ignore_hash used only for Elevate UC's actively-maintained latest-pointer URL. Icons via tools/software/icons/generate-icons.sh.

Checklist for submitter

  • 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

Testing

  • QA'd all new/changed functionality manually (relying on the FMA CI validator for Windows install/uninstall validation)

Summary by CodeRabbit

  • New Features
    • Added Windows software support for Eclipse Temurin JDK and JRE versions 8, 11, 17, and 21.
    • Added support for Egnyte WebEdit, Elevate UC, EndNote, Enpass, and Evernote.
    • Enabled installation, upgrade detection, and uninstallation workflows for the newly supported applications.
    • Added recognizable software icons for the new applications in the software catalog.

Eclipse Temurin JDK 8/11/17/21, Eclipse Temurin JRE 8/11/17/21,
exacqVision Client, Egnyte WebEdit, Elevate UC.
fleet-release
fleet-release previously approved these changes Jul 13, 2026
@codecov

codecov Bot commented Jul 13, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 50.00000% with 11 lines in your changes missing coverage. Please review.
✅ Project coverage is 67.93%. Comparing base (2d2b6e4) to head (faabaa1).
⚠️ Report is 23 commits behind head on main.

Files with missing lines Patch % Lines
...twarePage/components/icons/EclipseTemurinJdk11.tsx 50.00% 1 Missing ⚠️
...twarePage/components/icons/EclipseTemurinJdk17.tsx 50.00% 1 Missing ⚠️
...twarePage/components/icons/EclipseTemurinJdk21.tsx 50.00% 1 Missing ⚠️
...ftwarePage/components/icons/EclipseTemurinJdk8.tsx 50.00% 1 Missing ⚠️
...twarePage/components/icons/EclipseTemurinJre11.tsx 50.00% 1 Missing ⚠️
...twarePage/components/icons/EclipseTemurinJre17.tsx 50.00% 1 Missing ⚠️
...twarePage/components/icons/EclipseTemurinJre21.tsx 50.00% 1 Missing ⚠️
...ftwarePage/components/icons/EclipseTemurinJre8.tsx 50.00% 1 Missing ⚠️
...es/SoftwarePage/components/icons/EgnyteWebedit.tsx 50.00% 1 Missing ⚠️
.../pages/SoftwarePage/components/icons/ElevateUc.tsx 50.00% 1 Missing ⚠️
... and 1 more
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #49186      +/-   ##
==========================================
- Coverage   67.93%   67.93%   -0.01%     
==========================================
  Files        3764     3776      +12     
  Lines      238273   238347      +74     
  Branches    12452    12614     +162     
==========================================
+ Hits       161868   161917      +49     
- Misses      61772    61797      +25     
  Partials    14633    14633              
Flag Coverage Δ
frontend 59.36% <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.

The default upgrade-code MSI uninstall returned success but left the product
registered (running client processes/services caused msiexec to roll back the
removal). Custom uninstall now stops anything running from the install dir
plus known exacqVision process/service names, then uninstalls by the
ProductCode from the registry and verifies.
fleet-release
fleet-release previously approved these changes Jul 13, 2026
@allenhouchins

Copy link
Copy Markdown
Member Author

exacqVision Client uninstall fixed (19298bd). Validation showed install + detection passing but the app still present after uninstall: the default upgrade-code MSI uninstall returned a success code yet left the product registered, because the just-installed client's processes/services held files and msiexec rolled the removal back. Added a custom uninstall that stops anything running from the install dir (plus known exacqVision process/service names), then uninstalls by the ProductCode looked up from the registry. The other 10 apps in this PR passed; the one Egnyte WebEdit 'warning' is the benign no-new-Program-Files-dir notice (x86 install path).

@github-actions

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-17/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-21/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-8/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-11/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-17/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-21/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json

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

ee/maintained-apps/outputs/egnyte-webedit/windows.json

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

ee/maintained-apps/outputs/elevate-uc/windows.json

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

ee/maintained-apps/outputs/exacqvision-client/windows.json

=== Install Script (no changes) ===
=== Uninstall // a8642685 -> 877944c4 ===

--- /tmp/old.0alptw	2026-07-13 01:44:29.777815116 +0000
+++ /tmp/new.EiSVdU	2026-07-13 01:44:29.777815116 +0000
@@ -1,28 +1,73 @@
-# Fleet uninstalls app by finding all related product codes for the specified upgrade code
-$inst = New-Object -ComObject "WindowsInstaller.Installer"
-$timeoutSeconds = 300  # 5 minute timeout per product
+# Uninstalls exacqVision Client.
+#
+# The default upgrade-code MSI uninstall returned a success code but left the
+# product registered, because the just-installed client's processes/services
+# hold files and msiexec rolls the removal back. So we stop anything running
+# from the install dir first, then uninstall by the ProductCode looked up from
+# the registry (DisplayName "exacqVision Client (x64)"), and verify it's gone.
 
-# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
-# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$softwareName = "exacqVision Client (x64)"
+
+$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
+$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
+
+# 0 = success; 3010/1641 = success but reboot required.
 $successCodes = @(0, 3010, 1641)
+$exitCode = $null
+
+try {
+
+[array]$uninstallKeys = Get-ChildItem `
+    -Path @($machineKey, $machineKey32on64) `
+    -ErrorAction SilentlyContinue |
+        ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }
+
+$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1
+
+if (-not $selected) {
+    Write-Host "Uninstall entry not found for '$softwareName'."
+    Exit 1
+}
 
-foreach ($product_code in $inst.RelatedProducts('{9F63FCC6-07FA-48B8-A4B0-F31364C18DAF}')) {
-    $process = Start-Process msiexec -ArgumentList @("/quiet", "/x", $product_code, "/norestart") -PassThru
+# Stop exacqVision processes/services so the MSI uninstall isn't rolled back by
+# locked files. Best-effort: everything running from the install location, plus
+# known service/process names.
+if ($selected.InstallLocation -and (Test-Path -LiteralPath $selected.InstallLocation)) {
+    $loc = $selected.InstallLocation.TrimEnd('\')
+    Get-Process | Where-Object { $_.Path -and $_.Path -like "$loc\*" } |
+        ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue }
+}
+foreach ($p in @("exacqVisionClient", "evClient", "exacqVision", "edvrService")) {
+    Stop-Process -Name $p -Force -ErrorAction SilentlyContinue
+}
+foreach ($svc in @("edvrserver", "exacqVisionServer")) {
+    Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
+}
+Start-Sleep -Seconds 3
 
-    # Wait for process with timeout
-    $completed = $process.WaitForExit($timeoutSeconds * 1000)
+# ProductCode is the uninstall subkey name for an MSI.
+$productCode = $selected.PSChildName
+if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') {
+    # Fall back to parsing the UninstallString.
+    $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
+}
 
-    if (-not $completed) {
-        Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue
-        Exit 1603  # ERROR_UNINSTALL_FAILURE
-    }
-
-    # If the uninstall failed, bail
-    if ($successCodes -notcontains $process.ExitCode) {
-        Write-Output "Uninstall for $($product_code) exited $($process.ExitCode)"
-        Exit $process.ExitCode
-    }
+Write-Host "Uninstalling product code: $productCode"
+$process = Start-Process -FilePath "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
 }
 
-# All uninstalls succeeded; exit success
-Exit 0
+if ($successCodes -contains $exitCode) { Exit 0 }
+Exit $exitCode

Completes the E3 verification group (re-run after the earlier agent was
killed). UltraISO dropped: unmaintained winget manifest (last commit 2023)
and winget version '9.76' does not version_compare against the installed
ARP version 9.7.6.38xx.
@allenhouchins allenhouchins changed the title Add Windows FMAs (letter E): 11 apps Add Windows FMAs (letter E): 14 apps Jul 13, 2026
@allenhouchins

Copy link
Copy Markdown
Member Author

Added EndNote, Enpass, Evernote (34bc668) — completes the E3 group whose verification agent was interrupted earlier. Letter E is now 14 apps. UltraISO dropped: its winget manifest is unmaintained (last commit 2023) and the winget version 9.76 doesn't version_compare against the installed ARP version 9.7.6.38xx (would perpetually flag 'update available'). Notes: EndNote uses fuzzy EndNote 20% so it survives year-edition bumps; Enpass is a burn bundle (visible bundle ARP, hidden inner MSI); Evernote installs machine-scope via /allusers /S (electron-builder). Enpass/Evernote reuse the existing icon components from their macOS FMAs.

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

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-17/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-21/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-8/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-11/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-17/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-21/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json

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

ee/maintained-apps/outputs/egnyte-webedit/windows.json

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

ee/maintained-apps/outputs/elevate-uc/windows.json

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

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

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

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

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

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

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

ee/maintained-apps/outputs/exacqvision-client/windows.json

=== Install Script (no changes) ===
=== Uninstall // a8642685 -> 877944c4 ===

--- /tmp/old.rAL1so	2026-07-13 02:04:20.288135299 +0000
+++ /tmp/new.07o3AS	2026-07-13 02:04:20.289135304 +0000
@@ -1,28 +1,73 @@
-# Fleet uninstalls app by finding all related product codes for the specified upgrade code
-$inst = New-Object -ComObject "WindowsInstaller.Installer"
-$timeoutSeconds = 300  # 5 minute timeout per product
+# Uninstalls exacqVision Client.
+#
+# The default upgrade-code MSI uninstall returned a success code but left the
+# product registered, because the just-installed client's processes/services
+# hold files and msiexec rolls the removal back. So we stop anything running
+# from the install dir first, then uninstall by the ProductCode looked up from
+# the registry (DisplayName "exacqVision Client (x64)"), and verify it's gone.
 
-# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,
-# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.
+$softwareName = "exacqVision Client (x64)"
+
+$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
+$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
+
+# 0 = success; 3010/1641 = success but reboot required.
 $successCodes = @(0, 3010, 1641)
+$exitCode = $null
+
+try {
+
+[array]$uninstallKeys = Get-ChildItem `
+    -Path @($machineKey, $machineKey32on64) `
+    -ErrorAction SilentlyContinue |
+        ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }
+
+$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1
+
+if (-not $selected) {
+    Write-Host "Uninstall entry not found for '$softwareName'."
+    Exit 1
+}
 
-foreach ($product_code in $inst.RelatedProducts('{9F63FCC6-07FA-48B8-A4B0-F31364C18DAF}')) {
-    $process = Start-Process msiexec -ArgumentList @("/quiet", "/x", $product_code, "/norestart") -PassThru
+# Stop exacqVision processes/services so the MSI uninstall isn't rolled back by
+# locked files. Best-effort: everything running from the install location, plus
+# known service/process names.
+if ($selected.InstallLocation -and (Test-Path -LiteralPath $selected.InstallLocation)) {
+    $loc = $selected.InstallLocation.TrimEnd('\')
+    Get-Process | Where-Object { $_.Path -and $_.Path -like "$loc\*" } |
+        ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue }
+}
+foreach ($p in @("exacqVisionClient", "evClient", "exacqVision", "edvrService")) {
+    Stop-Process -Name $p -Force -ErrorAction SilentlyContinue
+}
+foreach ($svc in @("edvrserver", "exacqVisionServer")) {
+    Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
+}
+Start-Sleep -Seconds 3
 
-    # Wait for process with timeout
-    $completed = $process.WaitForExit($timeoutSeconds * 1000)
+# ProductCode is the uninstall subkey name for an MSI.
+$productCode = $selected.PSChildName
+if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') {
+    # Fall back to parsing the UninstallString.
+    $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
+}
 
-    if (-not $completed) {
-        Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue
-        Exit 1603  # ERROR_UNINSTALL_FAILURE
-    }
-
-    # If the uninstall failed, bail
-    if ($successCodes -notcontains $process.ExitCode) {
-        Write-Output "Uninstall for $($product_code) exited $($process.ExitCode)"
-        Exit $process.ExitCode
-    }
+Write-Host "Uninstalling product code: $productCode"
+$process = Start-Process -FilePath "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
 }
 
-# All uninstalls succeeded; exit success
-Exit 0
+if ($successCodes -contains $exitCode) { Exit 0 }
+Exit $exitCode

Evernote: electron-builder appends version + ' (All Users)' to the machine-scope
ARP DisplayName ('Evernote 11.24.3 (All Users)'), so the exact 'Evernote' exists
query would never match on real hosts and the uninstall couldn't find the entry.
Now uses fuzzy 'Evernote% (All Users)' and the uninstall matches that shape.

exacqVision: the DisplayName->PSChildName ProductCode lookup couldn't extract a
GUID. Reverted to resolving ProductCode(s) via the stable UpgradeCode
(RelatedProducts) which reliably finds the product, but now stops the client's
processes/services first so msiexec doesn't roll the removal back.
fleet-release
fleet-release previously approved these changes Jul 13, 2026
@allenhouchins

Copy link
Copy Markdown
Member Author

Fixed Evernote + exacqVision (7a16e1b) — the other 12 apps passed.

  • Evernote: the machine-scope electron-builder install registers the ARP DisplayName as Evernote 11.24.3 (All Users) (version + ' (All Users)' suffix), so the exact name = 'Evernote' exists query would never match on real hosts (validation only passed detection via a looser search) and the uninstall couldn't find the entry. Now uses fuzzy Evernote% (All Users) for both.
  • exacqVision Client: my previous fix looked up the ProductCode via the registry DisplayName→subkey, which couldn't yield a GUID. Reverted to resolving the ProductCode via the stable UpgradeCode (RelatedProducts) — which reliably finds the product — but now stops the client's processes/services first so msiexec doesn't roll the removal back (the root cause of the original failure).

@github-actions

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-17/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-21/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-8/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-11/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-17/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-21/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json

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

ee/maintained-apps/outputs/egnyte-webedit/windows.json

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

ee/maintained-apps/outputs/elevate-uc/windows.json

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

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

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

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

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

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

=== Install Script (no changes) ===
=== Uninstall // 624c3267 -> c443670d ===

--- /tmp/old.Z2fPfE	2026-07-13 14:23:30.880513501 +0000
+++ /tmp/new.ahTgP3	2026-07-13 14:23:30.880513501 +0000
@@ -1,11 +1,12 @@
 # Fleet extracts name from installer (EXE) and saves it to PACKAGE_ID
 # variable
-# Evernote (electron-builder NSIS) registers DisplayName "Evernote" in HKLM
-# when installed with /allusers. Its QuietUninstallString runs
-# "Uninstall Evernote.exe" /allusers /S, which also closes the running tray app.
+# Evernote (electron-builder NSIS) registers a versioned, All-Users-suffixed
+# DisplayName in HKLM when installed with /allusers, e.g.
+# "Evernote 11.24.3 (All Users)". Match on that shape. Its QuietUninstallString
+# runs "Uninstall Evernote.exe" /allusers /S, which also closes the tray app.
 $softwareName = "Evernote"
 
-$softwareNameLike = "Evernote"
+$softwareNameLike = "Evernote* (All Users)"
 
 # electron-builder NSIS uninstaller; /allusers matches the machine-wide install
 $uninstallArgs = "/allusers /S"

ee/maintained-apps/outputs/exacqvision-client/windows.json

=== Install Script (no changes) ===
=== Uninstall // 877944c4 -> 1d457ca7 ===

--- /tmp/old.h0bdNK	2026-07-13 14:23:30.932513778 +0000
+++ /tmp/new.Em88e8	2026-07-13 14:23:30.932513778 +0000
@@ -1,39 +1,27 @@
 # Uninstalls exacqVision Client.
 #
-# The default upgrade-code MSI uninstall returned a success code but left the
-# product registered, because the just-installed client's processes/services
+# The default upgrade-code uninstall found the product but returned success
+# while leaving it registered, because the just-installed client's processes
 # hold files and msiexec rolls the removal back. So we stop anything running
-# from the install dir first, then uninstall by the ProductCode looked up from
-# the registry (DisplayName "exacqVision Client (x64)"), and verify it's gone.
+# from the install dir (plus known process/service names) FIRST, then resolve
+# the ProductCode(s) via the stable UpgradeCode and msiexec /x each.
 
-$softwareName = "exacqVision Client (x64)"
+$upgradeCode = '{9F63FCC6-07FA-48B8-A4B0-F31364C18DAF}'
+$softwareName = 'exacqVision Client (x64)'
+$successCodes = @(0, 3010, 1641)
 
 $machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
 $machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
 
-# 0 = success; 3010/1641 = success but reboot required.
-$successCodes = @(0, 3010, 1641)
-$exitCode = $null
-
 try {
 
-[array]$uninstallKeys = Get-ChildItem `
-    -Path @($machineKey, $machineKey32on64) `
-    -ErrorAction SilentlyContinue |
-        ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }
-
-$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1
-
-if (-not $selected) {
-    Write-Host "Uninstall entry not found for '$softwareName'."
-    Exit 1
-}
-
 # Stop exacqVision processes/services so the MSI uninstall isn't rolled back by
-# locked files. Best-effort: everything running from the install location, plus
-# known service/process names.
-if ($selected.InstallLocation -and (Test-Path -LiteralPath $selected.InstallLocation)) {
-    $loc = $selected.InstallLocation.TrimEnd('\')
+# 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 }
 }
@@ -45,29 +33,26 @@
 }
 Start-Sleep -Seconds 3
 
-# ProductCode is the uninstall subkey name for an MSI.
-$productCode = $selected.PSChildName
-if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') {
-    # Fall back to parsing the UninstallString.
-    $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'."
+# 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
 }
 
-Write-Host "Uninstalling product code: $productCode"
-$process = Start-Process -FilePath "msiexec.exe" `
-    -ArgumentList "/x $productCode /qn /norestart" `
-    -NoNewWindow -PassThru -Wait
-$exitCode = $process.ExitCode
-Write-Host "Uninstall exit code: $exitCode"
+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
 }
-
-if ($successCodes -contains $exitCode) { Exit 0 }
-Exit $exitCode

The ' (All Users)' suffix electron-builder adds to the machine-scope ARP
DisplayName is locale-dependent, so an English-only 'Evernote% (All Users)'
pattern would miss non-English hosts. Match on the 'Evernote' prefix only;
the publisher = 'Evernote Corporation' clause guards against false positives.
fleet-release
fleet-release previously approved these changes Jul 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-17/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-21/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-8/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-11/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-17/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-21/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json

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

ee/maintained-apps/outputs/egnyte-webedit/windows.json

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

ee/maintained-apps/outputs/elevate-uc/windows.json

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

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

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

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

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

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

=== Install Script (no changes) ===
=== Uninstall // c443670d -> d4142835 ===

--- /tmp/old.gf0F9X	2026-07-13 14:24:57.052187893 +0000
+++ /tmp/new.Orujis	2026-07-13 14:24:57.052187893 +0000
@@ -1,12 +1,13 @@
 # Fleet extracts name from installer (EXE) and saves it to PACKAGE_ID
 # variable
-# Evernote (electron-builder NSIS) registers a versioned, All-Users-suffixed
-# DisplayName in HKLM when installed with /allusers, e.g.
-# "Evernote 11.24.3 (All Users)". Match on that shape. Its QuietUninstallString
-# runs "Uninstall Evernote.exe" /allusers /S, which also closes the tray app.
+# Evernote (electron-builder NSIS) registers a versioned DisplayName in HKLM
+# when installed with /allusers, e.g. "Evernote 11.24.3 (All Users)". The
+# "(All Users)" suffix is locale-dependent, so match on the "Evernote" prefix
+# only. Its QuietUninstallString runs "Uninstall Evernote.exe" /allusers /S,
+# which also closes the running tray app.
 $softwareName = "Evernote"
 
-$softwareNameLike = "Evernote* (All Users)"
+$softwareNameLike = "Evernote*"
 
 # electron-builder NSIS uninstaller; /allusers matches the machine-wide install
 $uninstallArgs = "/allusers /S"

ee/maintained-apps/outputs/exacqvision-client/windows.json

=== Install Script (no changes) ===
=== Uninstall // 877944c4 -> 1d457ca7 ===

--- /tmp/old.lKMxw2	2026-07-13 14:24:57.115187848 +0000
+++ /tmp/new.AfceEt	2026-07-13 14:24:57.116187848 +0000
@@ -1,39 +1,27 @@
 # Uninstalls exacqVision Client.
 #
-# The default upgrade-code MSI uninstall returned a success code but left the
-# product registered, because the just-installed client's processes/services
+# The default upgrade-code uninstall found the product but returned success
+# while leaving it registered, because the just-installed client's processes
 # hold files and msiexec rolls the removal back. So we stop anything running
-# from the install dir first, then uninstall by the ProductCode looked up from
-# the registry (DisplayName "exacqVision Client (x64)"), and verify it's gone.
+# from the install dir (plus known process/service names) FIRST, then resolve
+# the ProductCode(s) via the stable UpgradeCode and msiexec /x each.
 
-$softwareName = "exacqVision Client (x64)"
+$upgradeCode = '{9F63FCC6-07FA-48B8-A4B0-F31364C18DAF}'
+$softwareName = 'exacqVision Client (x64)'
+$successCodes = @(0, 3010, 1641)
 
 $machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
 $machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
 
-# 0 = success; 3010/1641 = success but reboot required.
-$successCodes = @(0, 3010, 1641)
-$exitCode = $null
-
 try {
 
-[array]$uninstallKeys = Get-ChildItem `
-    -Path @($machineKey, $machineKey32on64) `
-    -ErrorAction SilentlyContinue |
-        ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }
-
-$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1
-
-if (-not $selected) {
-    Write-Host "Uninstall entry not found for '$softwareName'."
-    Exit 1
-}
-
 # Stop exacqVision processes/services so the MSI uninstall isn't rolled back by
-# locked files. Best-effort: everything running from the install location, plus
-# known service/process names.
-if ($selected.InstallLocation -and (Test-Path -LiteralPath $selected.InstallLocation)) {
-    $loc = $selected.InstallLocation.TrimEnd('\')
+# 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 }
 }
@@ -45,29 +33,26 @@
 }
 Start-Sleep -Seconds 3
 
-# ProductCode is the uninstall subkey name for an MSI.
-$productCode = $selected.PSChildName
-if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') {
-    # Fall back to parsing the UninstallString.
-    $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'."
+# 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
 }
 
-Write-Host "Uninstalling product code: $productCode"
-$process = Start-Process -FilePath "msiexec.exe" `
-    -ArgumentList "/x $productCode /qn /norestart" `
-    -NoNewWindow -PassThru -Wait
-$exitCode = $process.ExitCode
-Write-Host "Uninstall exit code: $exitCode"
+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
 }
-
-if ($successCodes -contains $exitCode) { Exit 0 }
-Exit $exitCode

Even with the client's processes/services stopped and the ProductCode resolved
via UpgradeCode (RelatedProducts), msiexec /x returns success but the product
remains registered — a self-restarting service/watchdog is holding files. Not
reliably removable in a headless SYSTEM context; deferred.
@allenhouchins allenhouchins changed the title Add Windows FMAs (letter E): 14 apps Add Windows FMAs (letter E): 13 apps Jul 13, 2026
@allenhouchins

Copy link
Copy Markdown
Member Author

Validation clean at 13 apps (faabaa1). All Temurin JDK/JRE (8), Egnyte WebEdit, Elevate UC, EndNote, Enpass, and Evernote pass install + uninstall. exacqVision Client dropped: its MSI uninstall rolls back even after stopping the client's processes/services and resolving the ProductCode via UpgradeCode (RelatedProducts) — msiexec /x returns success but the product stays registered, so a self-restarting service/watchdog is holding files. Not reliably removable in a headless SYSTEM context; deferred in the tracker.

@github-actions

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-17/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-21/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-8/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-11/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-17/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-21/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json

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

ee/maintained-apps/outputs/egnyte-webedit/windows.json

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

ee/maintained-apps/outputs/elevate-uc/windows.json

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

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

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

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

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

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

=== Install Script (no changes) ===
=== Uninstall // c443670d -> d4142835 ===

--- /tmp/old.byGllj	2026-07-13 14:34:09.555588539 +0000
+++ /tmp/new.wQ7drv	2026-07-13 14:34:09.555588539 +0000
@@ -1,12 +1,13 @@
 # Fleet extracts name from installer (EXE) and saves it to PACKAGE_ID
 # variable
-# Evernote (electron-builder NSIS) registers a versioned, All-Users-suffixed
-# DisplayName in HKLM when installed with /allusers, e.g.
-# "Evernote 11.24.3 (All Users)". Match on that shape. Its QuietUninstallString
-# runs "Uninstall Evernote.exe" /allusers /S, which also closes the tray app.
+# Evernote (electron-builder NSIS) registers a versioned DisplayName in HKLM
+# when installed with /allusers, e.g. "Evernote 11.24.3 (All Users)". The
+# "(All Users)" suffix is locale-dependent, so match on the "Evernote" prefix
+# only. Its QuietUninstallString runs "Uninstall Evernote.exe" /allusers /S,
+# which also closes the running tray app.
 $softwareName = "Evernote"
 
-$softwareNameLike = "Evernote* (All Users)"
+$softwareNameLike = "Evernote*"
 
 # electron-builder NSIS uninstaller; /allusers matches the machine-wide install
 $uninstallArgs = "/allusers /S"

@coderabbitai

coderabbitai Bot commented Jul 13, 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: a384d996-946d-4165-ad04-fda0427f5ac5

📥 Commits

Reviewing files that changed from the base of the PR and between 2299f02 and faabaa1.

⛔ Files ignored due to path filters (11)
  • website/assets/images/app-icon-eclipse-temurin-jdk-11-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-eclipse-temurin-jdk-17-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-eclipse-temurin-jdk-21-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-eclipse-temurin-jdk-8-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-eclipse-temurin-jre-11-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-eclipse-temurin-jre-17-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-eclipse-temurin-jre-21-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-eclipse-temurin-jre-8-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-egnyte-webedit-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-elevate-uc-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-endnote-60x60@2x.png is excluded by !**/*.png
📒 Files selected for processing (43)
  • ee/maintained-apps/inputs/winget/eclipse-temurin-jdk-11.json
  • ee/maintained-apps/inputs/winget/eclipse-temurin-jdk-17.json
  • ee/maintained-apps/inputs/winget/eclipse-temurin-jdk-21.json
  • ee/maintained-apps/inputs/winget/eclipse-temurin-jdk-8.json
  • ee/maintained-apps/inputs/winget/eclipse-temurin-jre-11.json
  • ee/maintained-apps/inputs/winget/eclipse-temurin-jre-17.json
  • ee/maintained-apps/inputs/winget/eclipse-temurin-jre-21.json
  • ee/maintained-apps/inputs/winget/eclipse-temurin-jre-8.json
  • ee/maintained-apps/inputs/winget/egnyte-webedit.json
  • ee/maintained-apps/inputs/winget/elevate-uc.json
  • ee/maintained-apps/inputs/winget/endnote.json
  • ee/maintained-apps/inputs/winget/enpass.json
  • ee/maintained-apps/inputs/winget/evernote.json
  • ee/maintained-apps/inputs/winget/scripts/enpass_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/enpass_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/evernote_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/evernote_uninstall.ps1
  • ee/maintained-apps/outputs/apps.json
  • ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jdk-17/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jdk-21/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jdk-8/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jre-11/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jre-17/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jre-21/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json
  • ee/maintained-apps/outputs/egnyte-webedit/windows.json
  • ee/maintained-apps/outputs/elevate-uc/windows.json
  • ee/maintained-apps/outputs/endnote/windows.json
  • ee/maintained-apps/outputs/enpass/windows.json
  • ee/maintained-apps/outputs/evernote/windows.json
  • frontend/pages/SoftwarePage/components/icons/EclipseTemurinJdk11.tsx
  • frontend/pages/SoftwarePage/components/icons/EclipseTemurinJdk17.tsx
  • frontend/pages/SoftwarePage/components/icons/EclipseTemurinJdk21.tsx
  • frontend/pages/SoftwarePage/components/icons/EclipseTemurinJdk8.tsx
  • frontend/pages/SoftwarePage/components/icons/EclipseTemurinJre11.tsx
  • frontend/pages/SoftwarePage/components/icons/EclipseTemurinJre17.tsx
  • frontend/pages/SoftwarePage/components/icons/EclipseTemurinJre21.tsx
  • frontend/pages/SoftwarePage/components/icons/EclipseTemurinJre8.tsx
  • frontend/pages/SoftwarePage/components/icons/EgnyteWebedit.tsx
  • frontend/pages/SoftwarePage/components/icons/ElevateUc.tsx
  • frontend/pages/SoftwarePage/components/icons/Endnote.tsx
  • frontend/pages/SoftwarePage/components/icons/index.ts

Walkthrough

Adds Windows maintained-app inputs and deployment manifests for Eclipse Temurin JDK/JRE variants, Egnyte WebEdit, Elevate UC, EndNote, Enpass, and Evernote. The change includes MSI and executable installation metadata, detection queries, upgrade codes, embedded PowerShell workflows, and app catalog records. It also adds SoftwarePage icon components and fuzzy name mappings for the new applications.

Possibly related PRs

  • fleetdm/fleet#49086: Adds Windows app entries, icon components, and mappings through the same SoftwarePage icon mechanism.
  • fleetdm/fleet#48995: Extends SOFTWARE_NAME_TO_ICON_MAP with additional maintained-app icon mappings.
  • fleetdm/fleet#47174: Adds React software icons and registers them in the shared icon mapping.
✨ 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-e

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.

@allenhouchins
allenhouchins marked this pull request as ready for review July 13, 2026 14:59
@allenhouchins
allenhouchins requested a review from a team as a code owner July 13, 2026 14:59
Copilot AI review requested due to automatic review settings July 13, 2026 14:59
@fleet-release
fleet-release requested a review from eashaw July 13, 2026 14:59
@allenhouchins
allenhouchins merged commit 7ac8c65 into main Jul 13, 2026
30 checks passed
@allenhouchins
allenhouchins deleted the add-windows-fmas-letter-e branch July 13, 2026 14:59
Copilot stopped reviewing on behalf of allenhouchins due to an error July 13, 2026 14:59

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

Note

Copilot was unable to run its full agentic suite in this review.

Adds new maintained Windows apps (Winget-driven) and corresponding frontend icons so newly supported software can display the correct icon and be installable/uninstallable via Fleet.

Changes:

  • Added new Windows maintained-app definitions for Evernote, Enpass, EndNote, Elevate UC, Egnyte WebEdit, and Eclipse Temurin JDK/JRE (multiple versions).
  • Added new frontend icon components and expanded the software-name-to-icon mapping to include the new apps.
  • Added Winget install/uninstall PowerShell scripts for Evernote and Enpass.

Reviewed changes

Copilot reviewed 43 out of 54 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
frontend/pages/SoftwarePage/components/icons/index.ts Registers new icon imports and name→icon mappings for newly added apps.
frontend/pages/SoftwarePage/components/icons/Endnote.tsx Adds EndNote icon component (embedded base64 image).
frontend/pages/SoftwarePage/components/icons/ElevateUc.tsx Adds Elevate UC icon component (embedded base64 image).
frontend/pages/SoftwarePage/components/icons/EgnyteWebedit.tsx Adds Egnyte WebEdit icon component (embedded base64 image).
frontend/pages/SoftwarePage/components/icons/EclipseTemurinJre8.tsx Adds Eclipse Temurin JRE 8 icon component (embedded base64 image).
frontend/pages/SoftwarePage/components/icons/EclipseTemurinJre21.tsx Adds Eclipse Temurin JRE 21 icon component (embedded base64 image).
frontend/pages/SoftwarePage/components/icons/EclipseTemurinJre17.tsx Adds Eclipse Temurin JRE 17 icon component (embedded base64 image).
frontend/pages/SoftwarePage/components/icons/EclipseTemurinJre11.tsx Adds Eclipse Temurin JRE 11 icon component (embedded base64 image).
frontend/pages/SoftwarePage/components/icons/EclipseTemurinJdk8.tsx Adds Eclipse Temurin JDK 8 icon component (embedded base64 image).
ee/maintained-apps/outputs/evernote/windows.json Adds generated Evernote Windows manifest including install/uninstall scripts.
ee/maintained-apps/outputs/enpass/windows.json Adds generated Enpass Windows manifest including install/uninstall scripts.
ee/maintained-apps/outputs/endnote/windows.json Adds generated EndNote Windows manifest (MSI) with upgrade code-based uninstall.
ee/maintained-apps/outputs/elevate-uc/windows.json Adds generated Elevate UC Windows manifest (MSI) with upgrade code-based uninstall.
ee/maintained-apps/outputs/egnyte-webedit/windows.json Adds generated Egnyte WebEdit Windows manifest (MSI) with upgrade code-based uninstall.
ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json Adds generated Eclipse Temurin JRE 8 Windows manifest (MSI).
ee/maintained-apps/outputs/eclipse-temurin-jre-21/windows.json Adds generated Eclipse Temurin JRE 21 Windows manifest (MSI).
ee/maintained-apps/outputs/eclipse-temurin-jre-17/windows.json Adds generated Eclipse Temurin JRE 17 Windows manifest (MSI).
ee/maintained-apps/outputs/eclipse-temurin-jre-11/windows.json Adds generated Eclipse Temurin JRE 11 Windows manifest (MSI).
ee/maintained-apps/outputs/eclipse-temurin-jdk-8/windows.json Adds generated Eclipse Temurin JDK 8 Windows manifest (MSI).
ee/maintained-apps/outputs/eclipse-temurin-jdk-21/windows.json Adds generated Eclipse Temurin JDK 21 Windows manifest (MSI).
ee/maintained-apps/outputs/eclipse-temurin-jdk-17/windows.json Adds generated Eclipse Temurin JDK 17 Windows manifest (MSI).
ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json Adds generated Eclipse Temurin JDK 11 Windows manifest (MSI).
ee/maintained-apps/outputs/apps.json Registers new apps in the global maintained-apps index.
ee/maintained-apps/inputs/winget/scripts/evernote_uninstall.ps1 Adds Evernote uninstall script for machine-wide NSIS install.
ee/maintained-apps/inputs/winget/scripts/evernote_install.ps1 Adds Evernote install script for machine-wide NSIS install.
ee/maintained-apps/inputs/winget/scripts/enpass_uninstall.ps1 Adds Enpass uninstall script (Burn bundle/MSI fallback).
ee/maintained-apps/inputs/winget/scripts/enpass_install.ps1 Adds Enpass install script (Burn bundle switches).
ee/maintained-apps/inputs/winget/evernote.json Adds Winget input definition for Evernote (Windows).
ee/maintained-apps/inputs/winget/enpass.json Adds Winget input definition for Enpass (Windows).
ee/maintained-apps/inputs/winget/endnote.json Adds Winget input definition for EndNote (Windows).
ee/maintained-apps/inputs/winget/elevate-uc.json Adds Winget input definition for Elevate UC (Windows).
ee/maintained-apps/inputs/winget/egnyte-webedit.json Adds Winget input definition for Egnyte WebEdit (Windows).
ee/maintained-apps/inputs/winget/eclipse-temurin-jre-8.json Adds Winget input definition for Eclipse Temurin JRE 8 (Windows).
ee/maintained-apps/inputs/winget/eclipse-temurin-jre-21.json Adds Winget input definition for Eclipse Temurin JRE 21 (Windows).
ee/maintained-apps/inputs/winget/eclipse-temurin-jre-17.json Adds Winget input definition for Eclipse Temurin JRE 17 (Windows).
ee/maintained-apps/inputs/winget/eclipse-temurin-jre-11.json Adds Winget input definition for Eclipse Temurin JRE 11 (Windows).
ee/maintained-apps/inputs/winget/eclipse-temurin-jdk-8.json Adds Winget input definition for Eclipse Temurin JDK 8 (Windows).
ee/maintained-apps/inputs/winget/eclipse-temurin-jdk-21.json Adds Winget input definition for Eclipse Temurin JDK 21 (Windows).
ee/maintained-apps/inputs/winget/eclipse-temurin-jdk-17.json Adds Winget input definition for Eclipse Temurin JDK 17 (Windows).
ee/maintained-apps/inputs/winget/eclipse-temurin-jdk-11.json Adds Winget input definition for Eclipse Temurin JDK 11 (Windows).
Comments suppressed due to low confidence (2)

frontend/pages/SoftwarePage/components/icons/Endnote.tsx:1

  • The icon components embed large base64 PNG payloads inline. This bloats the JS bundle (and parsing time) for any page that imports these icons. Consider storing icons as optimized SVG path data (preferred), or as static image assets (e.g., in public/ or imported files) loaded by URL, and keep the React component lightweight.
    frontend/pages/SoftwarePage/components/icons/index.ts:1
  • These variants appear to be the same vendor logo rendered as separate components and mapped eight times. If the icons are identical, prefer a single shared icon component (e.g., EclipseTemurin) and map all these names to that one component. That reduces duplication and avoids repeated base64 payloads in the bundle.

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

Comment on lines +6 to +7
"exists": "SELECT 1 FROM programs WHERE name LIKE 'EndNote 20%' AND publisher = 'Clarivate Analytics';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'EndNote 20%' AND publisher = 'Clarivate Analytics' AND version_compare(version, '22.3.1.19926') < 0);"
Comment on lines +5 to +6
"unique_identifier": "EndNote 2025",
"fuzzy_match_name": "EndNote 20%",
Comment on lines +44 to +47
$splitArgs = $uninstallCommand.Split('"')
if ($splitArgs.Length -gt 1) {
if ($splitArgs.Length -eq 3) {
$uninstallArgs = "$( $splitArgs[2] ) $uninstallArgs".Trim()
"installer_url": "https://download.endnote.com/downloads/2025/EN2025Inst.msi",
"install_script_ref": "8959087b",
"uninstall_script_ref": "a5b016cf",
"sha256": "no_check",
"installer_url": "https://cp.serverdata.net/voice/pbx/softphonereleases/default/latest-win/elevate-uc-x64.msi",
"install_script_ref": "8959087b",
"uninstall_script_ref": "65159f92",
"sha256": "no_check",
"name": "Eclipse Temurin JDK 11",
"slug": "eclipse-temurin-jdk-11/windows",
"platform": "windows",
"unique_identifier": "Eclipse Temurin JDK with Hotspot",
"name": "Eclipse Temurin JDK 17",
"slug": "eclipse-temurin-jdk-17/windows",
"platform": "windows",
"unique_identifier": "Eclipse Temurin JDK with Hotspot",
"name": "Eclipse Temurin JDK 21",
"slug": "eclipse-temurin-jdk-21/windows",
"platform": "windows",
"unique_identifier": "Eclipse Temurin JDK with Hotspot",
"name": "Eclipse Temurin JDK 8",
"slug": "eclipse-temurin-jdk-8/windows",
"platform": "windows",
"unique_identifier": "Eclipse Temurin JDK with Hotspot",
allenhouchins added a commit that referenced this pull request Jul 13, 2026
**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)
@allenhouchins allenhouchins mentioned this pull request Aug 3, 2026
1 task
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