Files
Allen Houchins 3203cdd9db Add several Windows FMAs (#47030)
This pull request adds support for several new Windows applications to
the maintained apps list by introducing new configuration JSON files for
each app under the `ee/maintained-apps/inputs/winget/` directory. Each
file defines metadata and installation details for a specific
application, including installer type, architecture, scope, categories,
and optional install/uninstall scripts. This update expands the range of
applications that can be managed and deployed.

**New application definitions:**

*Communication and Collaboration:*
- Added `Amazon Chime` (`amazon-chime.json`), `Front` (`front.json`),
and `Microsoft Teams` (`microsoft-teams.json`) with configuration for
installation, uninstallation, and categorization under "Communication".
[[1]](diffhunk://#diff-296db54aa9d8cea8e1302cc76e43abfd7565ab011bb3d1318a0d46c12b4b35f7R1-R12)
[[2]](diffhunk://#diff-72a2bcc2c2b9fadcf09505f8caefb681e79679ee99fb068a84698c783e81f17dR1-R12)
[[3]](diffhunk://#diff-9b5681ffd0b55fd89ce4f69e07668fa23df9582a921bf2000d9d2230429e16c9R1-R12)

*Productivity and Utilities:*
- Added `AnyDesk`, `Citrix Workspace`, `DeepL`, `Egnyte`, `Elgato
Control Center`, `Elgato Stream Deck`, `Evernote`, `ExpressVPN`,
`Hyper`, `Jabra Direct`, `Keeper Password Manager`, `LibreOffice`, and
`MindManager` with appropriate installer details, categories, and
scripts where applicable.
[[1]](diffhunk://#diff-9a7ba8c0afb32ab31c2950a4a95847fa1293411416302cd6698dc2bcb519fbfdR1-R12)
[[2]](diffhunk://#diff-3ba331a553f359a02dd3d824d3edab85292e2d1d9c1a6a739e313a9b63d5a88fR1-R13)
[[3]](diffhunk://#diff-03fc24bba02df2bcfb57acabaffd8d3afac94bafbda450c4336a67f85bc4429eR1-R12)
[[4]](diffhunk://#diff-ab44cad18bc633e446e1acd1714034464a92721e175cd0bd835fdb8eb4a7e0c8R1-R10)
[[5]](diffhunk://#diff-e5b9495ea0a996194b5c04a9327b33220a7b24e0e9abff2153c98ec949018bc0R1-R10)
[[6]](diffhunk://#diff-53b6cdd6d7032bffc8307f93a03eae3f1e82b57fa03316ad10b5b1af02b6c103R1-R10)
[[7]](diffhunk://#diff-917d3e25bae801c48ae70f70bf43e8540d962046bb773dbeed633eb52323e084R1-R12)
[[8]](diffhunk://#diff-b8f4026fc2a89254c0bdeb905120761ee78c6a76101deaf3dadd814ce3cafa94R1-R12)
[[9]](diffhunk://#diff-5bdb4220ac0cc23ff96963f975a55ef081493ee797545e0a1f65f9f4c50ef982R1-R12)
[[10]](diffhunk://#diff-941487a1c1f2ba4d2da50e47f47bbab46478f2bb7c7e009fdd21bf2b68090413R1-R12)
[[11]](diffhunk://#diff-605ef361eebaf639aaa110d3599f53f84c5cd3fc2cbcb5960bb741385b59e5eaR1-R12)
[[12]](diffhunk://#diff-fde7bf26f42621dd7f096bbb626af339e27312c0ca380ca2ef4a9f68ab1278ddR1-R11)
[[13]](diffhunk://#diff-c293d2eda9fea8cc74547aefd99e078d181f29b04b4289ee88bbf91b09432ae1R1-R13)

*Developer Tools:*
- Added `Arduino IDE` and `iMazing Profile Editor` with installer
metadata and categorized as "Developer tools".
[[1]](diffhunk://#diff-eaf314e8b4d4156a5f428809d9dd6484d5585bfc7382658fc93744750347773fR1-R10)
[[2]](diffhunk://#diff-649ae93e725621f9ee7d5fcddb3e81a2338eb3017ffae40a5dd915f42b75c8cfR1-R12)

*Browsers and Utilities:*
- Added `Arc` (browser) and `iMazing` (utility) with installation
details and script paths.
[[1]](diffhunk://#diff-bc27e68e5949eb7e4fd3c1d54f9f89b86cb6aed0e908f6687a4549dc81b65f49R1-R12)
[[2]](diffhunk://#diff-7c778f4e3418f1b5ad0094b2c5d366d3690ae480ef3910f1833fba1197d71d9bR1-R12)
2026-06-07 08:26:36 -05:00

100 lines
4.0 KiB
PowerShell

# MSIX: provision machine-wide so the app is available to all users at sign-in, then
# opportunistically register for the currently logged-on console user (via a scheduled
# task in their session) so the app is immediately visible without requiring sign-out.
#
# The Fleet agent runs as Local System on Windows, and Add-AppxPackage cannot run in that
# context (HRESULT 0x80073CF9). The scheduled task is the supported way to register a
# package in a user session from a system-context script.
$softwareName = "Arc"
$taskName = "fleet-install-$softwareName.msix"
$scriptPath = "$env:PUBLIC\install-$softwareName.ps1"
$exitCodeFile = "$env:PUBLIC\install-exitcode-$softwareName.txt"
try {
$msixPath = $env:INSTALLER_PATH
if (-not $msixPath) {
throw "INSTALLER_PATH is not set"
}
Write-Host "Provisioning MSIX for all users..."
$result = Add-AppxProvisionedPackage -Online -PackagePath $msixPath -SkipLicense -Regions "all" -ErrorAction Stop
$result | Out-String | Write-Host
# Win32_ComputerSystem.UserName returns the console user (DOMAIN\User) or null when no
# interactive session is active. Other RDP/fast-user-switch sessions won't get the
# immediate registration; those users will pick it up from the provisioned install at
# their next sign-in.
$userName = (Get-CimInstance Win32_ComputerSystem).UserName
if (-not $userName -or $userName -notlike "*\*") {
Write-Host "No interactive user logged on; provisioned install will register for each user at sign-in."
Start-Sleep -Seconds 5
Exit 0
}
Write-Host "Registering MSIX for logged-on user '$userName' via scheduled task..."
$userScript = @"
`$msixPath = "$msixPath"
`$exitCodeFile = "$exitCodeFile"
try {
Add-AppxPackage -Path `$msixPath -ErrorAction Stop | Out-String | Write-Host
Set-Content -Path `$exitCodeFile -Value 0
} catch {
Write-Host "Add-AppxPackage failed: `$(`$_.Exception.Message)"
Set-Content -Path `$exitCodeFile -Value 1
}
"@
Set-Content -Path $scriptPath -Value $userScript -Force
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-WindowStyle Hidden -ExecutionPolicy Bypass -File `"$scriptPath`""
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries
$principal = New-ScheduledTaskPrincipal -UserId $userName -RunLevel Highest
$task = New-ScheduledTask -Action $action -Settings $settings -Principal $principal
Register-ScheduledTask -TaskName $taskName -InputObject $task -User $userName -Force | Out-Null
Start-ScheduledTask -TaskName $taskName
$startDate = Get-Date
$state = (Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue).State
while ($state -ne "Running") {
Start-Sleep -Seconds 1
if ((New-Timespan -Start $startDate).TotalSeconds -gt 30) {
Write-Host "Per-user registration task did not start within 30s; provisioned install is still valid."
break
}
$state = (Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue).State
}
while ($state -eq "Running") {
Start-Sleep -Seconds 2
if ((New-Timespan -Start $startDate).TotalSeconds -gt 90) {
Write-Host "Per-user registration task did not complete within 90s; provisioned install is still valid."
break
}
$state = (Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue).State
}
if (Test-Path $exitCodeFile) {
$code = (Get-Content $exitCodeFile -ErrorAction SilentlyContinue | Select-Object -First 1).Trim()
if ($code -eq "0") {
Write-Host "Per-user registration completed for '$userName'."
} else {
Write-Host "Per-user registration did not complete cleanly (exit code: $code). Provisioned install is still valid."
}
}
Start-Sleep -Seconds 5
Exit 0
} catch {
Write-Host "Error: $_"
Exit 1
} finally {
Unregister-ScheduledTask -TaskName $taskName -Confirm:$false -ErrorAction SilentlyContinue | Out-Null
Remove-Item -Path $scriptPath -Force -ErrorAction SilentlyContinue
Remove-Item -Path $exitCodeFile -Force -ErrorAction SilentlyContinue
}