:

    Ablaufende App-Secrets und -Zertifikate finden

    In diesem Video aus unserer Reihe zu Entra ID zeigen wir das Script zum Auslesen ablaufender Entra App-Zugangsdaten. Also Zertifikate und Secrets, die demnächst nicht mehr gültig sind.



    Mit dem Script werden entweder alle zukünftig ablaufenden oder nur die bereits abgelaufenen App-Credentials ausgelesen und als CSV abgespeichert werden.

    Benötigst du Unterstützung?

    Melde dich bei uns!



    Get-ExpiringAppCredentials.ps1

    Script herunterladen

    <#
    .SYNOPSIS
       Abrufen ablaufender und abgelaufener Geheimnisse und Zertifikate für Entra ID App-Registrierungen
    
    .DESCRIPTION
       Dieses Skript stellt eine Verbindung zu Microsoft Graph her (ohne Willkommensbanner), durchsucht alle App-Registrierungen im Tenant
       und exportiert Anmeldeinformationen (Passwörter und Zertifikate), die entweder bereits abgelaufen sind
       oder innerhalb eines konfigurierbaren Schwellenwerts ablaufen. Die CSV-Ausgabe erfolgt mit UTF-8 BOM,
       damit Umlaute in Excel korrekt dargestellt werden. Am Ende wird die Verbindung wieder getrennt (stille Beendigung).
    
    .PARAMETER DaysThreshold
       Anzahl der Tage, innerhalb deren ablaufende Secrets und Zertifikate als „Expiring Soon“ angezeigt werden. Standard: 30
    
    .PARAMETER IncludeExpired
       Schließt bereits abgelaufene Secrets und Zertifikate zusätzlich zu den bald ablaufenden ein.
    
    .PARAMETER OutputPath
       Pfad und Dateiname der exportierten CSV-Datei. Standard: .\ExpiringCredentials.csv
    
    .NOTES
      Version:        1.2
      Author:         Thomas Thaler, itelio GmbH
      Creation Date:  2025-07-03
      Purpose/Change: Hinzugefügt: erweiterte Parametrisierung, Fortschrittsanzeige, Fehlerbehandlung,
                      verbesserte Ausgabeformatierung, Unterstützung für abgelaufene Anmeldeinformationen.
    #>
    [CmdletBinding()]
    param(
        [Parameter(Position=0, Mandatory=$false, HelpMessage="Anzahl der Tage für bevorstehende Ablaufdaten (Standard: 30).")]
        [ValidateRange(0,3650)]
        [int] $DaysThreshold = 30,
    
        [Parameter(Mandatory=$false, HelpMessage="Schließt bereits abgelaufene Anmeldeinformationen ein.")]
        [switch] $IncludeExpired,
    
        [Parameter(Mandatory=$false, HelpMessage="Pfad für die CSV-Ausgabedatei.")]
        [string] $OutputPath = ".\ExpiringCredentials.csv"
    )
    
    # Verbindung zu Microsoft Graph herstellen ohne Willkommensbanner
    try {
        Connect-MgGraph -Scopes "Application.Read.All" -NoWelcome
    } catch {
        Write-Error "Verbindung zu Microsoft Graph fehlgeschlagen. Überprüfen Sie die Installation des Microsoft.Graph PowerShell SDK und die Berechtigungen."
        exit 1
    }
    
    # Schwellenwerte berechnen
    $now = Get-Date
    $thresholdDate = $now.AddDays($DaysThreshold)
    
    # Alle App-Registrierungen abrufen
    $applications = Get-MgApplication -All
    $totalApps = $applications.Count
    $currentIndex = 0
    
    # Ergebnissammlung vorbereiten
    $results = @()
    
    foreach ($app in $applications) {
        # Fortschrittsanzeige aktualisieren
        $currentIndex++
        $percent = [math]::Round(($currentIndex / $totalApps) * 100)
        Write-Progress -Activity "Scanne Entra ID App-Registrierungen" -Status "Verarbeite $currentIndex von $($totalApps): $($app.DisplayName)" -PercentComplete $percent
    
        $appId = $app.AppId
        $appName = $app.DisplayName
    
        # Passwort-Credentials prüfen
        foreach ($cred in $app.PasswordCredentials) {
            $isExpired = $cred.EndDateTime -le $now
            $isImpending = ($cred.EndDateTime -gt $now) -and ($cred.EndDateTime -le $thresholdDate)
    
            # Laufende und ggf. abgelaufene Anmeldeinformationen einbeziehen
            if ($isImpending -or ($IncludeExpired.IsPresent -and $isExpired)) {
                $status = if ($isExpired) { 'Abgelaufen' } else { "Läuft in $DaysThreshold Tagen ab" }
                $results += [PSCustomObject]@{
                    AppId          = $appId
                    DisplayName    = $appName
                    CredentialType = 'Secret'
                    KeyId          = $cred.KeyId
                    StartDateTime  = $cred.StartDateTime
                    EndDateTime    = $cred.EndDateTime
                    Status         = $status
                }
            }
        }
    
        # Zertifikats-Credentials prüfen
        foreach ($cred in $app.KeyCredentials) {
            $isExpired = $cred.EndDateTime -le $now
            $isImpending = ($cred.EndDateTime -gt $now) -and ($cred.EndDateTime -le $thresholdDate)
    
            # Laufende und ggf. abgelaufene Anmeldeinformationen einbeziehen
            if ($isImpending -or ($IncludeExpired.IsPresent -and $isExpired)) {
                $status = if ($isExpired) { 'Abgelaufen' } else { "Läuft in $DaysThreshold Tagen ab" }
                $results += [PSCustomObject]@{
                    AppId          = $appId
                    DisplayName    = $appName
                    CredentialType = 'Zertifikat'
                    KeyId          = $cred.KeyId
                    StartDateTime  = $cred.StartDateTime
                    EndDateTime    = $cred.EndDateTime
                    Status         = $status
                }
            }
        }
    }
    
    # Fortschrittsanzeige löschen
    Write-Progress -Activity "Scanne Entra ID App-Registrierungen" -Completed
    
    # Ergebnisse ausgeben oder exportieren
    if (-not $results) {
        # Keine Matches
        Write-Host "Keine passenden Anmeldeinformationen gefunden." -ForegroundColor Yellow
    } else {
        # Nach EndDateTime sortieren und als CSV mit Semikolon exportieren (UTF-8 mit BOM)
        $results |
            Sort-Object EndDateTime |
            Export-Csv -Path $OutputPath -Delimiter ';' -NoTypeInformation -Encoding UTF8BOM
    
        # Erfolgsmeldung
        Write-Host "Exportiert $($results.Count) Anmeldeinformation(en) nach $OutputPath" -ForegroundColor Green
    }
    
    # Verbindung zu Microsoft Graph trennen und Ausgabe unterdrücken
    Disconnect-MgGraph *>$null