Get-GraphToken #
ÜBERSICHT #
Holt ein Microsoft Graph API Access-Token (Service- oder User-Flow).
SYNTAX #
Get-GraphToken [-TenantId] <string> [-ClientId] <string> [-ClientSecret] <string> [[-Scope]
<string>] [-UserScope] <string> [[-RedirectUri] <string>] [[-TokenPath] <string>]
[<CommonParameters>]
BESCHREIBUNG #
Zentrale Token-Funktion für alle Graph-API-Operationen. Unterstützt zwei Flows:
Service-Flow (Client Credentials): Direkter Token-Abruf ohne Benutzerinteraktion. Geeignet für Server, Cronjobs und Hintergrundprozesse. Hat Zugriff auf alle Postfächer im Tenant. Benötigt TenantId, ClientId und ClientSecret.
User-Flow (OAuth2 PKCE): Interaktive Anmeldung über den Browser. Beim ersten Aufruf öffnet sich der Browser zur Anmeldung, danach läuft alles automatisch per Refresh-Token. Zugriff nur auf das eigene Postfach (/me). Benötigt nur die ClientId.
EINRICHTUNG IM AZURE PORTAL (https://portal.azure.com) ======================================================
SCHRITT 1: App registrieren Azure Portal -> “Microsoft Entra ID” -> “App-Registrierungen” -> “Neue Registrierung” - Name: z.B. “EULANDA Graph” - Kontotypen: “Nur Konten in diesem Organisationsverzeichnis” - Registrieren -> Die “Anwendungs-ID (Client)” auf der Übersichtsseite ist die ClientId -> Die “Verzeichnis-ID (Mandant)” ist die TenantId
SCHRITT 2: API-Berechtigungen hinzufügen App -> “API-Berechtigungen” -> “Berechtigung hinzufügen” -> “Microsoft Graph”
Für den SERVICE-FLOW ("Anwendungsberechtigungen" wählen):
- Mail.Send (zum E-Mail-Versand)
- Contacts.ReadWrite (zum Kontakt-Sync)
-> Danach "Administratorzustimmung erteilen" klicken (Pflicht!)
Für den USER-FLOW ("Delegierte Berechtigungen" wählen):
- Mail.Send
- Contacts.ReadWrite
- offline_access (für automatische Token-Erneuerung)
-> Administratorzustimmung ist optional, Benutzer kann selbst zustimmen
SCHRITT 3a: Client Secret erstellen (nur für Service-Flow) App -> “Zertifikate und Geheimnisse” -> “Neuer geheimer Clientschlüssel” - Beschreibung und Ablaufdatum wählen - “Hinzufügen” -> Den “Wert” sofort kopieren (wird nur einmal angezeigt!) = ClientSecret
SCHRITT 3b: Redirect-URI einrichten (nur für User-Flow) App -> “Authentifizierung” -> “Plattform hinzufügen” - “Mobilgerät- und Desktopanwendungen” wählen (NICHT “Web”!) - Benutzerdefinierte Redirect-URI eingeben: http://localhost:8080/ -> Unter “Erweiterte Einstellungen”: “Öffentliche Clientflows zulassen” auf JA setzen - Speichern
Hinweis: Beide Flows können parallel in derselben App eingerichtet werden. Die App braucht dann sowohl das Client Secret (Schritt 3a) als auch die Redirect-URI (Schritt 3b).
VERWENDUNG ==========
Service-Flow (alle drei Parameter Pflicht): $token = Get-GraphToken -TenantId ‘…’ -ClientId ‘…’ -ClientSecret ‘…’ # Token ist sofort gültig, kein Browser, kein Cache
User-Flow (nur ClientId + Scope): $token = Get-GraphToken -ClientId ‘…’ -UserScope ‘Contacts.ReadWrite offline_access’ # Erster Aufruf: Browser öffnet sich zur Anmeldung # Folgende Aufrufe: Token wird automatisch aus Cache/Refresh geladen
PARAMETER #
-TenantId #
Type: string
Azure Verzeichnis-ID (Mandanten-ID). Zu finden im Azure Portal unter “Microsoft Entra ID” -> “Übersicht” oder auf der Übersichtsseite der App. Nur für den Service-Flow erforderlich.
-ClientId #
Type: string
Anwendungs-ID (Client-ID) der registrierten Azure-App. Zu finden im Azure Portal unter App-Registrierungen -> [App-Name] -> “Übersicht”. Für beide Flows erforderlich.
-ClientSecret #
Type: string
Geheimer Clientschlüssel der Azure-App. Wird unter “Zertifikate und Geheimnisse” erstellt. Der Wert wird nur einmal angezeigt – sofort kopieren! Nur für den Service-Flow erforderlich.
-Scope #
Type: string
Default: 'https://graph.microsoft.com/.default'
OAuth2 Scope für den Service-Flow. Default: “https://graph.microsoft.com/.default" (alle konfigurierten Application Permissions). Muss normalerweise nicht geändert werden.
-UserScope #
Type: string
OAuth2 Scope für den User-Flow. Leerzeichen-getrennte Liste der benötigten Berechtigungen. “offline_access” sollte immer dabei sein (für Refresh-Token). Beispiele: “Contacts.ReadWrite offline_access” (Kontakt-Sync) “Mail.Send offline_access” (E-Mail-Versand) “Contacts.ReadWrite Mail.Send offline_access” (beides)
-RedirectUri #
Type: string
Default: 'http://localhost:8080/'
Redirect-URI für den User-Flow. Default: “http://localhost:8080/”. Muss exakt mit der im Azure Portal konfigurierten URI übereinstimmen.
-TokenPath #
Type: string
Pfad zur Token-Datei für den User-Flow. Default: automatisch aus Scope abgeleitet ($env:APPDATA\Eulanda\graph-{scope-hash}.json). Verschiedene Scopes verwenden automatisch verschiedene Token-Dateien.
AUSGABEN #
string
Der access_token (Bearer-Token) als String. Kann direkt als Authorization-Header verwendet werden: “Bearer $token”
BEISPIELE #
# Service-Flow: Token für Hintergrundprozesse (Server, Cronjob)
$token = Get-GraphToken -TenantId '0230650c-...' -ClientId 'c081dca9-...' -ClientSecret 'dhg8Q~...'
# Damit auf ein bestimmtes Postfach zugreifen (z.B. Kontakt-Sync):
Export-EulandaContactToOutlook -Token $token -Conn $conn `
-AddressMatch 'MUSTERKUNDE' -FolderName 'EULANDA' -CreateFolder `
-UserEmail 'benutzer@firma.de'
# User-Flow: Interaktive Anmeldung (Arbeitsplatz, eigenes Postfach)
$token = Get-GraphToken -ClientId 'c081dca9-...' -UserScope 'Contacts.ReadWrite offline_access'
# -> Browser öffnet sich, als eigener Benutzer anmelden
# -> Token wird gespeichert, nächster Aufruf braucht keinen Browser mehr
# Damit auf das eigene Postfach zugreifen (kein -UserEmail nötig):
Export-EulandaContactToOutlook -Token $token -Conn $conn `
-AddressMatch 'MUSTERKUNDE' -FolderName 'EULANDA' -CreateFolder
# User-Flow: Token-Cache löschen (z.B. bei Benutzer-Wechsel)
Remove-Item "$env:APPDATA\Eulanda\graph-*" -Force
$token = Get-GraphToken -ClientId 'c081dca9-...' -UserScope 'Contacts.ReadWrite offline_access'
# -> Browser öffnet sich erneut zur Anmeldung
HINWEISE #
Übersicht der beiden Flows:
| Merkmal | Service-Flow | User-Flow (PKCE) | |———————-|————————–|—————————-| | Parameter | TenantId+ClientId+Secret | ClientId+UserScope | | Interaktion | Keine | Browser (einmalig) | | Token-Cache | Keiner (jedes Mal neu) | Datei mit Refresh-Token | | API-Pfad | /users/{email}/… | /me/… | | -UserEmail nötig | Ja | Nein | | Azure Permission | Anwendungsberechtigung | Delegierte Berechtigung | | Admin-Consent nötig | Ja | Nein | | Postfach-Zugriff | Alle im Tenant | Nur eigenes | | Typischer Einsatz | Server, Cronjob | Arbeitsplatz, interaktiv |