Um inaktive Microsoft 365 Benutzer zu finden, verbinden Sie zwei Dinge, die Microsoft an getrennten Stellen führt: die jedem Konto zugewiesenen Lizenzen und das Datum, an dem sich dieses Konto zuletzt erfolgreich angemeldet hat. Microsoft Graph hält beides am Benutzerobjekt vor, sodass ein einziger Get-MgUser Aufruf, der assignedLicenses und signInActivity auswählt, Ihnen eine Zeile pro lizenziertem Konto mit dem Datum der letzten Anmeldung liefert. Messen Sie das Alter dieser Zeilen gegen einen Stichtag, den Ihr Team vorab vereinbart, üblicherweise 30, 60 oder 90 Tage, und jedes Konto oberhalb der Linie ist ein bezahlter Platz ohne jeden Nachweis einer Nutzung. Das Skript weiter unten tut genau das und schreibt eine CSV-Datei, die Sie in eine Prüfung mitnehmen können. Kopieren Sie es, führen Sie es aus, behalten Sie es.

Das ist die Anmeldeseite der Lizenzverschwendung. Der Begleitartikel dazu, wie Sie ungenutzte Microsoft 365 Lizenzen finden, behandelt die andere Seite, die Lücke zwischen dem, was Sie gekauft, und dem, was Sie zugewiesen haben. Diese Lücke ist die einfache. Diese hier, der Platz, der einem echten Konto zugewiesen ist, das niemand nutzt, ist meist die größere Zahl und das schwierigere Gespräch.

Beginnen Sie mit der Rechnung, denn sie entscheidet, ob sich ein Nachmittag dafür lohnt

Machen Sie zuerst die Rechnung, mit Ihren eigenen Zahlen statt mit dem Vergleichswert irgendeines Anbieters. In einer Umgebung mit 300 Benutzern sind 4 Prozent der lizenzierten Konten, die sich seit einem Quartal nicht angemeldet haben, 12 Plätze. Zwölf Plätze zu dem, was Sie tatsächlich pro Benutzer und Monat zahlen, mal zwölf Monate, ergeben den Jahreswert. Bei £20 pro Platz sind das £2,880 im Jahr; bei £30 sind es £4,320. Ändern Sie einen Eingangswert, und das Ergebnis verschiebt sich, und genau das ist der Punkt: Sie können das im Kopf prüfen, und Ihre Finanzleitung kann es auch.

Zwei Dinge machen das in einer Organisation mit 50 bis 600 Benutzern verfolgenswert. Es wiederholt sich jeden Monat, bis jemand handelt, sodass Nichtstun sich aufsummiert. Und es ist fast nie jemandes Aufgabe. Die Finanzabteilung sieht eine stabile Rechnung und nimmt an, sie sei korrekt; die IT sieht eine Lizenzanzahl und nimmt an, die Finanzabteilung habe sie genehmigt. So überleben brachliegende Plätze jahrelang.

Warum die Licenses Seite diese Frage nicht beantworten kann

Die naheliegende erste Station ist das Microsoft 365 Admin Center unter Billing und dann Licenses, wo jedes Produkt mit der Zahl der gekauften und der zugewiesenen Plätze erscheint. Das ist eine nützliche Zwei-Minuten-Prüfung, und Sie sollten sie durchführen. Beachten Sie, dass dort pro Produkt aggregiert wird, während Billing und dann Your products eine Zeile pro Abonnement auflistet, sodass die beiden Seiten auf den ersten Blick nicht immer übereinstimmen.

Was Ihnen keine der beiden sagt, ist, ob ein zugewiesener Platz überhaupt etwas tut. Diese Seiten sind um Berechtigung herum gebaut, nicht um Verhalten. Ein Konto, das vor zwei Jahren für einen Auftragnehmer angelegt wurde, weiterhin aktiviert ist, weiterhin einen vollen Platz hält und sich seither nicht angemeldet hat, sieht dort genauso aus wie Ihr am stärksten arbeitender Benutzer.

Reports und dann Usage bringt Sie näher heran. Der Bericht Active users zeigt ein Datum der letzten Aktivität pro Workload für Exchange, OneDrive, SharePoint und Teams, zusammen mit den zugewiesenen Lizenzen. Er ist es wert, ihn zu kennen, und er beantwortet eine andere Frage: ob jemand eine App berührt hat, nicht ob sich die Identität überhaupt authentifiziert hat. Zwei Dinge sind zu erwarten. Die Daten stehen im Allgemeinen über die letzten 7, 30, 90 und 180 Tage zur Verfügung und können einen Tag oder länger brauchen, bis sie erscheinen. Und Benutzernamen sind standardmäßig verborgen, sodass ein Administrator, wenn der Bericht anonymisierte Zeilen zeigt, die Option "Conceal user, group, and site names in all reports" unter Settings, Org Settings, Services, Reports deaktivieren muss.

Vereinbaren Sie, was inaktiv bedeutet, bevor Sie irgendetwas ausführen

Das ist der Schritt, den Teams überspringen, und er entscheidet, ob Ihr Bericht den Kontakt mit dem Rest des Unternehmens übersteht. Dreißig Tage sind aggressiv und erfassen Elternzeit, Langzeitkrankheit, Sabbaticals und Saisonkräfte mit. Neunzig Tage lassen ein volles Quartal Verschwendung laufen, bevor überhaupt etwas gekennzeichnet wird. Sechzig sind ein vernünftiger erster Durchgang in einer mittelgroßen Umgebung. Es gibt keine richtige Antwort, und wer Ihnen sagt, es gebe eine, Anbieter eingeschlossen, verkauft Ihnen seine Voreinstellung.

Entscheidend ist, dass der Stichtag eine schriftliche Richtlinie ist, die Ihr Team verantwortet, mit benannten Ausnahmen, bevor der erste Bericht an irgendjemanden geht. Ein Bericht ohne vereinbarten Schwellenwert erzeugt eine Diskussion. Ein Bericht mit einem erzeugt Maßnahmen.

Die Anmeldedaten hinter der Antwort

Microsoft Entra ID erfasst die Anmeldeaktivität an jedem Benutzerobjekt, und Graph stellt sie an der v1.0 Benutzerressource als Eigenschaft signInActivity bereit. Sie trägt eine letzte interaktive Anmeldung, eine letzte nicht interaktive Anmeldung und eine letzte erfolgreiche Anmeldung, jeweils gepaart mit einer Anforderungs-ID. Interaktiv bedeutet, dass eine Person Anmeldedaten eingegeben oder eine Aufforderung bestätigt hat. Nicht interaktiv umfasst einen Client, der im Hintergrund ein Token erneuert, weshalb ein Konto in einem Feld beschäftigt und in einem anderen tot wirken kann.

Der Grund, dies zu nutzen statt die Anmeldeprotokolle zu durchforsten, ist die Aufbewahrung. Anmelde- und Überwachungsprotokolle werden in der kostenlosen Stufe 7 Tage und mit Entra ID P1 oder P2 30 Tage aufbewahrt, sodass das Protokoll allein Ihnen nichts über eine Lücke von 90 Tagen sagen kann. Die Eigenschaft signInActivity ist anders: Entra speichert sie, solange das Benutzerobjekt existiert. Sie ist die richtige Quelle für diese Frage.

Vier praktische Einschränkungen, bevor Sie etwas ausführen:

  • Sie wird nur zurückgegeben, wenn Sie sie ausdrücklich auswählen. Ein einfaches Get-MgUser enthält sie nicht, und die Eigenschaft fehlt schlicht, statt einen Fehler auszulösen, was der häufigste Grund ist, aus dem Menschen schließen, die Daten fehlten.
  • Das Lesen erfordert AuditLog.Read.All zusätzlich zu User.Read.All. Ohne den Audit-Scope kommen die Lizenzdaten zurück und das Anmeldefeld bleibt leer, was so aussieht, als sei jedes Konto inaktiv.
  • Sie erfordert Microsoft Entra ID P1 oder P2. In einem Tenant ohne eine davon ist die Eigenschaft voraussichtlich nicht verfügbar, prüfen Sie das also, bevor Sie eine leere Spalte debuggen.
  • Ein leerer Wert ist kein Beweis für Nichtnutzung. Die letzte erfolgreiche Anmeldung wird erst seit Dezember 2023 erfasst und wurde nicht rückwirkend ergänzt, und der Wert kann bis zu 24 Stunden nachlaufen. Behandeln Sie leer als "prüfen", niemals als "löschen".

Auf der Verzeichnisseite benötigen Sie keinen Global Administrator. Reports Reader ist die Rolle mit den geringsten Rechten, die Überwachungs- und Anmeldeprotokolle lesen kann, und sie ist die richtige Wahl: Dies ist eine Berichtsaufgabe und sollte für niemanden ein Grund sein, eine schreibende Rolle zu halten.

Das Skript

Das ist das Ganze. Es stellt eine Verbindung her, baut eine Zuordnung auf, damit die Ausgabe Plannamen statt GUIDs zeigt, holt jedes lizenzierte Konto mit seiner Anmeldeaktivität, misst es gegen Ihren Stichtag und schreibt eine CSV-Datei.

# Inactive licensed users report
# Requires the Microsoft.Graph PowerShell SDK
Connect-MgGraph -Scopes "User.Read.All","AuditLog.Read.All","Organization.Read.All"
$InactiveDays = 60
$Cutoff = (Get-Date).AddDays(-$InactiveDays)
# Map SKU GUIDs to readable plan names
$SkuMap = @{}
Get-MgSubscribedSku | ForEach-Object { $SkuMap[$_.SkuId] = $_.SkuPartNumber }
# signInActivity is only returned when explicitly selected
$Users = Get-MgUser -All -Property "id,displayName,userPrincipalName,accountEnabled,userType,createdDateTime,assignedLicenses,signInActivity"
$Report = foreach ($u in $Users) {
    if (-not $u.AssignedLicenses -or $u.AssignedLicenses.Count -eq 0) { continue }
    if ($u.UserType -eq 'Guest') { continue }
    $last = $u.SignInActivity.LastSuccessfulSignInDateTime
    if (-not $last) { $last = $u.SignInActivity.LastSignInDateTime }
    if ($last -and $last -ge $Cutoff) { continue }
    [pscustomobject]@{
        DisplayName       = $u.DisplayName
        UserPrincipalName = $u.UserPrincipalName
        Enabled           = $u.AccountEnabled
        Created           = $u.CreatedDateTime
        LastSignIn        = $last
        DaysSinceSignIn   = if ($last) { [int](New-TimeSpan -Start $last -End (Get-Date)).TotalDays } else { 'Never' }
        Licences          = (($u.AssignedLicenses.SkuId | ForEach-Object { $SkuMap[$_] }) -join '; ')
    }
}
$Report | Sort-Object Created |
    Export-Csv -Path ".\inactive-licensed-users.csv" -NoTypeInformation -Encoding UTF8
"{0} licensed accounts with no sign-in in {1} days" -f @($Report).Count, $InactiveDays

Lesen Sie es einmal, bevor Sie es ausführen. Es überspringt Konten ohne Lizenz, weil ein brachliegendes Konto ohne Lizenz nichts kostet, und es überspringt Gäste, weil für sie andere Regeln gelten und sie die Ausgabe sonst dominieren würden. Es bevorzugt die letzte erfolgreiche Anmeldung und greift auf die letzte interaktive Anmeldung zurück, sodass es sich bei Konten sinnvoll verhält, deren erfolgreiche Anmeldung vor dem Beginn dieses Feldes im Dezember 2023 liegt. Es misst das Alter der Zeilen in PowerShell statt in der Graph-Abfrage: signInActivity lässt sich serverseitig filtern, aber nicht in Kombination mit einer anderen filterbaren Eigenschaft, sodass die clientseitige Auswertung die Bedingungen für Lizenz und Gäste an derselben Stelle hält. Ein Konto, das sich nie angemeldet hat, erscheint als Never statt als leerer Wert, weil das ein anderer Befund ist als ein lange brachliegendes Konto.

Die Schleife in vier Zügen. Das Skript deckt die ersten beiden ab. Die letzten beiden sind Urteilssache, und dort bewegt sich das Geld tatsächlich.

Was der Bericht üblicherweise zutage fördert, und welche Entscheidung jeweils nötig ist

Fast jeder erste Durchlauf bringt dieselben vier Kategorien hervor, und jede benötigt eine andere Entscheidung von einer anderen Person.

Ausgeschiedene, die nie vollständig offgeboardet wurden. Ein Konto, das noch aktiviert und noch lizenziert ist, manchmal Monate nachdem die Person gegangen ist. Das ist der Befund mit dem höchsten Wert und dem geringsten Risiko, und er ist ein Prozessfehler, kein Lizenzierungsfehler. Entfernen Sie die Lizenz, sperren Sie die Anmeldung und behandeln Sie Postfach und Dateien ordentlich. Die Checkliste für das Microsoft 365 Offboarding enthält die vollständige Reihenfolge der Schritte, was wichtig ist, weil diese Schritte in falscher Reihenfolge Daten kosten.

Dienst- und gemeinsam genutzte Konten mit vollen Plätzen. Diese zeigen oft überhaupt keine interaktive Anmeldung, während sie von einer Anwendung tatsächlich genutzt werden. Fassen Sie sie nicht an, bevor Sie den Eigentümer gefunden haben. Fragen Sie, was das Konto wirklich braucht, denn ein voller Produktivitätsplatz ist häufig weit mehr als die Antwort.

Doppelte oder überlappende Add-ons. Konten, die ein Add-on tragen, das ein späterer Basisplan bereits enthält. Das Konto ist aktiv, erscheint also nie als brachliegend, doch das Add-on ist totes Gewicht. Wenn Sie Ihre Ausgabe nach der Lizenzspalte sortieren, treten diese schnell hervor.

Wirklich untätige echte Menschen. Jemand in längerer Abwesenheit, jemand mit Rollenwechsel, jemand, der auf einen Plan onboardet wurde, den er nie genutzt hat. Das ist die Kategorie, die eher eine Führungskraft im Gespräch braucht als ein Skript, und das Ergebnis ist oft eine Herabstufung statt einer Entfernung. Unser Leitfaden zu Business Premium, E3 und E5 ist eine nützliche Referenz dafür, was ein leichterer Plan den Benutzer tatsächlich kostet.

Eine Warnung, bevor Sie auf irgendetwas davon reagieren. Prüfen Sie, woher jede Lizenz stammt, bevor Sie sie vom Benutzer abziehen. Gruppenbasierte Zuweisungen werden an der Gruppe verwaltet, und die Seite Licenses zeigt den Gruppennamen statt ihrer Mitglieder, sodass ein Platz, den Sie von einem Konto entfernen, still über die Gruppenmitgliedschaft zurückkehren kann und die Einsparung nie auf der Rechnung ankommt.

Wenn Ihnen die vier Kategorien oben bereits bekannt vorkommen, können Sie denselben Bericht in einer 14-tägigen EtherInsights Testphase fortlaufend gegen Ihren eigenen Tenant laufen sehen, ganz ohne Skriptpflege.

Die ehrliche Grenze, dies als Skript zu betreiben

Das Skript ist gut. Es ist auch eine Momentaufnahme, und das ist seine Obergrenze. Jemand muss daran denken, es auszuführen. Jemand muss es interpretieren, denn eine CSV-Datei mit 40 Konten ist keine Entscheidung, sondern 40 Entscheidungen. Jemand muss den Eigentümern hinterher sein, die Änderungen anwenden und der Finanzabteilung dann belegen, dass die Platzanzahl bei der Verlängerung tatsächlich gesunken ist, was wieder eine eigene Aufgabe ist. Versäumen Sie zwei Monate, und die Umgebung hat sich unter Ihnen weiterbewegt.

Das ist kein Argument gegen das Skripten. Führen Sie es diese Woche trotzdem aus. Es ist ein Argument dafür, den vierten Monat klar zu sehen, wenn die Person, die es geschrieben hat, beschäftigt ist und der Bericht still nicht mehr ausgeführt wird. In einer Organisation mit 50 bis 600 Benutzern ist die Beschränkung selten das Können. Sie besteht darin, dass niemand die wiederkehrende Aufgabe verantwortet.

Wo EtherInsights ansetzt

EtherInsights ist die fortlaufende Version dessen, was dieses Skript einmal tut. Es gleicht Lizenzen planmäßig gegen echte Aktivität ab, macht brachliegende und nie genutzte Plätze als Befunde mit benanntem Eigentümer und nächster Maßnahme sichtbar statt als Tabellenblatt, und verfolgt das Vorher und Nachher, sodass ein Zurückholen in Ihrer Finanzprüfung als Nachweis ankommt statt als Behauptung. Für den vollständigen Lebenszyklus, von einem gekennzeichneten brachliegenden Platz bis zum Offboarding eines Ausscheidenden, bevor seine Lizenz erneut abgerechnet wird, ist Microsoft 365 Lizenzverwaltung und Offboarding der Weg, der die Schleife schließt.

Es kostet £0.79 pro aktivem Benutzer mit einer 14-tägigen Testphase, sodass Sie die Rechnung vom Anfang dieses Artikels gegen Ihren eigenen Tenant durchführen können, bevor Sie sich zu etwas verpflichten. Wenn Sie einem Budgetverantwortlichen eine Zahl statt einer Methode vorlegen müssen, ist das meist der schnellste Weg zu einer solchen Zahl. Lizenzverschwendung ist eine Position in einem größeren Bild, weshalb sie in der Cloud-Kostenoptimierung sitzt und weshalb das Belegen der Einsparung genauso wichtig ist wie das Finden.

Vereinbaren Sie den Schwellenwert, führen Sie das Skript aus, handeln Sie bei den Ausgeschiedenen sofort und tragen Sie einen Termin für den nächsten Monat in den Kalender ein. Wenn dieser Termin immer wieder verschoben wird, haben Sie das eigentliche Problem gefunden, und es ist kein technisches.

Microsoft 365 Lizenzverwaltung und Offboarding entdecken, um zu sehen, wie brachliegende Plätze, das Offboarding von Ausscheidenden und der Nachweispfad als ein durchgehender Prozess statt als monatliche Erinnerung behandelt werden.