Auf macOS/Linux nutzt Connect-MgGraph den interaktiven Loopback-Browser-Flow (http://localhost:<zufälliger Port>). Ohne registrierte Loopback-URI scheitert der Login mit AADSTS50011. Setup-AppRegistration.ps1 legt jetzt zusätzlich http://localhost an (portagnostisch); App-Registration.md dokumentiert es. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
157 lines
7.1 KiB
Markdown
157 lines
7.1 KiB
Markdown
# App-Registrierung & Berechtigungen
|
|
|
|
Der Intune Manager meldet sich als **delegierte** Anwendung an (Device-Code- bzw.
|
|
WAM-Login) — er handelt also immer **im Namen des angemeldeten Admins**, nie mit
|
|
Anwendungsrechten. Die App-Registrierung braucht daher **delegierte
|
|
Microsoft-Graph-Berechtigungen** plus die passende Authentifizierungs-Konfiguration.
|
|
|
|
> **Schnellweg:** Statt alles von Hand zu klicken, legt das Skript
|
|
> [`Setup-AppRegistration.ps1`](Setup-AppRegistration.ps1) die Registrierung
|
|
> komplett an (Rechte + Public-Client-Flow + Redirect-URIs + optional Consent).
|
|
> Siehe [Automatische Einrichtung](#automatische-einrichtung).
|
|
|
|
---
|
|
|
|
## Benötigte Berechtigungen
|
|
|
|
Alle Berechtigungen sind vom Typ **Delegiert** (Microsoft Graph).
|
|
|
|
### Kern (immer erforderlich)
|
|
|
|
| Berechtigung | Wofür |
|
|
|---|---|
|
|
| `Group.ReadWrite.All` | Gruppen anlegen, App-/Policy-Zuweisungen setzen |
|
|
| `GroupMember.ReadWrite.All` | Gruppenmitglieder lesen/hinzufügen/entfernen, CSV-Import |
|
|
| `User.Read.All` | Benutzersuche, UPN-Auflösung |
|
|
| `DeviceManagementApps.ReadWrite.All` | Apps auflisten, zuweisen, umbenennen, löschen, Setup-Datei aktualisieren, App-Report |
|
|
| `DeviceManagementConfiguration.ReadWrite.All` | Policies (Settings Catalog, Compliance, Konfigurationsprofile, Administrative Vorlagen) lesen, exportieren, importieren, zuweisen |
|
|
| `offline_access` | Refresh-Token (Device-Code-Flow) |
|
|
|
|
> `DeviceManagementConfiguration.ReadWrite.All` wird vom Tool automatisch zur
|
|
> Verbindung ergänzt — die App-Registrierung muss die Berechtigung aber besitzen
|
|
> und (Admin-)zugestimmt bekommen haben, sonst schlägt der Policy-Import mit
|
|
> `403 Forbidden` fehl.
|
|
|
|
### Geräte-Tab (optional)
|
|
|
|
Nur nötig, wenn der **Geräte-Tab** (Sync/Reboot/Lock/Diagnose/Wipe/Retire) genutzt wird:
|
|
|
|
| Berechtigung | Wofür |
|
|
|---|---|
|
|
| `DeviceManagementManagedDevices.Read.All` | Geräte auflisten und Details anzeigen, Spalte „Verwaltung" (Intune/Co-Managed) |
|
|
| `DeviceManagementServiceConfig.Read.All` | Autopilot-Status im Detail-Panel (Profil-Zuweisung / letzter Kontakt) |
|
|
| `DeviceManagementManagedDevices.ReadWrite.All` | Sync, Neustart, Remote-Lock, Diagnose, BitLocker-Key-Rotation |
|
|
| `DeviceManagementManagedDevices.PrivilegedOperations.All` | Wipe, Retire, Autopilot-Reset |
|
|
|
|
### Geräte-Offboarding (optional)
|
|
|
|
Nur nötig, wenn die **Offboarding**-Ansicht (Geräte aus Intune + Autopilot + Entra
|
|
entfernen, Recovery-Keys lesen) genutzt wird:
|
|
|
|
| Berechtigung | Wofür |
|
|
|---|---|
|
|
| `Device.ReadWrite.All` | Gerät aus Entra ID löschen/deaktivieren |
|
|
| `DeviceManagementManagedDevices.ReadWrite.All` | Gerät aus Intune löschen |
|
|
| `DeviceManagementServiceConfig.ReadWrite.All` | Autopilot durchsuchen und Gerät aus Autopilot löschen |
|
|
| `BitlockerKey.Read.All` | BitLocker-Recovery-Keys lesen |
|
|
| `DeviceLocalCredential.Read.All` | LAPS-Passwörter lesen |
|
|
|
|
> **Wichtig:** Löschen aus Entra/Intune/Autopilot benötigt bei delegierter
|
|
> Anmeldung zusätzlich **Verzeichnis-/Intune-Rollen** (Cloud Device Administrator
|
|
> bzw. Intune Administrator) — die Scopes allein reichen nicht, sonst `403`.
|
|
> Diese Scopes müssen außerdem in den **Read/Write-Scopes** des Tools eingetragen
|
|
> sein (Einstellungen → Verbindung), damit sie im Token landen.
|
|
> Skript: `.\docs\Setup-AppRegistration.ps1 -IncludeOffboarding -GrantAdminConsent`
|
|
|
|
### Read-Only-Variante
|
|
|
|
Für eine reine Anzeige-App (im Tool als `clientIdRo` hinterlegbar) genügen die
|
|
`*.Read.All`-Pendants:
|
|
|
|
`Group.Read.All`, `GroupMember.Read.All`, `User.Read.All`,
|
|
`DeviceManagementApps.Read.All`, `DeviceManagementConfiguration.Read.All`,
|
|
`offline_access` (+ optional `DeviceManagementManagedDevices.Read.All`).
|
|
|
|
---
|
|
|
|
## Authentifizierungs-Konfiguration
|
|
|
|
Zusätzlich zu den Berechtigungen muss die App als **öffentlicher Client** nutzbar
|
|
sein — sonst scheitert der erste Login (`AADSTS500113` bzw. `AADSTS50011`):
|
|
|
|
1. **Öffentliche Clientflows zulassen** → **Ja**
|
|
(Entra → App-Registrierung → *Authentifizierung* → ganz unten;
|
|
im Manifest `isFallbackPublicClient = true`).
|
|
2. **Redirect-URIs** unter *Mobilgerät- und Desktopanwendungen*:
|
|
```
|
|
https://login.microsoftonline.com/common/oauth2/nativeclient
|
|
http://localhost
|
|
ms-appx-web://Microsoft.AAD.BrokerPlugin/<CLIENT-ID>
|
|
```
|
|
- Zeile 1 → **Device-Code-Flow**
|
|
- Zeile 2 → **Loopback / interaktiver Browser-Login** — nötig auf **macOS/Linux**
|
|
(und überall, wo kein WAM-Broker läuft). Ohne diese URI schlägt der Login mit
|
|
`AADSTS50011` fehl (`http://localhost:<Port>` passt nicht). `http://localhost`
|
|
ist portagnostisch, deckt also den zufälligen Port ab.
|
|
- Zeile 3 → **WAM-Broker** (Windows-Anmeldefenster); `<CLIENT-ID>` ist die
|
|
AppId der Registrierung selbst.
|
|
3. **Multi-Tenant:** Wird dieselbe App gegen fremde Tenants genutzt, muss
|
|
`signInAudience` auf *Accounts in any organizational directory*
|
|
(`AzureADMultipleOrgs`) stehen und im Ziel-Tenant per Admin-Consent
|
|
bereitgestellt werden. Bei einer eigenen App **pro** Tenant ist Single-Tenant
|
|
ausreichend.
|
|
|
|
---
|
|
|
|
## Automatische Einrichtung
|
|
|
|
Das Skript [`Setup-AppRegistration.ps1`](Setup-AppRegistration.ps1) erledigt alles
|
|
oben Genannte über Microsoft Graph. Es braucht nur das Modul
|
|
`Microsoft.Graph.Authentication` (dieselbe Abhängigkeit wie das Tool) und löst die
|
|
Berechtigungs-IDs **live** aus dem Graph-Service-Principal auf — keine fest
|
|
verdrahteten GUIDs.
|
|
|
|
```powershell
|
|
# Einmalig:
|
|
Install-Module Microsoft.Graph.Authentication -Scope CurrentUser
|
|
|
|
# Neue Single-Tenant-App inkl. Admin-Consent:
|
|
.\docs\Setup-AppRegistration.ps1 -GrantAdminConsent
|
|
|
|
# Mit Geräte-Rechten:
|
|
.\docs\Setup-AppRegistration.ps1 -IncludeDeviceActions -GrantAdminConsent
|
|
|
|
# Multi-Tenant-App:
|
|
.\docs\Setup-AppRegistration.ps1 -MultiTenant -GrantAdminConsent
|
|
|
|
# Bestehende App nur um Rechte/Redirect-URIs ergänzen:
|
|
.\docs\Setup-AppRegistration.ps1 -ClientId "<APP-ID>" -GrantAdminConsent
|
|
|
|
# Nur das Manifest-Snippet ausgeben (ohne etwas anzulegen wäre -WhatIf-artig —
|
|
# hier zusätzlich zum Anlegen):
|
|
.\docs\Setup-AppRegistration.ps1 -EmitManifest
|
|
```
|
|
|
|
Am Ende gibt das Skript **Tenant ID** und **Client ID** aus — diese Werte im
|
|
Intune Manager unter *Einstellungen → Verbindung* (bzw. im Tenant-Profil)
|
|
eintragen.
|
|
|
|
Die zum Anlegen/Ändern nötigen Admin-Rechte (`Application.ReadWrite.All`, für
|
|
Consent zusätzlich `DelegatedPermissionGrant.ReadWrite.All`) werden beim
|
|
`Connect-MgGraph`-Aufruf des Skripts einmalig abgefragt.
|
|
|
|
---
|
|
|
|
## Manuelle Einrichtung (Portal)
|
|
|
|
1. **Entra** → *App-Registrierungen* → *Neue Registrierung* → Name vergeben,
|
|
Kontotyp wählen (Single- oder Multi-Tenant) → **Registrieren**.
|
|
2. *API-Berechtigungen* → *Berechtigung hinzufügen* → **Microsoft Graph** →
|
|
**Delegierte Berechtigungen** → die [Kern-Berechtigungen](#kern-immer-erforderlich)
|
|
(und bei Bedarf die [Geräte-Berechtigungen](#geräte-tab-optional)) auswählen →
|
|
**Administratorzustimmung erteilen**.
|
|
3. *Authentifizierung* → [Authentifizierungs-Konfiguration](#authentifizierungs-konfiguration)
|
|
wie oben setzen (Public-Client-Flow + beide Redirect-URIs).
|
|
4. **Übersichtsseite**: *Anwendungs-(Client-)ID* und *Verzeichnis-(Mandanten-)ID*
|
|
in den Intune Manager übernehmen.
|