Powershell-Runbook sicher authentifizieren
In diesem Video erfährst du, wie du ein Powershell Runbook in Azure Automation mit Entra authentifizierst. Du lernst, wie du eine System Assigned Managed Identity einrichtest, Berechtigungen vergibst und das Runbook so konfigurierst, dass es ohne manuelle Anmeldung am Entra arbeitet. Dieses Video baut auf dem vorherigen Teil der Reihe auf, in dem wir ein erstes Powershell Runbook erstellt haben. Jetzt gehen wir einen Schritt weiter und ermöglichen dem Runbook den Zugriff auf Microsoft Graph.
Benötigst du Unterstützung?
Melde dich bei uns!
Hier findest du das im Video gezeigte Script.
Set-ServicePrincipalPermissions.ps1
#Modul installieren, wenn nicht vorhanden
<#
.SYNOPSIS
Ordnet einer vorhandenen Managed Identity die angegebenen Microsoft Graph-Anwendungsberechtigungen (AppRoles) zu.
.DESCRIPTION
Dieses Skript:
1. Prüft und installiert erforderliche PowerShell-Module.
2. Verbindet mit Microsoft Graph als Privileged Role Administrator.
3. Ermittelt den Dienstprinzipal von Microsoft Graph.
4. Ermittelt den Dienstprinzipal der Managed Identity.
5. Filtert Graph-AppRoles nach der Liste benötigter Berechtigungen.
6. Ordnet jede AppRole der Managed Identity zu.
.NOTES
Version: 1.0
Author: Thomas Thaler, itelio GmbH
Creation Date: 2025-06-03
Purpose/Change: Erstellung
Prerequisites: Microsoft.Graph.Authentication, Microsoft.Graph.Applications
Privileged Role Administrator-Rechte erforderlich.
#>
#region KONFIGURATION
# Azure Tenant-ID
$TenantId = "TENANT_ID_HIER_EINFÜGEN" # z.B. "c1a2b3d4-5678-90ab-cdef-EXAMPLE"
# Anzeigename der Managed Identity (exakte Übereinstimmung)
$ManagedIdentityName = "MANAGED_IDENTITY_NAME_HIER_EINFÜGEN" # z.B. "MyManagedIdentity"
# Optional: Objekt-ID der Managed Identity (wird bevorzugt, wenn angegeben)
$ManagedIdentityObjectId = "" # z.B. "c1a2b3d4-..."
# Liste der Graph-AppRole-Werte, die zugewiesen werden sollen
$RequiredPermissions = @(
"User.Read.All",
"Group.Read.All"
# Hier Einträge hinzufügen oder entfernen
)
#endregion
#region ABHÄNGIGKEITEN
# Ermitteln und Installation fehlender Module
$requiredModules = @(
'Microsoft.Graph.Authentication',
'Microsoft.Graph.Applications'
)
foreach ($module in $requiredModules) {
if (-not (Get-Module -ListAvailable -Name $module)) {
Write-Host "Modul '$module' nicht gefunden. Installiere..." -ForegroundColor Yellow
Install-Module -Name $module -Scope CurrentUser -Force -ErrorAction Stop
}
}
# Module laden
Import-Module Microsoft.Graph.Authentication
Import-Module Microsoft.Graph.Applications
#endregion
#region 🔗 VERBINDUNG MIT GRAPH
# Aufbau der Verbindung zu Microsoft Graph
Connect-MgGraph `
-TenantId $TenantId `
-Scopes "AppRoleAssignment.ReadWrite.All","Application.Read.All"
#endregion
#region DIENSTPRINZIPALE SUCHEN
# Dienstprinzipal von Microsoft Graph ermitteln
$graphServicePrincipal = Get-MgServicePrincipal -Filter "DisplayName eq 'Microsoft Graph'"
if (-not $graphServicePrincipal) {
Throw "Dienstprinzipal für Microsoft Graph nicht gefunden."
}
# Dienstprinzipal der Managed Identity ermitteln
if ([string]::IsNullOrEmpty($ManagedIdentityObjectId)) {
# Anzeigenamesuche, wenn keine Objekt-ID angegeben
$identitySPList = Get-MgServicePrincipal -Filter "DisplayName eq '$ManagedIdentityName'"
switch ($identitySPList.Count) {
0 { Throw "Kein Dienstprinzipal mit dem angegebenen Anzeigenamen gefunden." }
1 { $identityServicePrincipal = $identitySPList }
default {
Write-Error "Mehrere Dienstprinzipale mit gleichem Anzeigenamen gefunden. Bitte Objekt-ID in \$ManagedIdentityObjectId angeben."
Throw
}
}
} else {
# Direkte Abfrage per Objekt-ID
$identityServicePrincipal = Get-MgServicePrincipal -ServicePrincipalId $ManagedIdentityObjectId
if (-not $identityServicePrincipal) {
Throw "Dienstprinzipal mit Objekt-ID '$ManagedIdentityObjectId' nicht gefunden."
}
}
#endregion
#region ZUWEISUNG DER APP-ROLLEN
# Filterung der AppRoles nach den erforderlichen Berechtigungen
$appRolesToAssign = $graphServicePrincipal.AppRoles |
Where-Object { $_.Value -in $RequiredPermissions }
if (-not $appRolesToAssign) {
Write-Warning "Keine passenden AppRoles für die angegebenen Berechtigungen gefunden."
return
}
# Erstellen der AppRole-Zuweisungen
foreach ($role in $appRolesToAssign) {
$assignment = @{
principalId = $identityServicePrincipal.Id # ID der Managed Identity
resourceId = $graphServicePrincipal.Id # ID der Microsoft Graph-Anwendung
appRoleId = $role.Id # ID der AppRole
}
New-MgServicePrincipalAppRoleAssignment `
-ServicePrincipalId $identityServicePrincipal.Id `
-BodyParameter $assignment `
-Verbose
}
Write-Host "Alle angeforderten Berechtigungen wurden der Managed Identity zugewiesen."
#endregion