Es ist endlich soweit. Nach dem Motto: „Mach es fertig, bevor es dich fertig macht“, stelle ich euch hiermit die aktuelle Version meines internen Helferleins zur Verfügung, mit dem ich Win32 Apps verteile. Das Ganze ist vor langer Zeit klein gestartet und mit und mit gewachsen – inzwischen hat es etliche Kundeneinsätze hinter sich und kann sich sehen lassen, denke ich 🙂
Das Tool ist komplett in PowerShell geschrieben und baut auf den Modulen IntuneWin32App und PSAppDeployToolkit auf – letztlich ist es nur eine Art GUI, mit dem sich das Paketieren effizient umsetzen lässt. Dank Copilot sind etliche Ergänzungen im UI-Bereich hinzugekommen, die ich ohne Hilfe vermutlich niemals so hinbekommen hätte. Also: Besten Dank @Copilot, auch wenn du mich immer wieder in den Wahnsinn treibst mit deinen Halluzinationen.
Als „Datenbank“ dient ein CSV, das mit allen paketspezifischen Infos gefüllt werden muss. So erhält man mit der Zeit eine Liste mit Anweisungen, die sich hoffentlich bewährt haben und die man immer wieder einsetzen kann – gerade auch in verschiedenen Umgebungen, was u.a. recht praktisch ist, um eine Test- und eine Produktivumgebung nach erfolgreichem Test synchron zu halten.
Viel Aufwand habe ich in die Modularität gesteckt: Es gibt Templates für Pakete, die auf WinGet setzen, aber auch klassische MSIs oder oder auch Setup.exe-Installer werden unterstützt. In allen Fällen wird ein PSADT framework erstellt und mit Leben gefüllt – die paketspezifischen Unterschiede kommen aus der CSV und werden in die kopierten Templates quasi injiziert. Am Ende kommt pro App eine Ordnerstruktur heraus inkl. Deployment-Skript, das aus dem Ordner ein .intunewim macht, die App in Intune anlegt und den Upload des .intunewim übernimmt.
Vorbereitungen:
- Tool herunterladen, im Dateisystem ablegen, z.B. C:\Tools\IntuneWin32Helper. Wenn ihr bequem die Zone.Identifier streams von allen heruntergeladenen Dateien entfernen wollt, könnt ihr unblock-file verwenden, z.B. so:
dir C:\Tools\IntuneWin32Helper-Recurse | Unblock-File -Verbose - PackageRoot erstellen, z.B. D:\IntuneApps. Das ist der Stammorder für alle mit dem Tool erstellten Pakete im Dateisystem
- Im Ziel-Tenant eine App Registration erstellen, z.B. namens „IntuneWin32Helper“
- Die folgenden Redirect URIs hinzufügen:
https://login.microsoftonline.com/common/oauth2/nativeclient
http://localhost

- API permission hinzufügen
"DeviceManagementApps.ReadWrite.All", Type:"Application". Admin Consent nicht vergessen!

- Neues Client secret erstellen und zusammen mit der Application (client) ID z.B. in Notepad zwischenspeichern
Erster Start – Einstellungen
Nun kann das Tool gestartet werden. Ich habe mir eine Verknüpfung auf dem Desktop angelegt mit Ziel: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file „C:\Users\alex\OneDrive – AZITC\Tools\Administration\IntuneWin32Helper\Start-IntuneWin32Helper.ps1“

Im Tool auf das Zahnrad unten links, dann einen neuen Tenant anlegen und die Daten von oben hier hineinkopieren. Übrigens ist die „anzeigen“-Box derzeit nur Zierde, in der Übersicht ist das Secret dann doch wieder einfach so sichtbar :). Und entgegen der Beschreibung ist das ClientSecret nicht optional, sondern essentiell. Speichern nicht vergessen!

Wie ihr später sehen werdet, kann das Tool App Logos aus dem Web herunterladen und diese in Intune einbinden, sodass z.B. im Company Portal ein hübsches Logo angezeigt wird. Falls die Logos nicht als .png oder .jpg vorliegen, sind sie für das Tool leider nicht verwendbar. Deshalb habe ich kurzerhand einen Clouddienst „eingebaut“, der eine etwaige Konvertierung on-the-fly übernehmen kann. Ich habe mich für Cloudinary entschieden, da er im Basis level kostenlos ist – und mir reicht das so.
Das einmalige Einrichten ist nicht schwer: Klick auf den Link, neues Konto erstellen, Basis Plan wählen. Dann ein neues „Environment“ erstellen (dessen Name wird der „cloudName“) und dort dann zu API-keys navigieren. Dort dann einen API key erstellen, heraus kommen der Key selbst und ein apiSecret. Alle 3 Werte trägt man dann in den Dialog des Tools ein.

Wem das alles zu umständlich ist: Ihr könnt die Punkte auch einfach überspringen. Passende Icons könnt ihr im PNG Format selbst herunterladen und im \Logos Verzeichnis ablegen. So macht es das Tool letztlich auch. Wichtig ist nur, dass der Name des Logos mit dem App-Namen übereinstimmt, also z.B. „Notepad++.png“
Eine neue App erstellen
Nun kann es losgehen. Am einfachsten nehmt ihr eine App, die ich schon im CSV hinterlegt habe. Fangen wir mit 7-Zip an, in unserem Fall ein Beispiel für ein WinGet-basiertes Deployment. Das schöne hieran ist: Ihr müsst nichts herunterladen und in das Quellverzeichnis kopieren, alles wird von den Clients zum Installationszeitpunkt dynamisch aus dem Community Repo heruntergeladen. Daher ist der Ablauf hier denkbar simpel.

Einfach auswählen, OK drücken.

Im Hintergrund passiert nun eine Menge – hier ein kurzer Abriss:
- Es wird nun im o.g. Verzeichnis „packageRoot“ ein Unterordner erstellt nach dem Namensschema „<Name der App> – <Version>“ – im Falle von WinGet-Paketen wird bei Version „LatestAvailable“ eingesetzt
- Im Verzeichnis wird mit dem Befehl „
New-ADTTemplate“ eine neue PSADT Struktur erstellt/platziert - Das Ergebnis wird in den Ordner „In“ verschoben
- Es wird ein Ordner „Out“ erstellt, in den gleich unser .intunewim abgelegt wird
- Die Invoke-AppDeployToolkit.ps1 wird um Angaben zur App und Anweisungen für Installation und Deinstallation erweitert
- Das Template für die „Detection“ der App (detection.ps1) wird kopiert und an die App angepasst
- Das Template für Deployment (deploy.ps1) wird kopiert und an die App angepasst
Es passiert noch einiges mehr, aber das soll für den Moment reichen. Wichtig ist: Am Ende haben wir im PackageRoot ein komplett fertiges Verzeichnis liegen, das alle Daten enthält, um 7-Zip standardisiert zu deployen – inkl. eines Skripts (deploy.ps1), um das Deployment nach Intune zu starten. Da wir „Create and deploy“ gewählt haben, startet das Tool dieses Skript nun ganz automatisch 🙂 Später kann man es bei Bedarf aber auch erneut einfach manuell starten.

Zum späteren manuellen Start könnt ihr auch einfach die Option „Deploy existing apps“ auf dem Startbildschirm nutzen.
Weiter geht es wie folgt:

Nach der Abfrage des Zieltenants wird mit den hinterlegten Daten die Verbindung aufgebaut.

…und das Ganze kommt zu einem hoffentlich guten Ende.
Wem das zu schnell ging: Es gibt ein Log file, in dem alles aufgezeichnet wird:

Und man kann das Ergebnis in Intune bewundern.

Was ist dadurch gewonnen?
- Es ist schnell: manuell würde es locker 10 Mal so lange dauern
- Alle Pakete sind einheitlich. Keine Sonderlocken, alle wichtigen Parameter stehen im Tool bzw. sind dort einsehbar (und im CSV gespeichert)
- Es ist leicht erweiterbar: Neue noch nicht im „Tool-Katalog“ enthaltene Apps sind schnell hinzugefügt. Insbesondere Winget-Apps oder SingleMSIs brauchen nur ein paar Klicks.
Und das Ganze ist Multi-Tenant fähig. Wer wie ich in vielen verschiedenen Umgebungen unterwegs ist, wird das zu schätzen wissen. Einmalig pro Tenant die App-Registrierung hinzugefügt und es kann losgehen: Exakt das reproduzieren, was sich (anderswo) schon bewährt hat. Dank PSADT immer mit umfangreichen Logging für den Fehlerfall.
Übrigens: Alle PSADT Logs liegen im IntuneManagementExtension Ordner:
C:\ProgramData\Microsoft\IntuneManagementExtension\Logs

Soviel bis hierhin… Ich werde in den kommenden Tagen und Wochen noch einige Infos hinterherschicken. Mir fallen so ad hoc die folgenden Themen ein:
- Neue Winget App hinzufügen
- Single MSI hinzufügen
- Komplexeren Setup.exe-basierten Installer hinzufügen
- Spezialitäten
- Apps aktuell halten: Winget AutoUpdate
Habt ihr noch Anregungen?
Lasst gerne einen Kommentar da 🙂

von