Um Automatisierungen werden wir (und wollen hoffentlich auch nicht) herumkommen.
Eine Azure Automation authentifiziert mit einer Managed Identity bieten Unternehmen effiziente Möglichkeiten zur Automatisierung von Prozessen und zur sicheren Verwaltung von Zugriffsrechten in der Cloud. Azure Automation ermöglicht die Automatisierung von Routineaufgaben durch Skripte und Runbooks, während Managed Identities die Authentifizierung erleichtern und die Sicherheit erhöht.

In diesem Beitrag werde ich ein Automatisierungs-Beispiel aufbauen, welches und über Geräte in Intune informiert, welche seit 180 Tagen oder mehr inaktiv waren. Die Meldung wird dann direkt ein einen definierten Teams Channel gepostet.

Table of Contents

Was wir alles brauchen

Um dieses Automatisierungs-Beispiel umzusetzen, benötigst du ein paar verschiedene Ressourcen.
Dies sind:

  • Das Script selbst
  • Azure Subscription
  • Azure Automation Account
    • mit Aktiver Managed Identity
  • Teams Channel
    • Incoming Webhook

Das PowerShell Script

Die Script-Routine authentifiziert sich als erstes via Managed Identity und fragt dann alle Geräte aus Intune anhand der letzten Synchronisationszeit (lastSyncDateTime) ab. Der Wert ist in der Vorlage auf 180 Tage gestellt, um diesen zu ändern passe einfach die Zeile "7" an.

Anschliessend werden die alten Geräte, falls vorhanden, via Webhook an einen von dir definierten Teams Channel gesendet. Die Webhook URL des teams Channels definierst du in der Zeile "10".

Das fertige Script, findest du in meinem GitHub Repository:

Um Scripts und Routinen zu entwickeln und zu testen, verwende ich jeweils die manuelle Authentifizierung, ganz klassisch mit Benutzername, Passwort und MFA.
Dazu kannst du einfach den Connect Befehl in den ersten fünf Zeile durch "Connect-MgGraph -Scopes "DeviceManagementManagedDevices.Read.All"" ersetzen.

Erstellung Automation Account

Um einen Automation Account zu erstellen, benötigst du eine aktive Azure Subscription. Hast du diese, erstellst du ihn so:

  1. Wähle unter "portal.azure.com" > "+Create a resource" und suche nach "automation account"
  2. Dort wählst du "create" und wählst die Azure Subscription aus, in welcher du den Account erstellen möchtest
    • Falls du noch keine Ressource Gruppe hast, oder eine neue erstellen möchtest, kannst du das auch gleich hier machen.
    • Anschliessend vergibst du den Account einen Namen und wählst die Region aus.
  3. Auf der nächsten Seite ist wichtig, dass du unter Managed Identities "System assigned" aktiv hast.
  4. Den rest kannst du "Default" lassen
  5. Zum Schluss bekommst du eine Übersicht, die etwas so aussieht und bestätigt werden muss:

Durch das Anwählen der Managed Identity wir uns nach der Erstellung der Azure Ressource automatisch im Azure AD in den Enterprise Applications eine Identity angelegt:

Managed Identity in Azure AD

Managed Identity berechtigen

Die im vorherigen Schritt automatisch erstellte Identity müssen wir nun noch so berechtigen, dass sie unsere Geräte aus Intune auslesen darf.
Leier gibt es dazu keine Funktion im UI, mit PowerShell ist das Ganze aber sehr einfach und schnell erledigt.

Als Voraussetzung musst du bei dir das Microsoft Graph PowerShell Modul installiert haben.
Dieses kannst du so installieren:

Install-Module Microsoft.Graph -Scope CurrentUser
Code language: CSS (css)

Um nun die Berechtigung der Managed Identity zu setzen, habe ich dir nachstehend das Script für unser Beispiel vorbereitet. Falls du andere Berechtigungen vergeben möchtest, musst du diese lediglich in der Zeile "15+" ergänzen.

# Connect to Microsoft Graph
Connect-MgGraph -Scopes "Application.Read.All","AppRoleAssignment.ReadWrite.All,RoleManagement.ReadWrite.Directory"

# Select beta profile
Select-MgProfile Beta

# You will be prompted for the Name of you Managed Identity
$MdId_Name = Read-Host "Name of your Managed Identity"
$MdId_ID = (Get-MgServicePrincipal -Filter "displayName eq '$MdId_Name'").id

# Adding Microsoft Graph permissions
$graphApp = Get-MgServicePrincipal -Filter "AppId eq '00000003-0000-0000-c000-000000000000'"

# Add the required Graph scopes
$graphScopes = @(
  "DeviceManagementManagedDevices.Read.All"
)
ForEach($scope in $graphScopes){
  $appRole = $graphApp.AppRoles | Where-Object {$_.Value -eq $scope}

  if ($null -eq $appRole) { Write-Warning "Unable to find App Role for scope $scope"; continue; }

  # Check if permissions isn't already assigned
  $assignedAppRole = Get-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $MdId_ID | Where-Object { $_.AppRoleId -eq $appRole.Id -and $_.ResourceDisplayName -eq "Microsoft Graph" }

  if ($null -eq $assignedAppRole) {
    New-MgServicePrincipalAppRoleAssignment -PrincipalId $MdId_ID -ServicePrincipalId $MdId_ID -ResourceId $graphApp.Id -AppRoleId $appRole.Id
  }else{
    write-host "Scope $scope already assigned"
  }
}

Code language: PHP (php)

Falls du mal irgendwo einen Fehler gemacht haben solltest und die Berechtigungen löschen möchtest, kannst du das mit den nachstehenden Zeilen machen:

# Removing all Graph scopes
$MdId_permissions = Get-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $MdId_ID
ForEach($Assignment in $MdId_permissions){
  Remove-MgServicePrincipalAppRoleAssignment -AppRoleAssignmentId $Assignment.Id -ServicePrincipalId $MdId_ID
}
Code language: PHP (php)

Vorbereitung Teams Channel für Reporting

Falls das Script inaktive Geräte finden sollten, möchten wir auch darüber informer werden und nicht den output in der Azure Automation kontrollieren müssen. Dazu erstellen wir einen "Incoming Webhook" in einem Team Channel, an welchen wir den Report senden werden.

Dazu navigierst du im gewünschten Team auf den Channel und wählst "Connectors" aus und konfigurierst den "Incoming Webhook".

Diesem musst du dann nur einen Namen geben und "Create" klicken. Kurz daraufhin erscheint auch schon die URL, welche wir in unserem Script (MgId_getOldDevices.ps1) hinterlegen.

Module der Azure Automation hinzufügen

In den Azure Automations sind nicht automatische alle PowerShell Module vorhanden. Wir müssen diese zuerst hinzufügen. In unserem Fall brauchen wir aber nur eines:

  • Microsoft.Graph.Authentication

Hinzufügen kannst du sie im Automation Account unter "Modules".

Falls du mehrere Graph Module hinzufügst, weil du z.B. einen Befehl wie "Get-MgDeviceManagementManagedDevice" nutzen möchtest, füge zuerst das Modul "Microsoft.Graph.Authentication" hinzu. Denn dieses und alle anderen Graph Module haben eine Abhängigkeit dazu.

Add PowerShell Module to Azure Automation

Script in der Azure Automation einfügen

Nun haben wir alle Voraussetzungen, um das Script auf Azure zu hinterlegen und zu testen.

In Azure fügst du es nun in deinem "Automation Account" unter "Runbook" hinzu:

Azure Automation, Runbook hinzufügen

Sobald dieses erstellt wurde, kannst du den Inhalt des von dir mit der URL des Webhooks angepassten Script einfügen und das Runbook abspeichern und veröffentlichen:

Azure Automation, Runbook veröffentlichen

Zum Testen kannst du dann einfach auf der Übersicht "Start" drücken und solltest nach kurzer Zeit (wenn es alte Geräte in deiner Umgebung hat) eine Teams Nachricht erhalten:

Azure Automation, Runbook starten
Device Report in Teams

Recap

Eine Azure Automation, welche sich via Managed Identity authentifiziert, ist eine hervorragende und sichere Möglichkeit für deine Automatisierungen. Einer der grössten Vorteile gegenüber zum Beispiel Authentifizierungen mit einem App Secret ist, dass die Managed Identity nicht abläuft. Solange die Azure Ressource besteht, wird auch die Authentifizierung von dieser aus funktionieren. Ein weiteres Plus, die Authentifizierung kann nicht übertragen oder auf einem anderen System genutzt werden.