Get Graph Token
Zuletzt geändert: 20.03.2026 21:17

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 |