69 lines
2.8 KiB
PowerShell
69 lines
2.8 KiB
PowerShell
#Requires -Version 5.1
|
|
# Provision winget (the App Installer) when absent. Windows IoT Enterprise LTSC
|
|
# ships WITHOUT the inbox Microsoft.DesktopAppInstaller package, so re-registering
|
|
# it is not enough - we download and install it (plus dependencies) online at apply
|
|
# time. Best-effort and idempotent: exit 0 if winget ends up available, else 1.
|
|
$ErrorActionPreference = 'SilentlyContinue'
|
|
|
|
function Test-Winget {
|
|
return [bool](Get-Command winget -ErrorAction SilentlyContinue)
|
|
}
|
|
|
|
# Fast path 1: winget already on PATH.
|
|
if (Test-Winget) { exit 0 }
|
|
|
|
# Fast path 2: an inbox App Installer package is present - just re-register it.
|
|
Get-AppxPackage -AllUsers Microsoft.DesktopAppInstaller |
|
|
ForEach-Object { Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml" }
|
|
if (Test-Winget) { exit 0 }
|
|
|
|
# Slow path: download + install the App Installer and its dependencies online.
|
|
$temp = $env:TEMP
|
|
$bundlePath = Join-Path $temp 'Microsoft.DesktopAppInstaller.msixbundle'
|
|
$vclibsPath = Join-Path $temp 'Microsoft.VCLibs.x64.14.00.Desktop.appx'
|
|
$uixamlNupkg = Join-Path $temp 'microsoft.ui.xaml.2.8.6.nupkg'
|
|
$uixamlExtract = Join-Path $temp 'uixaml.2.8.6'
|
|
$uixamlAppx = Join-Path $uixamlExtract 'tools\AppX\x64\Release\Microsoft.UI.Xaml.2.8.appx'
|
|
|
|
$bundleUrl = 'https://aka.ms/getwinget'
|
|
$vclibsUrl = 'https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx'
|
|
$uixamlUrl = 'https://globalcdn.nuget.org/packages/microsoft.ui.xaml.2.8.6.nupkg'
|
|
|
|
function Get-File {
|
|
param([string]$Url, [string]$Destination)
|
|
try {
|
|
Invoke-WebRequest -Uri $Url -OutFile $Destination -UseBasicParsing
|
|
return (Test-Path $Destination)
|
|
} catch {
|
|
return $false
|
|
}
|
|
}
|
|
|
|
# Download the App Installer bundle (required).
|
|
if (-not (Get-File -Url $bundleUrl -Destination $bundlePath)) { exit 1 }
|
|
|
|
# Download the VCLibs desktop dependency (required).
|
|
if (-not (Get-File -Url $vclibsUrl -Destination $vclibsPath)) { exit 1 }
|
|
|
|
# Download the UI.Xaml 2.8 nuget package (a .zip) and extract the appx from it.
|
|
if (-not (Get-File -Url $uixamlUrl -Destination $uixamlNupkg)) { exit 1 }
|
|
try {
|
|
if (Test-Path $uixamlExtract) { Remove-Item -Path $uixamlExtract -Recurse -Force }
|
|
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
|
[System.IO.Compression.ZipFile]::ExtractToDirectory($uixamlNupkg, $uixamlExtract)
|
|
} catch {
|
|
exit 1
|
|
}
|
|
if (-not (Test-Path $uixamlAppx)) { exit 1 }
|
|
|
|
# Install order: VCLibs dependency, then UI.Xaml dependency, then the bundle with
|
|
# both supplied as DependencyPath. Per-user Add-AppxPackage (toolbox runs as the
|
|
# real admin user at first logon).
|
|
Add-AppxPackage -Path $vclibsPath
|
|
Add-AppxPackage -Path $uixamlAppx
|
|
Add-AppxPackage -Path $bundlePath -DependencyPath $vclibsPath, $uixamlAppx
|
|
|
|
# Final re-check.
|
|
if (Test-Winget) { exit 0 }
|
|
exit 1
|