Was Microsoft 365 Lizenzverwaltung umfasst und warum sie nie aufgeräumt bleibt
Microsoft 365 Lizenzverwaltung ist alles, was zwischen dem Kauf eines Abonnements und dem Moment passiert, in dem eine Person tatsächlich Teams, Exchange oder Power BI nutzt. Eine Lizenz muss zugewiesen werden, wenn jemand anfängt, geändert werden, wenn sich die Rolle ändert, entzogen werden, wenn jemand geht, und bei jeder Verlängerung gezählt werden. Jeder Schritt ist im Microsoft 365 Admin Center einfach, aber keiner passiert nur einmal. Sie wiederholen sich für jeden Neuzugang, jedes Projekt und jeden Abgang, und jeder wartet auf einen Administrator, es sei denn, eine Request-Ebene wie das au2mator Self-Service Portal startet die Änderung für dich.
Microsoft beschreibt in seiner Anleitung zum Zuweisen von Lizenzen auf Microsoft Learn zwei Wege, Lizenzen zu vergeben. Direkt an einen Benutzer oder an eine Gruppe, die über die Mitgliedschaft entscheidet. Eine Direktzuweisung braucht vorher einen Nutzungsstandort (Usage Location) am Konto, weil manche Dienste nicht in jedem Land verfügbar sind, während die gruppenbasierte Lizenzierung auf den Standort des Tenants zurückfällt. Beide brauchen jemanden mit der passenden Rolle, der die Änderung klickt oder per Script ausführt.
In der Praxis driften die vier Phasen auseinander. Die IT weist beim Onboarding zu, Teamleiter schicken Änderungen als Tickets, die Rücknahme wird vergessen, bis die Finanzabteilung Mitarbeiterzahl und Lizenzzahl vergleicht, und das Reporting ist ein CSV-Export vor dem Verlängerungstermin. Das Ergebnis sind Lizenzen, die niemand nutzt, Direktzuweisungen, an die sich niemand erinnert, und kleine Anfragen, die einen Admin jeweils zehn Minuten kosten. Dieser Artikel zeigt, wie deine eigenen Scripts diese Lücke schließen und wie au2mator die Menschen, die die Anfrage haben, diese Scripts selbst starten lässt.
Warum Lizenzänderungen weiterhin die Ticket-Warteschlange füllen
Das Berechtigungsmodell ist der erste Grund. Eine Lizenz im Admin Center zuzuweisen erfordert mindestens die Rolle Lizenzadministrator (License Administrator) oder Benutzeradministrator, wie die Dokumentation zum Admin Center auf Microsoft Learn festhält. Beide Rollen decken jedes Produkt im Tenant ab, und wenn du sie nicht über Verwaltungseinheiten (Administrative Units) einschränkst, auch jeden Benutzer. Ein Teamleiter, der nur eine Visio Plan 2 Lizenz für eine Designerin braucht, kann diese Rollen also nicht bekommen. Die Anfrage wird zum Ticket, und das Ticket wartet.
Die gruppenbasierte Lizenzierung löst den Standardfall. Pack alle Mitarbeitenden in eine Gruppe, die Microsoft 365 E3 trägt, und der Neuzugang ist bei Ankunft lizenziert. Was sie nicht löst, ist die Ausnahme. Eine Power BI Pro Lizenz für ein dreimonatiges Projekt, ein Microsoft 365 Copilot Add-on für eine Abteilung, ein Downgrade von E5 auf E3 nach einer Umstrukturierung. Jede Ausnahme ist eine Direktzuweisung, und Direktzuweisungen driften, weil niemand die Projektlizenz entfernt, wenn niemand sagt, dass das Projekt vorbei ist.
Der dritte Grund ist das Offboarding. Ein deaktiviertes Konto behält seine Lizenzen, bis jemand sie entfernt. Die Anleitung zur Gruppenlizenzierung listet außerdem die Fehler auf, die eine automatische Zuweisung stoppen, von zu wenig Lizenzen über widersprüchliche Servicepläne bis zu einem fehlenden Nutzungsstandort, und jeder Fehler wird zu einem weiteren Ticket für denselben Admin. In au2mator landet derselbe Fehler im Request-Protokoll, sichtbar für den Anfragenden.
Vier Wege, die Microsoft 365 Lizenzverwaltung zu automatisieren
Die meisten Teams kombinieren zwei der vier Ansätze unten. Die gruppenbasierte Lizenzierung deckt die Basis ab, einer der anderen drei übernimmt Ausnahmen, Rücknahme und Audit-Trail.
| Ansatz | Am besten für | Wer die Änderung auslöst | Worauf du achten musst |
|---|---|---|---|
| Gruppenbasierte Lizenzierung in Microsoft Entra ID | Basis-Pakete für ganze Abteilungen oder das gesamte Unternehmen | Gruppenmitgliedschaft, oft über eine dynamische Regel auf HR-Attributen | Keine verschachtelten Gruppen, Ausnahmen brauchen weiterhin Direktzuweisungen, Fehler brauchen einen Menschen |
| Deine eigenen Graph PowerShell Scripts | Ausnahmen, Massenänderungen aus CSV, geplante Bereinigung deaktivierter Konten | Ein Administrator an der Konsole oder ein Zeitplan | Wer das Script ausführt, braucht LicenseAssignment.ReadWrite.All, jeder Lauf ist Admin-Zeit, das Protokoll ist, was das Script schreibt |
| Deine Scripts plus das au2mator Self-Service Portal | Die einzelne Anfrage eines Teamleiters oder des Helpdesks, mit Freigabe und Audit, auf den drei Engines, die au2mator anbindet | Der Anfragende in einem Formular, ein Service Account führt das unveränderte Script aus | Script und Freigaberegel entwirfst weiterhin du |
| SaaS-Management-Suiten | Kostenanalysen über viele SaaS-Produkte, Inaktivitätsberichte, Verlängerungen | Richtlinien innerhalb der Suite, Änderungen oft weiterhin durch einen Admin | Eine weitere Konsole und weitere Lizenzkosten, Reporting zuerst, Ausführung danach |
Wenn du nur eine Zeile liest, lies die dritte. Es ist der einzige Ansatz, bei dem Anfrage, Freigabe und Ausführung ein einziger Datensatz sind und niemand außerhalb der IT eine Lizenzrolle braucht. Das Script, das die Arbeit auf PowerShell, Azure Automation oder System Center Orchestrator erledigt, ist dasselbe, das du heute von Hand ausführen würdest.
Die PowerShell hinter Lizenzzuweisung und Lizenzentzug
Jede Lizenzoperation in Microsoft 365 ist ein Microsoft Graph Aufruf, und das Microsoft Graph PowerShell Software Development Kit (SDK) verpackt diese Aufrufe in Cmdlets. Get-MgSubscribedSku listet die Produkte in deinem Tenant mit ihren SKU-IDs, Update-MgUser setzt den Nutzungsstandort, und Set-MgUserLicense fügt Lizenzen für einen Benutzer hinzu oder entfernt sie. Die Set-MgUserLicense Referenz auf Microsoft Learn nennt LicenseAssignment.ReadWrite.All als Berechtigung mit den geringsten Rechten für diese Aufgabe, mit User.ReadWrite.All und Directory.ReadWrite.All als weiter gefasste Alternativen. Das Lesen der SKUs braucht zusätzlich Organization.Read.All, das Setzen des Nutzungsstandorts User.ReadWrite.All. Set-MgGroupLicense macht dasselbe für eine Gruppe.
# Läuft unbeaufsichtigt auf deiner Engine, meldet sich als Service Account oder Managed Identity an
Connect-MgGraph -Identity -NoWelcome
$user = Get-MgUser -UserId $UserPrincipalName -Property Id, UsageLocation, AccountEnabled
if (-not $user.AccountEnabled) { throw "Account is disabled, no license assigned" }
if (-not $user.UsageLocation) { Update-MgUser -UserId $user.Id -UsageLocation "AT" }
$sku = Get-MgSubscribedSku -All | Where-Object SkuPartNumber -eq $SkuPartNumber
if ($sku.PrepaidUnits.Enabled -le $sku.ConsumedUnits) { throw "No free seat for $SkuPartNumber" }
Set-MgUserLicense -UserId $user.Id -AddLicenses @(@{ SkuId = $sku.SkuId }) -RemoveLicenses @()
"Assigned $SkuPartNumber to $UserPrincipalName"
Der Entzug ist das Spiegelbild, die SKU-ID wandert in -RemoveLicenses und -AddLicenses bleibt leer. Ein Detail bringt die meisten Bereinigungsscripts zu Fall. Set-MgUserLicense entfernt nur Direktzuweisungen. Eine über eine Gruppe vererbte Lizenz bleibt, bis der Benutzer die Gruppe verlässt, und Get-MgUser mit der Eigenschaft LicenseAssignmentStates sagt dir, welche Lizenz welche ist, wie die Beispiele zur gruppenbasierten Lizenzierung auf Microsoft Learn zeigen. Ein gutes Rücknahme-Script prüft zuerst diesen Status und entfernt den Benutzer aus der Gruppe, wenn die Lizenz vererbt ist.
Das Script oben ist bewusst klein. Zwei Parameter, zwei Schutzabfragen gegen die häufigsten Fehler und eine Zeile Ausgabe, die ein Request-Protokoll speichern kann. Genau diese drei Eigenschaften machen im nächsten Abschnitt aus einem Script einen Service.
Wie au2mator den Teamleiter vor deine Lizenz-Scripts setzt
Die fehlende Ebene in den meisten Tenants ist nicht ein weiteres Script, sondern der Schritt, in dem aus einer Anfrage eine Aktion wird, ohne dass ein Administrator dazwischen sitzt. au2mator ist ein Self-Service Portal vor deinen PowerShell, Azure Automation oder System Center Orchestrator Scripts. Der Teamleiter wählt einen Service und füllt ein Formular aus, ein Freigeber bestätigt, wenn deine Richtlinie das verlangt, und ein Service Account führt das Script aus. Der Teamleiter hat nie eine Lizenzrolle, und das Script ändert sich nie.
au2mator bringt keinen eigenen Lizenz-Connector mit und braucht auch keinen. Es liefert fertige PowerShell Scripts, mit denen du starten kannst, oder du bindest das Script an, das du bereits hast. Du ersetzt deine Automatisierung nicht, du gibst ihr eine Eingangstür mit Berechtigungen, Freigabe und Protokoll.
Wie ein Lizenz-Service in au2mator aussieht
Der Service ist dein Zuweisungsscript, in au2mator auf der Engine registriert, auf der es ohnehin läuft. Das Formular zeigt nur die Parameter, die der Anfragende entscheiden soll, typischerweise eine Benutzersuche aus dem Verzeichnis, ein Dropdown mit den SKUs, die dein Unternehmen für Self-Service freigibt, und ein optionales Enddatum für Projektlizenzen. Berechtigungen entscheiden, wer den Service überhaupt sieht, Teamleiter sehen also Lizenz zuweisen und Lizenz entfernen, der Helpdesk zusätzlich Lizenz ändern. Die Freigabe wird pro Service festgelegt. Eine Visio Lizenz braucht vielleicht keine Freigabe, eine Power BI Pro Lizenz den Kostenstellenverantwortlichen, ein Copilot Add-on einen Anteil einer Freigabegruppe aus der Finanzabteilung. Für die Ausführung startet au2mator das Script über die API deiner Engine, und das Script meldet sich mit dem Service Account oder der Managed Identity an, die die Graph-Berechtigungen hält. Der Audit-Eintrag hält fest, wer welche Lizenz für wen angefragt hat, wer sie freigegeben hat und was das Script zurückgegeben hat, und dieses Ergebnis kann an dein Ticketsystem zurückgemeldet werden. Wenn das Onboarding bereits als Service läuft, wie in unserem Artikel zur User Provisioning Automation beschrieben, ist der Lizenz-Service der natürliche zweite Schritt auf derselben Engine.
Lizenzen zurückholen beim Offboarding und nach Inaktivität
Die Zuweisung bekommt Aufmerksamkeit, weil jemand darauf wartet, die Rücknahme bekommt keine. Die zwei Auslöser, die zählen, sind der Abgang und das inaktive Konto. Beim Abgang sollte die Anfrage, die das Konto deaktiviert, im selben Lauf auch die Direktlizenzen und die Gruppenmitgliedschaften entfernen. Exchange Online behält die Postfachdaten laut der Lizenzdokumentation auf Microsoft Learn 30 Tage nach dem Entfernen der Lizenz, also gehören die Umwandlung in ein freigegebenes Postfach oder ein Litigation Hold in den Abgangslauf, bevor die Lizenz geht, nicht in ein Ticket drei Wochen später.
Für die Inaktivität listet ein geplantes Script auf Azure Automation Konten ohne Anmeldung seit 90 Tagen samt ihrer Direktlizenzen. In au2mator wird diese Liste zu einer Anfrage an den Teamleiter, der jede Lizenz im Portal bestätigt oder ablehnt, und die Entfernungen laufen unter demselben Service Account wie jede andere Änderung. Die freigewordenen Lizenzen bedienen noch am selben Tag die nächste Anfrage, und die Lizenzzahl folgt der Mitarbeiterzahl statt dem Verlängerungsdatum.
FAQ: Microsoft 365 Lizenzverwaltung
Verbinde dich mit dem Microsoft Graph PowerShell SDK, finde die SKU mit Get-MgSubscribedSku, stelle sicher, dass der Benutzer einen Nutzungsstandort hat, und rufe Set-MgUserLicense mit der SkuId in -AddLicenses und einem leeren -RemoveLicenses Array auf. Das ausführende Konto braucht LicenseAssignment.ReadWrite.All oder eine weiter gefasste Berechtigung. Für eine ganze Gruppe weist Set-MgGroupLicense die Lizenz der Gruppe zu.
Rufe Set-MgUserLicense mit der SkuId in -RemoveLicenses und einem leeren -AddLicenses Array auf. Das entfernt nur Direktzuweisungen. Eine über eine Gruppe vererbte Lizenz bleibt, bis der Benutzer aus dieser Gruppe entfernt wird, prüfe also zuerst LicenseAssignmentStates am Benutzer. Exchange Online behält die Postfachdaten 30 Tage, nachdem die Lizenz weg ist.
Nutze die gruppenbasierte Lizenzierung für das Basis-Paket, das jedes Mitglied einer Abteilung oder das ganze Unternehmen bekommt, idealerweise mit einer dynamischen Gruppe auf HR-Attributen. Nutze die Direktzuweisung für Ausnahmen wie Projektlizenzen oder einzelne Add-ons. Weil Direktzuweisungen driften, lass Ausnahmen über einen Anfrageprozess mit Enddatum laufen, und genau das liefert ein Lizenz-Service in au2mator.
Nicht im Admin Center. Die Rolle Lizenzadministrator deckt jedes Produkt im Tenant ab, und Verwaltungseinheiten können die Benutzer einschränken, aber nicht die Produkte. Die Alternative ist ein Self-Service Portal wie au2mator, in dem der Teamleiter ein Formular ausfüllt, ein Freigeber bei Bedarf bestätigt und ein Service Account dein unverändertes Zuweisungsscript auf PowerShell, Azure Automation oder System Center Orchestrator ausführt. Der Teamleiter hat dabei gar keine Microsoft 365 Rolle.
Die drei üblichen Ursachen sind ein fehlender oder nicht unterstützter Nutzungsstandort, keine freien Lizenzen für das Produkt und ein widersprüchlicher Serviceplan, zum Beispiel ein Benutzer, der Office 365 E1 direkt hält und E3 über eine Gruppe erhält. Setze den Nutzungsstandort, gib Lizenzen frei oder kaufe welche nach, oder deaktiviere den doppelten Plan. Scripts sollten freie Lizenzen und Nutzungsstandort prüfen, bevor sie Set-MgUserLicense aufrufen.
Vergleiche lizenzierte Benutzer mit ihrem letzten Anmeldedatum aus Microsoft Entra ID, liste Konten ohne Aktivität seit 60 oder 90 Tagen auf und nimm deaktivierte Konten dazu, die noch Lizenzen halten. Lass dann den Teamleiter jede Lizenz bestätigen, bevor ein Script sie entfernt. In au2mator ist diese Bestätigung eine Anfrage im Portal, und die Entfernung läuft unter demselben Service Account und Audit-Trail wie jede Zuweisung.
Fazit: Microsoft 365 Lizenzverwaltung ist ein Anfrage-Problem, kein Script-Problem
Microsoft gibt dir das Admin Center, die gruppenbasierte Lizenzierung und die Graph PowerShell Cmdlets, und damit sind die Basis und der Massenjob abgedeckt. Offen bleiben die einzelne Anfrage, die ein Teamleiter heute braucht, und die stille Rücknahme, nach der niemand fragt. Beide folgen einem Muster. Ein kleines Script setzt deine Regeln um, ein Service Account mit LicenseAssignment.ReadWrite.All führt es auf PowerShell, Azure Automation oder System Center Orchestrator aus, und ein Formular davor lässt die Person, die die Anfrage hat, es selbst starten, mit Freigabe und Audit-Eintrag inklusive.
Wenn du sehen willst, wie deine Lizenz-Scripts zu Self-Service-Anfragen für Teamleiter und Helpdesk werden können, buch ein 30-minütiges Gespräch mit Michael Seidl, Microsoft MVP und Gründer von au2mator, und bring die Lizenz-Tickets mit, die dich am meisten nerven.