Automatisierung der Lizenzoptimierung und Audits in Microsoft 365
Von Mirko Peters ·
Willkommen zurück im Podcast-Blog! Wenn Sie schon einmal auf Ihre monatliche Microsoft-365-Rechnung geschaut und sich gefragt haben, warum Sie für Lizenzen bezahlen, die seit sechs Monaten niemand genutzt hat, sind Sie damit nicht allein. Lizenzverwaltung ist einer dieser versteckten operativen Kostenfaktoren, die IT-Budgets unbemerkt aufzehren und zugleich unnötige Compliance- und Sicherheitsprob
Automatisch mit KI aus dem Originalbeitrag übersetzt. Englisches Original lesen
Willkommen zurück im Podcast-Blog! Wenn Sie schon einmal auf Ihre monatliche Microsoft-365-Rechnung geschaut und sich gefragt haben, warum Sie für Lizenzen bezahlen, die seit sechs Monaten niemand genutzt hat, sind Sie damit nicht allein. Lizenzverwaltung ist einer dieser versteckten operativen Kostenfaktoren, die IT-Budgets unbemerkt aufzehren und zugleich unnötige Compliance- und Sicherheitsprobleme verursachen. Zum Glück stehen Ihnen leistungsstarke Automatisierungswerkzeuge direkt zur Verfügung. In diesem umfassenden Leitfaden zeigen wir Ihnen, wie Sie Microsoft-365-Lizenzen mit PowerShell erfassen, zuweisen und entziehen, um Kosten zu kontrollieren, das Onboarding zu beschleunigen und die Einhaltung von Vorgaben im gesamten Mandanten sicherzustellen. Wenn Sie sich gern mit technischen Automatisierungsstrategien befassen, sehen Sie sich unbedingt unsere passende Episode zum Thema an, wie Sie Run Your Full Stack Locally with .NET Aspire umsetzen. Dort finden Sie weitere Einblicke in Entwickler-Workflows und Tooling.
Einführung in die Automatisierung der Lizenzoptimierung und Audits
Einen Microsoft-365-Mandanten manuell zu verwalten, führt schnell zu Überlastung und menschlichen Fehlern. Mit wachsendem Unternehmen wechseln Mitarbeitende, Abteilungen verändern sich und der Softwarebedarf schwankt stark. Bleibt das unkontrolliert, horten Administratorinnen und Administratoren Lizenzen, zahlen weiter für ehemalige externe Dienstleister oder lassen Premium-E5-Lizenzen an inaktiven Konten zugewiesen. Wenn Sie Automatisierung in Ihre Strategie zur Lizenzoptimierung integrieren, entfällt das Rätselraten. Mit PowerShell können Sie Mandantendaten abfragen, Nutzungsmuster analysieren und nicht genutzte Ressourcen programmgesteuert zurückfordern. So wird eine reaktive administrative Routineaufgabe zu einem proaktiven finanziellen Schutzmechanismus.
Voraussetzungen und Einrichtung der Umgebung
Bevor Sie auch nur eine Zeile Code zur Lizenzrückgewinnung schreiben, müssen Sie Ihre Umgebung vorbereiten. Eine sorgfältige Vorbereitung stellt sicher, dass Ihre Skripte reibungslos laufen und nicht an Berechtigungshürden oder Konflikten bei Modulversionen scheitern.
Unterstützte Systeme
Sie können Ihre Skripte zur Microsoft-365-Verwaltung sowohl unter Windows als auch unter macOS ausführen. Die meisten Administratorinnen und Administratoren bevorzugen Windows 10 oder höher, Mac-Benutzerinnen und -Benutzer können PowerShell Core nutzen. Achten Sie stets darauf, dass Ihr Betriebssystem die neuesten modularen Pakete unterstützt. Treten beim Verbindungsaufbau zu Diensten Fehler bei der Web Account Manager (WAM)-Integration oder Konflikte bei Assembly-Abhängigkeiten auf, kann eine temporäre Umgehungslösung wie der Schalter DisableWAM Ihre Skripte vorübergehend wieder lauffähig machen.
Berechtigungen und Rollen
Sicherheit hat oberste Priorität. Führen Sie administrative Skripte niemals mit einem Standardbenutzerkonto aus. Stellen Sie sicher, dass die ausführende Identität über die passenden Rollen verfügt, etwa Globaler Administrator, Benutzeradministrator oder Lizenzadministrator. Das Prinzip der minimalen Berechtigung sorgt dafür, dass Ihre administrativen Anmeldeinformationen nur genau die Rechte besitzen, die für Lizenzprüfungen und -zuweisungen erforderlich sind.
Checkliste zur Einrichtung der Umgebung
- Öffnen Sie Windows PowerShell als Administrator.
- Legen Sie das PowerShell-Gallery-Repository als vertrauenswürdige Quelle fest:
Set-PSRepository -Name 'PSGallery' -InstallationPolicy Trusted - Installieren Sie den erforderlichen NuGet-Anbieter, falls Sie dazu aufgefordert werden.
- Konfigurieren Sie die Ausführungsrichtlinie für Skripte:
Set-ExecutionPolicy RemoteSigned
Installation der wesentlichen Microsoft-365-PowerShell-Module
Um Benutzer und Lizenzen effektiv zu verwalten, benötigen Sie die passenden Werkzeuge lokal installiert. Das Microsoft-Ökosystem hat sich stark in Richtung einheitlicher SDKs entwickelt, doch einige grundlegende Module sind für die tägliche Administration nach wie vor unverzichtbar.
Modulübersicht
- Microsoft.Graph: Das moderne, einheitliche Modul, das veraltete Werkzeuge wie MSOnline und AzureAD ersetzt.
- ExchangeOnlineManagement: Unverzichtbar für die Governance von Postfächern, die Umwandlung in freigegebene Postfächer und die Nachverfolgung des Mailflusses.
- MicrosoftTeams: Unverzichtbar für die Verwaltung von Zusammenarbeits-Workloads und Besprechungsrichtlinien.
Installationsschritte
Sie installieren die wichtigsten modernen Module, indem Sie die folgenden Befehle in einer PowerShell-Eingabeaufforderung mit erhöhten Rechten ausführen:
Install-Module -Name Microsoft.Graph -Scope CurrentUser -Force
Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser -Force
Install-Module -Name MicrosoftTeams -Scope CurrentUser -ForceÜberprüfen Sie Ihre Installationen stets mit Get-InstalledModule, damit keine widersprüchlichen Versionen Ihre Automatisierungs-Runbooks stören.
Verbindung von PowerShell mit Ihrem Microsoft-365-Mandanten herstellen
Eine sichere und zuverlässige Verbindung zu Ihrem Mandanten ist der nächste entscheidende Schritt. Moderne Authentifizierungsstandards erfordern robuste Ansätze, besonders wenn Skripte unbeaufsichtigt oder zeitgesteuert laufen.
Authentifizierungsoptionen
Interaktive Anmeldungen eignen sich gut für schnelle, ad-hoc-Verwaltungsaufgaben, doch automatisierte Hintergrundskripte benötigen sichere Alternativen. Zertifikatsbasierte Authentifizierung oder verwaltete Identitäten ermöglichen eine sichere Verbindung, ohne Passwörter im Klartext in Skriptdateien fest zu codieren.
Verbindung zu Graph und Diensten herstellen
Für die Verwaltung von Benutzern und Lizenzen verbinden Sie sich mit dem Microsoft-Graph-Backend mit folgendem Befehl:
Connect-MgGraph -Scopes "User.ReadWrite.All", "Organization.Read.All"Für Exchange-spezifische Workloads und Postfachkonfigurationen starten Sie Ihre Sitzung mit folgendem Befehl:
Connect-ExchangeOnlineWenn Ihr Skript die Stapelverarbeitung abgeschlossen hat, beenden Sie die Sitzung nicht vergessen, indem Sie Disconnect-ExchangeOnline oder Disconnect-MgGraph ausführen.
Ungenutzte Lizenzen prüfen und Lizenzbestände erfassen
Die Lizenzoptimierung beginnt mit Transparenz. Sie können keine Lizenzen zurückgewinnen, wenn Sie nicht wissen, wer sie nutzt und wer sie ungenutzt lässt. Mit PowerShell können Sie umfassende Bestandsberichte abrufen, die zugewiesene SKUs und Zeitstempel der letzten Anmeldung enthalten.
Abonnierte SKUs prüfen
Um den Gesamtbestand der erworbenen Lizenzen Ihres Mandanten im Vergleich zur Anzahl verfügbarer Lizenzen zu prüfen, führen Sie folgenden Befehl aus:
Get-MgSubscribedSku | Select-Object SkuId, SkuPartNumber, @{Name="Total";Expression={$_.ConsolidatedStatus}}, @{Name="Assigned";Expression={$_.AssignedUnits}}Inaktive Benutzer finden
Konten, die sich seit mehr als 90 Tagen nicht angemeldet haben, lassen sich am schnellsten identifizieren, und so lassen sich unnötige Cloudkosten am wirksamsten senken. Sie können Benutzerlisten filtern, um inaktive Konten aufzuspüren:
$Threshold = (Get-Date).AddDays(-90)
Get-MgGet-MgUser -All -Property Id, DisplayName, UserPrincipalName, SignInActivity | Where-Object { $_.SignInActivity.LastSignInDateTime -lt $Threshold }Wenn Sie diese Daten in eine CSV-Datei exportieren, können Sie der IT-Leitung vor umfassenden Massenentzügen von Lizenzen klare Kennzahlen zur Kostenersparnis präsentieren.
Mit Set-MgUserLicense Lizenzen zuweisen und entziehen
Sobald Sie unterausgelastete Lizenzen oder neue Mitarbeiter identifiziert haben, die eingearbeitet werden müssen, ist das Cmdlet Set-MgUserLicense Ihr wichtigstes Werkzeug für die Anpassung.
Lizenzen per Skript zuweisen
Um einem neuen Benutzer eine bestimmte Produkt-SKU zuzuweisen, erstellen Sie ein Lizenzzuweisungsobjekt mit der Ziel-SkuId:
$Params = @{
AddLicenses = @(
@{
SkuId = "your-sku-guid-here"
}
)
RemoveLicenses = @()
}
Set-MgUserLicense -UserId "alex.johnson@contoso.com" -BodyParameter $ParamsUngenutzte Lizenzen entziehen
Wenn Sie Lizenzen von inaktiven Konten oder ausgeschiedenen Mitarbeitenden zurückholen, kehren Sie den Vorgang um, indem Sie die SKU-Kennung an den Arrayparameter RemoveLicenses übergeben. So stellt Ihr Unternehmen sofort keine Zahlungen mehr für ungenutzte Cloudkapazitäten.
Lizenz-Workflows für Onboarding und Offboarding automatisieren
Manuelle Bereitstellung und Deprovisionierung von Benutzern verursachen erhebliche Verzögerungen und Sicherheitsrisiken. Wenn Sie Ihre Onboarding- und Offboarding-Workflows skripten, stellen Sie sicher, dass Lizenzen in dem Moment bereitgestellt werden, in dem ein Mitarbeitender eintritt, und unmittelbar am Tag seines Austritts wieder entzogen werden.
Ein automatisiertes Offboarding-Skript kann das Benutzerkonto deaktivieren, die zugewiesenen Lizenzen entfernen, das Postfach in eine freigegebene Ressource umwandeln und Prüfprotokolle an einen sicheren Speicherort exportieren – und das alles in einem einzigen, durchgängigen Ausführungsblock. Diese Synchronisierung verhindert Lizenzverschwendung und stärkt die Sicherheitslage der Organisation.
Sicherheitsbest Practices und das Prinzip der minimalen Berechtigungen
Automatisierung verleiht enorme Macht, weshalb sie streng gesteuert werden muss. Die Einhaltung strikter Sicherheitsprinzipien schützt Ihren Mandanten vor versehentlichen Fehlkonfigurationen und bösartiger Skriptausführung.
- Minimale Berechtigungen: Gewähren Sie automatisierten Dienstkonten niemals die Rolle Globaler Administrator. Beschränken Sie die Berechtigungen strikt auf das, was das Skript tatsächlich benötigt.
- Sicherheit von Anmeldeinformationen: Speichern Sie niemals Passwörter im Klartext in Skripten. Verwenden Sie Azure Key Vault, verwaltete Identitäten oder die Zertifikatauthentifizierung.
- Umfassende Protokollierung: Implementieren Sie robuste try/catch-Blöcke und protokollieren Sie die Ausführungsschritte des Skripts lokal oder in der Cloud, um eine lückenlose Nachverfolgbarkeit sicherzustellen.
Häufige Fehler bei Lizenzen und Verbindungen beheben
Auch erfahrene Administratoren stoßen beim Ausführen von Microsoft-365-Automatisierungsskripten gelegentlich auf Hindernisse. Wer diese Fehler richtig einordnen kann, spart dabei viele Stunden Frust.
- Fehler wegen fehlender Berechtigungen: Prüfen Sie, ob das ausführende Konto über die erforderlichen Azure AD-Verzeichnisrollen verfügt und ob Ihre Graph-Verbindung die richtigen Einwilligungsbereiche angefordert hat.
- Fehler bei der Lizenzzuweisung: Stellen Sie sicher, dass für den Zielbenutzer eine festgelegte „Nutzungsstandort“-Angabe konfiguriert ist. Microsoft 365 lehnt Lizenzzuweisungen ab, wenn das Land des Benutzers leer ist.
- Modulkonflikte: Wenn Cmdlets aufgrund kollidierender Modulversionen fehlschlagen, deinstallieren Sie veraltete Module (etwa MSOnline) vollständig und setzen Sie Ihre Umgebung auf das moderne Microsoft Graph SDK um.
Fazit
Die Automatisierung der Lizenzoptimierung und von Audits in Microsoft 365 schließt die Lücke zwischen effizienter IT-Administration und intelligentem Finanzmanagement. Mit PowerShell und Cmdlets wie Set-MgUserLicense lassen Sie sich unnötige Softwareausgaben vermeiden, strenge Compliance-Anforderungen im Bereich Sicherheit durchsetzen und die Benutzerverwaltung im gesamten Unternehmen optimieren. Wenn Sie Ihren technischen Horizont noch weiter in Richtung moderner Tools und Infrastrukturverwaltung erweitern möchten, sollten Sie sich unsere passende Folge ansehen, in der es darum geht, wie Sie Ihren gesamten Stack lokal mit .NET Aspire ausführen. Bleiben Sie proaktiv, halten Sie Ihre Skripte sicher und machen Sie Ihren Microsoft 365-Mandanten zu einer gut geölten, kostenoptimierten Maschine!