Add Windows FMAs (letter E): 13 apps - #49186
Conversation
Eclipse Temurin JDK 8/11/17/21, Eclipse Temurin JRE 8/11/17/21, exacqVision Client, Egnyte WebEdit, Elevate UC.
Codecov Report❌ Patch coverage is 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
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
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.
|
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). |
Script Diff Resultsee/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.
|
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 |
Script Diff Resultsee/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.
|
Fixed Evernote + exacqVision (7a16e1b) — the other 12 apps passed.
|
Script Diff Resultsee/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.
Script Diff Resultsee/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.
|
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. |
Script Diff Resultsee/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" |
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (11)
📒 Files selected for processing (43)
WalkthroughAdds 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
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
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.
| "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);" |
| "unique_identifier": "EndNote 2025", | ||
| "fuzzy_match_name": "EndNote 20%", |
| $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", |
**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)
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:
EclipseAdoptium.Temurin.8.JDKEclipseAdoptium.Temurin.11.JDKEclipseAdoptium.Temurin.17.JDKEclipseAdoptium.Temurin.21.JDKEclipseAdoptium.Temurin.8.JREEclipseAdoptium.Temurin.11.JREEclipseAdoptium.Temurin.17.JREEclipseAdoptium.Temurin.21.JREExacqTechnologies.exacqVisionClientexacqVision Client (x64).Egnyte.EgnyteWebEditServerdata.ElevateUCignore_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 anexists_querythat combines the JDK-vs-JRE name prefix, the publisher, and a major version filter, e.g.:The
JDK/JREtoken in the name prefix keeps a JDK install from matching the JRE FMA and vice-versa; theversion LIKE '<major>.%'keeps each major distinct. This mirrors the existing Amazon Corretto per-major FMAs. Identities (DisplayName, publisherEclipse Adoptium, 4-part ProductVersion) were verified viamsiinfoon the real x64 MSIs.Considered but not added (recorded in the workstream tracker):
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
msiinfoProperty tables. SHAs verified against manifests for pinned URLs;ignore_hashused only for Elevate UC's actively-maintained latest-pointer URL. Icons viatools/software/icons/generate-icons.sh.Checklist for submitter
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.Testing
Summary by CodeRabbit