Immer wieder treffe ich die Situation an, dass Kunden vordefinierte Desktop Verknüpfungen für Programme, Webseiten oder Webapplikationen verteilt haben möchten. Um diese effizient zu verteilen und aktualisieren zu können, habe ich ein PowerShell Script erstellt, welches mir die Desktop Verknüpfung(en) mit Intune, wenn gewünscht mit einem spezifischen Icon verteilt. Das Ganze packe ich dann in eine win32 Applikation, um auch mit Versionen zu arbeiten.
Table of Contents
- Vorbereitung
- Verteilung - PowerShell Script
- Die Erkennungsregel
- Intune win32 Paket
- Installations-Demo (Unternehmensportal)
Vorbereitung
Hier findest du meine Vorlage inklusive zweier Beispiel Verknüpfungen: GitHub - scloud/DesktopShortcut
Meine Lösung bietet die Möglichkeit, entweder vordefinierte Verknüpfungen zu verwenden oder diese in einem CSV zu pflegen.
Die vordefinierten Verknüpfungen kannst du einfach unter ".\Desktop" ablegen. Achte dabei darauf, dass wenn Icons hinterlegt sind, diese nur funktionieren, solange sie auch auf dem Zielsystem, am entsprechenden Ort vorhanden sind.
Im CSV (link-list.csv) musst du lediglich den Verknüpfungsnamen, den Link und das Icon angeben. Das Icon legst du im Ordner "icon" ab.
Verteilung - PowerShell Script
Durch das File "install.ps1" wird die gesamte Verteilung abgehandelt.
In einem ersten Schritt definiere ich den Paketnamen sowie die Version. Zudem starte ich ein Transkript des Ablaufs, um ein Log lokal auf dem Gerät zu haben.
$PackageName = "DesktopIcon_SLZ"
$Version = "1"
$Path_local = "$Env:Programfiles\MEM"
Start-Transcript -Path "$env:ProgramData\Microsoft\IntuneManagementExtension\Logs\$PackageName-install.log" -Force
Code language: PowerShell (powershell)
Im zweiten Schritt definiere und erstelle ich die Pfade beziehungsweise Ordner, welche ich für die Verknüpfungen und Icons benötige.
# Paths
$DesktopTMP = "$Path_local\Data\Desktop\$PackageName"
$DesktopIcons = "$Path_local\Data\icons\$PackageName"
# Create Folders
New-Item -Path $DesktopTMP -ItemType directory -force
New-Item -Path $DesktopIcons -ItemType directory -force
New-Item -Path "C:\Users\Public\Desktop" -ItemType directory -force
Code language: PowerShell (powershell)
Als drittes entferne ich mögliche Vorgänger-Versionen des Pakets, dessen Verknüpfungen auf dem Desktop sowie Icons im lokalen Ordner.
# Remove old shortcuts and icons
$OLD_Items = Get-ChildItem -Path $DesktopTMP
foreach($OLD_Item in $OLD_Items){
Remove-Item "C:\Users\Public\Desktop\$($OLD_Item.Name)" -Force
}
Remove-Item "$DesktopTMP\*" -Force
Remove-Item "$DesktopIcons\*" -Force
Code language: PowerShell (powershell)
Im vierten Schritt kopiere ich alle vordefinierten Icons aus dem Ordner "Desktop" in den temporären lokalen Ordner auf dem PC.
# Copy New shortcuts
Copy-Item -Path ".\Desktop\*" -Destination $DesktopTMP -Recurse
Copy-Item -Path ".\icons\*" -Destination $DesktopIcons -Recurse
Code language: PowerShell (powershell)
Anschliessen lese ich das CSV ein und erstelle die definierten Verknüpfungen ebenfalls im temporären Desktop-Ordner.
# shortcuts from list
$shortcuts = Import-CSV "link-list.csv"
foreach($shortcut in $shortcuts){
$WshShell = New-Object -comObject WScript.Shell
$Shortcut_file = $WshShell.CreateShortcut("$DesktopTMP\$($shortcut.name).lnk")
$Shortcut_file.TargetPath = $shortcut.link
$Shortcut_file.IconLocation = "$DesktopIcons\$($shortcut.icon)"
$Shortcut_file.Save()
}
Code language: PowerShell (powershell)
Nach des Kopiervorgangs und der Erstellung aller Verknüpfungen kopiere ich diese in den Public Desktop des Gerätes.
# Copy icons to public Desktop
Copy-Item -Path "$DesktopTMP\*" -Destination "C:\Users\Public\Desktop" -Recurse
Code language: PowerShell (powershell)
Zum Abschluss erstelle ich eine Datei die als Erkennungsregel fungiert und die Version meines Paketes beinhaltet. Zudem stoppe ich das Transkript.
# Validation
New-Item -Path "$Path_local\Validation\$PackageName" -ItemType "file" -Force -Value $Version
Stop-Transcript
Code language: PowerShell (powershell)
Die Erkennungsregel
Die Erkennungsregel liest die Validierungsdatei und zudem dessen Inhalt aus und vergleicht diesen mit der Versionsnummer. Ist alles korrekt, wird dies so an Intune rapportiert. Falls du den PackageName oder die Version im "install.ps1" anpasst, musst du dies auch im "check.ps1" machen.
$PackageName = "DesktopIcon_SLZ"
$Version = "1"
$Path_local = "$Env:Programfiles\MEM"
$ProgramVersion_current = Get-Content -Path "$Path_local\Validation\$PackageName"
if($ProgramVersion_current -eq $Version){
Write-Host "Found it!"
}
Code language: PowerShell (powershell)
Intune win32 Paket
Mit dem Intune Win32 Prep Tool wird das Paket, nachdem das CSV und oder der Desktop Ordner abgefüllt ist erstellt:
Anschliessend laden wir die erstellte Datei "install.intunewin" im MEM/Intune hoch und setzten die entsprechenden Parameter. (rot zwingend, orange Optional, aber hilfreich, wenn das Unternehmensportal genutzt wird.)
Name | DesktopShortcuts oder individuell |
Beschreibung | Hinweis zu den Verknüpfungen |
Herausgeber | individuell |
Icon | frei wählbar |
Installations-Befehl | %SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -command .\install.ps1 |
Deinstallations-Befehl | %SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe -executionpolicy bypass -command .\uninstall.ps1 |
Anforderungen | x64 und 2004 (Windows Version nicht relevant) |
Erkennungsregel | custom script, check.ps1 |
Abhängigkeit | keine |
Zuweisung | je nach Anforderung |
Möchtest du die Verknüpfung/en gleich automatisiert hochladen?
Dann habe ich hier einen Beitrag für dich: win32 App Deployment automatisiert
Installations-Demo (Unternehmensportal)
Dies ist der Installations Prozess via Unternehmensportal, wobei der Benutzer die Installation anstösst. Ebenso funktioniert die Verteilung via Targeting. Der Prozess, mit Intune eine Desktop Verknüpfung mit Icon zu verteilen ist so sehr einfach und praktikabel. Auch Updates sind schnell umgesetzt.
Nur wie soll das gehen wenn ich die Files alle auf einem Client liegen habe außerhalb vom AzureAD
CLient (dort liegen alle Files) => Intunes => verteilt auf XY PCs die irgendwo im Netz stehen wo der CLient (mit dem ich Intunes bediene) keinen Zugriff hat.
Warum gibt es nicht einfach einen simple Upload Button für Files zum Verteilen über Intunes.
Damit das funktioniert müsste im gesamten install.intunewin Paket alles drin sein
- trigger (auslöser der Installation)
- script
- datenfiles
- icons
etc.
Nur wenn ich das so erstelle also den Script wird ein Script in Intunes ausgeführt wo ja die Datengrundlage fehlt. Was soll er verteilen was nicht vorhanden ist.
Darum wird aus dem ganzen Paket ein "intunewin"-File erstellt, welches die icons, Verknüpfungen etc. beinhaltet. (Ähnlich wie ein ZIP)
Dadurch können die Verknüpfungen auch ortsunabhängig verteilt werden.