Ich habe viele verschiedene Kunden, die im Grunde die gleiche/ähnliche Basis an win32 Apps im Endpoint Manager benötigen. Die Apps jedes Mal mit dem intunewin File, dem Namen, des Herausgebers, Installationsbefehlen etc. einzupflegen, ist eine wenig befriedigende Arbeit. Darum habe ich mir ein Repository mit einer Software-Liste und einem PowerShell Script erstellt, welches das win32 App Deployment automatisiert.
Eine weiterentwickelte Version des Scripts findest du hier: The "Intune Win32 Deployer" | scloud
Den Code des PowerShell Scripts ein Beispiel CSV inklusive Repository habe ich auf meinem GitHub abgelegt: scloud/intune-win32-deployment at main · FlorianSLZ/scloud (github.com)
(Das Upload Script ist im Ordner "_UploadWin32App")
Wenn du Probleme mit Erkennungsregeln via Script hast (New-IntuneWin32AppDetectionRuleScript), kannst du folgenden Fix ausführen.
Voraussetzung: Modul ist im User Kontext installiert.
scloud/FIX_New-IntuneWin32AppDetectionRuleScript.ps1 at main · FlorianSLZ/scloud (github.com)
Table of Contents
- Demo
- Software CSV
- Win32 Repository
- PowerShell Script/Automatisierung
- App Zuweisung (Tipp)
- Windows Sandbox
Demo
Software CSV
Die Software-Liste, ein CSV-File besteht aus den wichtigsten Parametern für die win32 Apps. Dies sind Name, Beschreibung, Installations-/Deinstallations-Befehl, "runs as" sowie, falls vorhanden, die Abhängigkeit. Die Erkennungs-Regel und auch die Komptabilität habe ich bewusst weggelassen. Als Erkennungs-Regel nehme ich jeweils ein Custom Script und für die Komptabilität 64-bit und mindestens Windows 2004. Mit diesen Werten habe ich gute Erfahrungen gemacht, Natürlich könnte die Liste und das Script auch so erweitert werden, dass diese anhand des CSV's gesetzt werden.
Beispiel CSV
Name;Beschreibung;install;uninstall;as;Dependeny
7-Zip;7-Zip ist ein Packprogramm;%SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -command .\install.ps1;%SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -command .\uninstall.ps1;system
Code language: CSS (css)
Win32 Repository
In meinem Repository liegt jedes Programm in einem Ordner mit dem Programmnamen analog der Software-Liste. Wobei sich in diesem Ordner wiederum die benötigten Dateien für die Installations- und Deinstallations-Routine (meist instal.ps1 und uninstall.ps1), ein check.ps1 (Erkennungsregel) und ein PNG mit dem Programmnamen befinden. Zudem habe ich jeweils gleich das intunewin File erstellt, um aus dem Repo auch manuelle Uploads oder Updates durchführen zu können.
Der Ordner Inhalt eines solchen win32 Apps anhand des Beispiels 7-Zip sieht so aus:
Wie meine win32 Applikationen aufgebaut sind, habe ich zuvor in einem vergangenen Blog-Beitrag dokumentiert: my take on win32 apps - Intune
PowerShell Script/Automatisierung
Die Automatisierung beruht auf PowerShell mit dem Modul "Microsoft.Graph.Intune" und "IntuneWin32App". Das Script findest du hier.
Die Module lasen sich via PowerShell, als Admin installieren:
Install-Module IntuneWin32App -Force
Install-Module Microsoft.Graph.Intune -Force
Code language: PowerShell (powershell)
Der Aufbau und Ablauf des Scripts ist:
- Modul Importieren und Initial Variabeln einlesen (Tenant-Präfix und Software-Repository)
- Verbindung zum Tenant und Login
- Einlesen des CSV's (Software-list.csv aus dem Repository)
- Auswahl der zu importierenden Apps anhand einer Grid View (Eines oder Mehrere möglich)
- Erstellung und Upload der ausgewählten Apps
- Verbindung aktualisieren
- Intunewin-Datei einlesen
- Displayname einlesen
- Detection Rule erstellen (immer check.ps1)
- System Anforderungen setzten (x64 und Windows 10 2004+)
- Anzeige Bild setzen
- Upload der App mit Parametern
- 15 Sekunden warten, um von Azure nicht geblockt zu werden
(Die Wartezeit verhindert eine Blockade von Azure)
- Falls eine Abhängigkeit vorhanden ist:
- Prüfen, ob diese bereits im MEM vorhanden ist.
- Wenn nicht, anhand der Parameter aus dem CSV hochladen
- Abhängigkeit hinzufügen
- Fertig!
Die Applikation ist mit allen Variablen, dem Icon und der Abhängigkeit gemäss CSV im MEM.
App Zuweisung (Tipp)
Das Script selbst weit die Applikationen keiner Gruppe zu.
Um die Zuweisung doch schnell umsetzten zu können und nicht jedes App nochmals im MEM öffnen zu müssen, nutze ich das Intune for Education Portal. Das Portal ist zwar speziell für Schulen entwickelt und wird auch nur für diese beworben. Allerdings ist es möglich, das Intune for Education Portal von jedem Tenant aus über die korrekte URL aufzurufen: https://intuneeducation.portal.azure.com
- Über dieses können wir dann eine Gruppe auswählen und die zugewiesenen Apps bearbeiten/auswählen.
- Die Apps sind dann mit einem Klick zugewisen.
Achtung: Wird ein App in einer Gruppe abgewählt, wird es automatisch auf "uninstall" gesetzt.
Windows Sandbox
Bei mir kommt es immer wieder vor, dass sich Module nicht richtig nutzen lassen, da sie in einem Konflikt zu einem anderen oder einer spezifischen Version stehen. Darum nutze ich für die Deployments jeweils eine vorkonfigurierte Sandbox, die mit einem Doppelklick die aktuellen Module installiert und das Script startet.
Mehr dazu habe ich im vergangenen Beitrag "Pre-Installed PowerShell Module in Windows Sandbox" geschrieben.
Das entsprechende Sandbox File inklusive PowerShell findest du in meinem GitHub:
scloud/Windows-Sandbox/win32-automated at main · FlorianSLZ/scloud (github.com)
Hallo Florian,
ich habe dein Skript heute versucht, um eine App hoch zu laden. Hierbei sind 2 Fehler aufgetreten:
Der erste Fehler betrifft einen umbenannten Parameter für die Funktion "New-IntuneWin32AppRequirementRule". Hier heißt es nicht mehr "MinimumSupportedOperatingSystem", sondern in der aktuellen Version (1.4.1) des Moduls "IntuneWin32App" lautet der Parameter "MinimumSupportedWindowsRelease".
Der zweite Fehler tritt bei der Erstellung der Dependency auf:
Add-IntuneWin32AppDependency : Die Benennung "Get-IntuneWin32AppRelationExistence" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern
enthalten), und wiederholen Sie den Vorgang.
Hast du hierzu vielleicht eine Idee?
Viele Grüße
Sven
Hoi Sven, das ist korrekt. Da hat sich etwas getan.
Gibt mir bis heute Abend Zeit und ich aktuallisiere das Skript, so dass du es morgen von GitHub herunterladen und testen kannst.
Update is done.
But the dependency is still not working cause of an issue with the Module "IntuneWin32App". The issue will be fixed in the next release (v1.4.2)
Zum zweiten Fehler:
Die ps1 mit der Funktion "Get-IntuneWin32AppRelationExistence" habe ich im Private-Ordner des Moduls "IntuneWin32App" gefunden. Ich habe es von dort in den Ordner "C:\Program Files\WindowsPowerShell\Scripts" kopiert. Damit funktioniert es. Jedoch wird dann bei der Ausführung deines Scripts eine Warnung beim Hinzufügen der Dependency generiert (ca.: "Es existiert bereits eine Supersedence, deswegen kann keine Dependency hinzugefügt werden" - so ungefähr). Hier ist noch ein Fehler in der Datei "Add-IntuneWin32AppDependency.ps1" in Zeile 66: Hier muss anstatt "$false" "$null" in der if-Schleife stehen.
Ich weiß nicht, wie ich dem Autor des Moduls diese Informationen mitteilen kann, damit er dies in seinem Modul anpasst, kennst du hier den richtigen Weg?`
Viele Grüße
Sven
Ja, die Funktion is im Privat Ordner vorhanden aber ncoh nciht ganz fertig. Ich war mit dem Author beriets im Austausch und er arbeitet am diesem Fix und ein zwei weiteren Funktionen die fürs Updaten der App hinzukommen.
Falls du direkt Feedback geben möchtetst, das trackbar ist, kannst du das hier: https://github.com/MSEndpointMgr/IntuneWin32App/issues