In this post, I will show you how to install the latest version of WinGet during the AutoPilot process and subsequently deploy application using the WinGet command line tool at the same time.
This will enable you to use the WinGet command line tool to manage application both during the AutoPilot process and immediately after login.
What is WinGet?
WinGet is a command line tool for the Windows Package Manager solution, which enables you to find, install, upgrade or remove applications on Windows 10 and 11 computers.
It is a fast and effective tool for deploying applications onto workstations remotely, especially using Microsoft Intune.
Is WinGet pre-installed with Windows?
Modern versions of Windows 10 (1709 or later) and all versions of Windows 11 come pre-installed with Windows Package Manager (WinGet) by default.
This poses the question, why install it manually if it likely is already deployed? While the Windows Package Manager is installed, it can take a while for the command line tool to become available. This only happens once the user logs in and triggers Microsoft Store to register Windows Package Manager. Hence, the need to install is manually.
WinGet versions and file size
I want to mention the file sizes of WinGet and the different versions available. This is because starting in WinGet version 1.6.1573-preview, .NET and PowerShell host have been included in the bundle, increasing the package file size by 20 times!
This was highlighted on GitHub in the discussions section of said version by the maintainer.
For the latest release without these resource-heavy features built in, ensure you install version 1.5.2201. However, if you want to use WinGet to deploy the applications during AutoPolit provisioning, install the LATEST version as per my script.
Step 1: Creating the install script
You first need to create a script that will install WinGet.
Below is a simple script that will first check if WinGet is already installed; then, if it isn’t, it will download the recommended version of WinGet and the dependencies from the official repositories and install them.
This script is also accessible from GitHub.
<#
.SYNOPSIS
Installs WinGet, for use with Intune
.LINK
https://ourcloudnetwork.com
https://www.linkedin.com/in/danielbradley2/
https://twitter.com/DanielatOCN
.NOTES
Version: 0.1
Author: Daniel Bradley
Creation Date: Friday, January 5th 2024, 5:18:37 pm
File: Install-winget.ps1
.EXAMPLE
Deploy as Intune script
.LICENSE
Use this code free of charge at your own risk.
Never deploy code into production if you do not know what it does.
#>
#Create path and define log file
$path= "C:\ProgramData\WinGet"
$LogFile = "InstallLog.txt"
mkdir $path -ErrorAction SilentlyContinue
#Write to log
Function LogWrite
{
Param ([string]$logstring)
$date = (Get-Date).tostring("yyyyMMdd-HH:mm")
Add-content "$path\$Logfile" -value "$date - $logstring"
}
#Check if WinGet is Installed
$TestPath = "C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_1.21.3482.0_x64__8wekyb3d8bbwe\AppxSignature.p7x"
$Winget = Test-path $TestPath -PathType Leaf
#Install WinGet
if (!$Winget){
LogWrite "WinGet not installed, attempting install with Add-AppxPackage"
Try {
LogWrite "Downloading WinGet and its dependencies..."
Start-Transcript -Path "$path\$Logfile" -Append
Invoke-WebRequest -Uri https://aka.ms/getwinget -OutFile "$path\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle" -Verbose
Invoke-WebRequest -Uri https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx -OutFile "$path\Microsoft.VCLibs.x64.14.00.Desktop.appx" -Verbose
Invoke-WebRequest -Uri https://github.com/microsoft/microsoft-ui-xaml/releases/download/v2.7.3/Microsoft.UI.Xaml.2.7.x64.appx -OutFile "$path\Microsoft.UI.Xaml.2.7.x64.appx" -Verbose
Add-AppxProvisionedPackage -online -packagepath $path\Microsoft.VCLibs.x64.14.00.Desktop.appx -SkipLicense -Verbose
Add-AppxProvisionedPackage -online -packagepath $path\Microsoft.UI.Xaml.2.7.x64.appx -SkipLicense -Verbose
Add-AppxProvisionedPackage -online -packagepath $path\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle -SkipLicense -Verbose
Stop-Transcript
}
Catch {
Write-host "Unable to complete offline installer"
}
} Else {
LogWrite "WinGet already installed"
}
Save this script as Install-WinGet.ps1, then you can test the script during the OOBE in AutoPilot to confirm it works and that WinGet works also!
At the OOBE screen, click SHIFT+F10 and type the following: (you file path for the PowerShell script may differ).
PowerShell
Set-ExecutionPolicy Unrestricted
.\Install-WinGet.ps1
Once install is complete, test installing Google Chrome with the following command:
winget install -e --id Google.Chrome
Step 2: Upload the script to Intune
Next, you will need to upload your script to Intune. I have opted to deploy this via a script, instead of packaging into a Win32 app, but you can deploy either way. (if you are packaging into a Win32 app, you may need to add more logic to the code). In my opinion, WinGet will deploy and maintain after this installation, so I plan on forgetting about it after installation.
If you want to deploy applications at the same time during the OOBE, you can append the follow lines of code onto the script: (change the Google.Chrome to you preferred app).
Alternatively, you can package this up separately and deploy it as a Win32 application (this will run after the script finishes executing during the OOBE). I couldnt get this to work, but drop me a message if you can!
cd "C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_1.21.3482.0_x64__8wekyb3d8bbwe\"
LogWrite "location set to $((Get-Location).Path)"
.\Winget install Google.Chrome --accept-package-agreements --accept-source-agreements | Tee-Object "$path\$Logfile" -Append
Follow the below steps to deploy the script from the Intune admin center.
2. Select Devices, then under policy, select Scripts.
3. Select Add > Windows 10 and later.
4. Define and name and click Next. On the Script settings page, select the following settings
5. Assign your script to all devices (or your preferences) and complete the wizard.
Wrapping up
If you made it this far, great! I want to advise that installing apps during this phase of the OOBE using the WinGet command line tool is a proof of concept. Of course, there are better ways to package, deploy and maintain your apps, but everyone has their preference.
Immediately after first log in we can see that Google Chrome has been successfully installed using WinGet.
I did this some months ago and I had big issues installing apps in OOBE after Winget was installed. I tried several methods but all of them made issues, and winget didn’t run correctly in OOBE.
Only by installing apps after OOBE at the user signin or later on I was able to successfully install apps.
I had similar issues on older versions of WinGet, but since it was packaged with .NET is seems to work OK (I has similar issues in Windows Sandbox). I still haven’t got the packaging working with Win32 apps. I also think in the script the WinGet process is being stopped, then the script is re-attempted after reboot it is is successful before the user signs-in..
Been trying to get some form of WinGet working with Intune for the longest time, but constantly running into “This app is not supported in preview” or the app is only available in the public repo. It’s so annoying! Glad I ran into your post here, I will try it.
Thanks Peter, let me know how you get on!
I install chrome via winget. This was the final piece I needed. I also have WIN32 package working. This is how I call the script above. I use this PS1 to install the apps:
https://github.com/Romanitho/Winget-Install?scrlybrkr=2efc7d16
With
“%systemroot%\sysnative\WindowsPowerShell\v1.0\powershell.exe” -NoProfile -ExecutionPolicy Bypass -File winget-install.ps1 -AppIDs 7zip.7zip -LogPath c:\wingetlogs
as the commandline. I have a dependency of the update script above. Again packaged as a WIN32 and using
“%systemroot%\sysnative\WindowsPowerShell\v1.0\powershell.exe” -NoProfile -ExecutionPolicy Bypass -File update-winget.ps1
as the commandline. Detection for install is file
C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_1.21.3482.0_x64__8wekyb3d8bbwe\AppxSignature.p7x