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
<#
.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