:

    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

    Script herunterladen

    #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)) {
        # Anzeige­namesuche, wenn keine Objekt-ID angegeben
        $identitySPList = Get-MgServicePrincipal -Filter "DisplayName eq '$ManagedIdentityName'"
        switch ($identitySPList.Count) {
            0 { Throw "Kein Dienstprinzipal mit dem angegebenen Anzeige­namen gefunden." }
            1 { $identityServicePrincipal = $identitySPList }
            default {
                Write-Error "Mehrere Dienstprinzipale mit gleichem Anzeige­namen 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