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)
100 lines
4.0 KiB
PowerShell
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
|
|
}
|