Mit dem Windows Package Manager (winget) lassen sich sehr einfach Applikationen auf einem Windows Gerät Installieren. Winget bietet ein grosses Repository an, von welchem man sich wie beispielsweise auch bei Chocolatey bedienen kann. Der grosse Vorteil an winget ist, dass dieser Client in den neuen Windows Versionen bereits im System integriert ist und zukünftig mehr in den Endpoint Manager (Intune) integriert wird.
Wie du winget Applikationen als win32 App (als System) mit Intune verteilen kannst, zeige ich dir in diesem Beitrag auf.

Falls du die Apps komplett automatisiert erstellen und in deine Umgebung hochladen möchtest, kannst du das mit meinem Tool dem "Intune Win32 Deployer".

Table of Contents

Was ist winget beziehungsweise der Windows Package Manager?

Der Windows Package Manager ist wie Chocolatey ein Package-Repository beziehungsweise Manager, der frei genutzt werden kann. Mit diesem kannst du sehr einfach via Command-Line Programme installieren und Updaten.

Bisher habe ich dazu immer Chocolatey verwendet, dies vor allem, weil winget nur im Userkontext genutzt werden konnte. Dies hat aber geändert und mich veranlasst, meine Installationen nach und nach anzupassen.

Der Windows Package Manager wird auch in Zukunft eine immer wichtigere Rolle spielen, so soll er den heutigen Windows Store for Business anfangs 2023 ablösen.
Einen super Beitrag zur Ablösung des Windows Store for Business findest du auf der Seite von Rudy Ooms: Microsoft Store for Business Deprecated! What to do now? (call4cloud.nl)

Windows Package Manager (App Installer) mit Intune verteilen

Der App Installer ist eigentlich in den aktuellen Versionen von Windows enthalten, jedoch ist das Kommando winget beziehungsweise die winget.exe noch nicht verfügbar. Das kann gerade bei Rollouts mit Autopilot zu Problemen führen.
Darum verteile ich jeweils den App Installer als separates Win32-Paket, welches ich dann auch als Abhängigkeit bei den einzelnen Applikationen hinterlegen kann.

Zur Installation lade ich die aktuelle Version des App Installers von "https://aka.ms/getwinget" herunter, lege diese in einem temporären Verzeichnis ab und installiere ihn aus diesem. Zum Schluss lösche ich das Verzeichnis wieder.

Das Ganze verpacke ich zusammen mit einer Deinstallationsroutine und einem Validationfile (check.ps1) in ein intunewin / win32 App und lade es zu Intune hoch.

Zum Hochladen navigierst du im Endpoint Manager zu "Apps > Windows" +Add (Windows App (win32)).
Hier lädst du die Datei "install.intunewin" aus meiner Vorlage hoch.

win32 app erstellen

Zudem vergibst du der App einen Namen, eine Beschreibung und füllst den Herausgeber ab:

Auf der nächsten Seite fügst du folgende zwei Befehle ein:

install command%SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden -executionpolicy bypass -command .\install.ps1
uninstall command%SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden -executionpolicy bypass -command .\uninstall.ps1
install command, win32 app, Intune

In der Erkennungsregel lädst du das Script "check.ps1" hoch.

detection rule, script, Intune

Abhängigkeiten und eine Supersedence Regel musst du nicht definieren.
Zum Schluss muss die App nur noch zuweisen werden.

winget Pakete mit Intune verteilen (win32)

Zum Verteilen einer Applikation aus dem winget Repository habe ich eine Vorlage zusammengestellt, welche du verwenden kannst. In dieser Vorlage muss vor der Paketierung und dem Hochladen lediglich die korrekte ID eingetragen werden.

winget ID finden

Die ID findest du entweder via CMD oder PowerShell und dem Kommando "winget search" oder noch einfacher Online unter winget.run.

winget search

Den Docs Artikel mit weiteren Details zur Suche via "command line" findest du hier: search Command | Microsoft Docs

winget Vorlage anpassen und intunewin erstellen

Hast du die ID gefunden, musst du diesen nur noch in meiner Vorlage einfügen.
Dies musst du in allen drei Dateien machen:

  • install.ps1
  • uninstall.ps1
  • check.ps1

In allen Dateien findest du oben einmal den Vermerk "WINGETPROGRAMID", den du durch die gewünschte ID ersetzt.

Hast du die drei Dateien angepasst, verwandelst du sie in ein intunewin.
Wie das geht, habe ich dir hier beschrieben: Win32 App / .intunewin erstellen

Erkennungsregel

Bei der Erkennungsregel hast du zwei Möglichkeiten, entweder du verwendest ein Script (flexibler) oder eine statische Erkennungsregel aufgrund eines Ordners.

Entschiedest du dich für den Weg via Script, bis du hier bereits fertig. Denn diese hast du im Punkt oberhalb mit der Anpassung der Datei "check.ps1" bereits vorbereitet.

Möchtest du lieber eine Regel via Ordner-Erkennung (Manually configured detection rule) verwenden, musst du pro Paket den entsprechenden Ordner mit der korrekten Version heraussuchen. Dies geht am einfachsten, wenn du das Programm bei dir oder einem Testgerät installiertest und den Ordner unter folgendem Pfad suchst:

C:\Program Files\WindowsApps

Falls du keinen Zugriff auf den Ordner findest du hier eine Anleitung, wie du dir diesen als Admin erteilen kannst: How to Access WindowsApps folder in Windows 10/8 - wintips.org - Windows Tips & How-tos

Hast du den entsprechenden Ordner gefunden, kopiere dir den Pfad heraus. Diesen benötigst du erst im nächsten Schritt wieder.

Path of winget app

Win32 App in Intune erstellen

Wenn du die Vorlage angepasst, das intunewin erstellt und dich für eine Erkennungsregel entschieden hast, kannst du das App im Endpoint Manager unter "Apps > Windows apps" erstellen.

win32 app erstellen

Auf der ersten Seite hinterlegst du den App-Namen, die Beschreibung sowie einen Herausgeber.
Auf der zweiten Seite fügst du folgende zwei Befehle ein:

install command%SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden -executionpolicy bypass -command .\install.ps1
uninstall command%SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden -executionpolicy bypass -command .\uninstall.ps1

Zudem stelle ich das "Device restart behavior" auf "No specific action", dass mir die Installation möglichst keinen Neustart erzwingt.

In den Requirements musst du nichts Spezielles definieren. (z.B. x64 und 2004)

In der Erkennungsregel lädst du jetzt entweder das Script hoch oder hinterlegst den kopierten Pfad.

script detection
Erkennungsregel mit Script
File Detection
Erkennungsregel mit Pfad

In den Abhängigkeiten wählst du den "Windows Package Manager" aus:

Abhängigkeit, Windows Package Manager

Supersedence Regel musst du keine definieren und zum Schluss die App nur noch zuweisen.
FERTIG!

Erklärung der Vorlage (install.ps1)

In den ersten 6 Zeilen wird der optionale Parameter "$param" deklariert. Dieser wird nur benötigt, falls du der Installation etwas zusätzlich mitgeben muss (z.B. ein Lizenzkey).
Diese Parameter kannst du dann einfach hinten an den Installationsbefehl im Win32 App in Intune anhängen.

In der Zeile 8 wird die winget ID deklariert, das ist die ID gemäss Repository.

$ProgramName = "WINGETPROGRAMID"
Code language: PowerShell (powershell)

Anschliessend wird in der Zeile 9 und 10 der Pfad für ein lokales Log angegeben und das Transkript / Log gestartet:

$Path_local = "$Env:Programfiles\_MEM"
Start-Transcript -Path "$Path_local\Log\$ProgramName-install.log" -ForceCode language: PowerShell (powershell)

Da der Befehl winget im Systemkontext nicht direkt bekannt ist, müssen wir zunächst in das richtige Verzeichnis navigieren und den vollständigen Pfad zur "winget.exe" auflösen.
Das mache ich in der Zeile 13 bis 16.
Die EXE wird anschliessend über die Variabel $wingetexe aufgerufen.

$winget_exe = Resolve-Path "C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_*_x64__8wekyb3d8bbwe\winget.exe"
if ($winget_exe.count -gt 1){
        $winget_exe = $winget_exe[-1].Path
}Code language: PowerShell (powershell)

Anschliessend (Zeile 19) kommt der Hauptprozess, in dem das Programm via winget mit dem normalen Installationsbefehl und den Parametern für die "silent" Installation installiert wird.

& $winget_exe install --exact --id $ProgramName --silent --accept-package-agreements --accept-source-agreements --scope=machine $param
Code language: PowerShell (powershell)

Zum Schluss wird das Transkript wieder beendet und der Prozess abgeschlossen.

Stop-Transcript
Code language: PowerShell (powershell)

Update von winget Apps

Der schnellste Weg winget Applikationen zu updaten ist mit folgenden zwei Befehlen:
(Der erste für eine spezifische Applikation, der zweite für alle.)

# Upgrade specific app (change Logitech.Options with the desired winget id)
winget upgrade Logitech.Options

# Upgrade all apps
winget upgrade --query --silent --force --accept-package-agreements --accept-source-agreements --allCode language: PowerShell (powershell)

Den "Upgrade all" Befehl kannst du auch an deine Geräte als Scheduled Task verteilen, um immer alle Apps up-to-date zu halten. Dazu habe ich dir hier eine Vorlage (intunewin) vorbereitet:

Um dieses Paket zu verteilen, kannst du die gleichen Parameter verwenden, wie oben beschrieben für den "Windows Package Manager".

Ein Nachteil dieser Variante kann sein, dass sämtliche Apps, die auf winget publiziert sind, in den Updater Prozess miteinbezogen werden. Das ist nicht immer gewünscht.
Eine Lösung dafür bietet das Tool: Winget-AutoUpdate: WAU daily updates apps as system and notify connected users. (Allowlist and Blocklist support) (github.com)