/
/

So führen Sie geplante Graph-API-Prüfungen für abgelaufene Lizenzen und inaktive Benutzer:innen durch

von Team Ninja
How to Run Scheduled Graph API Checks for Expired Licenses and Inactive Users blog banner image

Kurzüberblick

Dieser NinjaOne-Blogbeitrag bietet eine umfassende Liste grundlegender CMD-Befehle und einen tiefen Einblick in die Windows-Befehle mit über 70 wichtigen CMD-Befehlen für Anfänger:innen und Fortgeschrittene. Der Blogartikel erklärt praktische Befehle der Eingabeaufforderung für die Dateiverwaltung, die Navigation in Verzeichnissen, die Fehlersuche im Netzwerk, Festplattenoperationen und die Automatisierung mit echten Beispielen zur Steigerung der Produktivität. Egal, ob Sie grundlegende CMD-Befehle lernen oder fortgeschrittene Windows CLI-Tools beherrschen möchten, dieser Leitfaden hilft Ihnen, die Eingabeaufforderung effektiver zu verwenden.

Schlüsselpunkte

  • Risiken erkennen: Fragen Sie die Microsoft Graph API per PowerShell ab, um abgelaufene Microsoft-365-Lizenzen und Azure-AD-Konten zu identifizieren, die seit 90 oder mehr Tagen inaktiv sind.
  • Passende Berechtigungen einrichten: Legen Sie vor den Prüfungen eine Rolle als Globaler Administrator oder Berichtsleser fest und richten Sie das Microsoft Graph PowerShell SDK sowie die Berechtigungen User.Read.All, LicenseAssignment.ReadWrite.All und AuditLog.Read.All ein.
  • Ergebnisse exportieren und archivieren: Speichern Sie die Prüfergebnisse in CSV-Berichten mit Zeitstempel, um einen Audit-Trail für Compliance und Entscheidungen zur Lizenzrückgewinnung zu erhalten.
  • Zeitplan automatisieren: Führen Sie das Skript wiederkehrend über die Windows-Aufgabenplanung auf einem einzelnen Rechner aus oder verteilen Sie es per RMM-Tool auf mehrere Endpunkte und Mandanten.
  • Ausnahmen definieren und kalibrieren: Nehmen Sie Dienstkonten und Break-Glass-Konten über eine Whitelist aus und legen Sie Inaktivitätsschwellen fest, die zur Risikobereitschaft Ihres Unternehmens passen.

Ungenutzte Microsoft-365-Lizenzen belasten das Budget unbemerkt, und inaktive Azure AD-Konten sind ein echtes Sicherheitsrisiko. Automatisieren Sie Prüfungen über die Microsoft Graph API, um abgelaufene Lizenzen und verwaiste Konten zu erkennen, bevor daraus unnötige Kosten oder Sicherheitslücken entstehen.

In dieser Anleitung zeigen wir Ihnen, wie Sie wichtige Prüfungen per PowerShell einplanen, Schwachstellen schließen und das Ganze über mehrere Kund:innen hinweg skalieren.

Einen schnellen Überblick erhalten Sie in unserem Video-Leitfaden So führen Sie geplante Graph-API-Prüfungen für abgelaufene Lizenzen und inaktive Benutzer:innen durch.

Graph-API-Prüfungen per PowerShell einplanen: Schritt für Schritt

Automatisieren Sie Graph-API-Prüfungen, um ungenutzte Lizenzen zurückzugewinnen, verwaiste Konten abzusichern, Compliance-Anforderungen zu erfüllen und die Mandantenverwaltung zu verschlanken, alles in einem Durchgang.

Anwendungsfall: Setzen Sie diese Methode bei monatlichen Kostenprüfungen, Sicherheitsaudits oder vor Lizenzverlängerungen ein. Sie eignet sich besonders für MSPs, die abgelaufene Office-365-Lizenzen zurückgewinnen oder nach dem Offboarding von Beschäftigten das Hardening verbessern möchten. So erkennen Sie inaktive Benutzer:innen, bevor sie zur Schwachstelle in Ihrem System werden.

Voraussetzungen: Bevor wir mit dem Vorgehen beginnen, stellen Sie Folgendes sicher:

  • Administrative Berechtigungen: Ihr Konto benötigt in Azure AD die Rolle Globaler Administrator oder Berichtsleser.
  • Tools: Microsoft Graph PowerShell SDK (Modul Microsoft.Graph) und PowerShell 7+.
  • Azure-Einrichtung: Stellen Sie sicher, dass Ihre Azure-AD-App für die Automatisierung über die Berechtigungen User.Read.All, LicenseAssignment.ReadWrite.All und AuditLog.Read.All verfügt.
  • Optional, aber empfehlenswert: Laden Sie ein RMM-Tool wie NinjaOne herunter und installieren Sie es, um Skripte zu planen, Ausgaben zu überwachen und über mehrere Mandanten hinweg zu skalieren.

Schritt 1: Microsoft Graph SDK installieren und authentifizieren

Richten Sie zunächst Ihr Toolkit ein, um Lizenz- und Benutzerprüfungen zu automatisieren. Mit dem installierten Graph SDK fragen Sie Azure-AD-Daten ab, die Administrator:innen normalerweise nicht sichtbar machen, und verbinden Ihr Skript authentifiziert mit der Microsoft-API.

Schritt für Schritt:

  1. Installieren Sie das SDK, indem Sie dieses Skript in PowerShell (Administrator) oder im Windows Terminal (Administrator) ausführen:

Install-Module Microsoft.Graph -Scope CurrentUser -Force

  1. Authentifizieren Sie sich mit diesem Skript:

Connect-MgGraph -Scopes "User.Read.All", "LicenseAssignment.ReadWrite.All", "AuditLog.Read.All

Sie können außerdem eine registrierte App mit einem Client Secret konfigurieren und für die unbeaufsichtigte Ausführung den Zertifikats- oder Client-Credentials-Flow nutzen.

Nach der Authentifizierung des Graph SDK können Sie in den nächsten Schritten inaktive Azure-AD-Benutzer:innen und abgelaufene Office-365-Lizenzen abfragen.

Schritt 2: Benutzer:innen mit abgelaufenen oder nicht zugewiesenen Lizenzen abfragen

Dieser Schritt deckt abgelaufene Lizenzen und inaktive Konten auf, die ein Sicherheitsrisiko darstellen und unnötige Kosten verursachen.

Schritt für Schritt:

  1. Führen Sie in PowerShell (Administrator) dieses Skript aus, um nicht zugewiesene Lizenzen auf Mandantenebene zu prüfen:

Get-MgSubscribedSku |
Select-Object SkuPartNumber,
@{Name="TotalLicenses"; Expression={$_.PrepaidUnits.Enabled}},
@{Name="UsedLicenses"; Expression={$_.ConsumedUnits}},
@{Name="Available"; Expression={$_.PrepaidUnits.Enabled - $_.ConsumedUnits}} |
Format-Table -AutoSize

  1. Führen Sie dieses Skript aus, um Benutzer:innen ohne Lizenz zu finden:

Get-MgUser -Filter "assignedLicenses/`$count eq 0" `
-ConsistencyLevel eventual `
-CountVariable unlicensedCount `
-All |
Select-Object DisplayName, UserPrincipalName |
Export-Csv -Path "UnlicensedUsers.csv" -NoTypeInformation

  1. Führen Sie dieses Skript aus, um inaktive Benutzer:innen mit Lizenz zu finden:

$daysInactive = 90
$cutoffDate = (Get-Date).AddDays(-$daysInactive)# Get licensed inactive users
Get-MgUser -All -Property "DisplayName,UserPrincipalName,SignInActivity,AssignedLicenses" |
Where-Object {
($_.SignInActivity.LastSignInDateTime -lt $cutoffDate) -and
($_.AssignedLicenses.Count -gt 0)
} |
Select-Object DisplayName,
UserPrincipalName,
@{Name="LastSignIn"; Expression={$_.SignInActivity.LastSignInDateTime}} |
Export-Csv -Path "InactiveLicensedUsers.csv" -NoTypeInformation

Wichtig: Beachten Sie, dass SignInActivity Azure AD Premium P1/P2 voraussetzt. Verzichten Sie außerdem in Produktivskripten auf Beta-Endpunkte.

Nach der Ausführung dieser Skripte erhalten Sie zwei CSV-Dateien: UnlicensedUsers.csv mit Benutzer:innen, denen eine Lizenz zugewiesen werden muss, und InactiveLicensedUsers.csv mit Konten, die ein Sicherheitsrisiko darstellen.

Schritt 3: Audit-Ergebnisse exportieren und protokollieren

Sobald Sie die Liste der abgelaufenen und nicht zugewiesenen Lizenzen haben, machen Sie mit automatisierter Berichterstattung handlungsrelevante Erkenntnisse daraus. Der Export erzeugt dauerhafte Audit-Trails als Compliance-Nachweis, und die Automatisierung sorgt dafür, dass Sie Probleme erkennen, bevor sie teuer werden.

Schritt für Schritt:

  1. Führen Sie in PowerShell (Administrator) dieses Skript aus, um in eine CSV-Datei mit Zeitstempel zu exportieren:
    • Skript, das einen Dateinamen mit Zeitstempel erzeugt:

$timestamp = Get-Date -Format "yyyyMMdd-HHmm"
$reportPath = "C:\Audits\LicenseReport_$timestamp.csv"

    • Inaktive Benutzer:innen mit Lizenz exportieren:

$inactiveUsers | Export-Csv -Path $reportPath -NoTypeInformation

    • So entstehen CSV-Dateien, die sich überall öffnen lassen, und der Zeitstempel sorgt für versionierte Datensätze für die Compliance.
  1. (Optional): Führen Sie dieses Skript aus, um Berichte per E-Mail zu versenden:

Send-MailMessage -From "[email protected]" -To "[email protected]" `
-Subject "ACTION REQUIRED: $($inactiveUsers.Count) Inactive Licensed Users" `
-Body "Attached: Users with licenses but no sign-ins for 90+ days" `
-Attachments $reportPath -SmtpServer "smtp.office365.com" -Port 587 `
-Credential (Get-Credential)

  1. Führen Sie dieses Skript aus, um den Ablauf mit der Azure-AD-App vollständig zu automatisieren:

$tenantId = "YOUR_TENANT_ID"
$clientId = "YOUR_CLIENT_ID"
$clientSecret = "YOUR_SECRET" | ConvertTo-SecureString -AsPlainText -ForceConnect-MgGraph -TenantId $tenantId -ClientId $clientId -ClientSecret $clientSecret

Tipp: Bewahren Sie Secrets in Azure Key Vault auf. Hinterlegen Sie sie niemals fest im Code.

Nach der Ausführung dieser Skripte liegen lokal CSV-Berichte mit Zeitstempel vor, auf Wunsch zusätzlich sofortige E-Mail-Benachrichtigungen an die Beteiligten. Mit diesen Dateien können Sie automatisierte Durchläufe über die Aufgabenplanung oder RMM-Tools wie NinjaOne einrichten und so eine durchgehende Überwachung sicherstellen.

Schritt 4: Mit der Aufgabenplanung oder einer RMM-Richtlinie automatisieren

Planen Sie Ihr Skript einmal und lassen Sie es monatlich, jährlich oder dauerhaft laufen, für eine proaktive Überwachung ganz ohne Zutun. Regelmäßige Prüfungen helfen, Probleme frühzeitig zu erkennen. Dafür gibt es zwei Möglichkeiten:

Option 1: Über die Aufgabenplanung (einzelner Rechner)

Schritt für Schritt:

  1. Öffnen Sie die Eingabeaufforderung (Administrator) und führen Sie diesen Befehl aus:

schtasks /create /tn "M365LicenseAudit" /tr `
"powershell.exe -ExecutionPolicy Bypass -File C:\Scripts\LicenseAudit.ps1" `
/sc weekly /d MON /st 02:00 /ru "NT AUTHORITY\SYSTEM"

    • Das funktioniert, weil die Aufgabe unter einem Systemkonto läuft, auch wenn niemand angemeldet ist.

Option 2: Über RMM-Tools

Schritt für Schritt:

  1. Öffnen Sie Ihr bevorzugtes RMM-Tool, zum Beispiel NinjaOne.
  2. Erstellen Sie das Skript (aus Option 1) und speichern Sie es in der Skriptbibliothek von NinjaOne.
  3. Weisen Sie das Skript der Richtliniengruppe „Microsoft 365 Clients“ zu.
  4. Konfigurieren Sie die Ausgaben:
    • Speichern Sie die CSV-Dateien unter \\ClientShare\Audits.
    • Laden Sie sie zur zentralen Ansicht in das Dashboard des RMM hoch.

Nach der Planung läuft das Skript zum festgelegten Datum und zur festgelegten Uhrzeit, speichert die Berichte automatisiert in den vorgesehenen Ordnern und zeigt die Entwicklungen über alle Mandanten hinweg.

Worauf Sie achten sollten

In diesem Abschnitt finden Sie mögliche Stolpersteine, die Sie beim Durcharbeiten dieser Anleitung im Blick behalten sollten.

RisikenMögliche FolgenGegenmaßnahmen
1. Fehlende Daten in BerichtenUnvollständige Audits, unentdeckte RisikenBerechtigungen prüfen: Führen Sie Get-MgContext aus, um Scopes wie User.Read.All zu verifizieren.

MFA-Blockaden umgehen: Nutzen Sie die Zertifikatsauthentifizierung statt Secrets.

2. Skript schlägt unbemerkt fehlTrügerische Sicherheit, Compliance-LückenProtokollierung aktivieren: Ergänzen Sie Ihre Skripte um Start-Transcript -Path C:\Logs\Audit.log.

Ereignisanzeige im Blick behalten: Prüfen Sie unter Anwendungs- und Dienstprotokolle > PowerShell.

3. Benutzer:innen werden nicht markiertAbgelaufene Lizenzen/inaktive Konten werden übersehenSchwellenwerte validieren: Prüfen Sie, ob $cutoffDate zur Richtlinie passt.

Lizenzfelder verifizieren: Nutzen Sie Get-MgUser -UserId [email protected] -Property AssignedLicenses.

4. Fest im Code hinterlegte SecretsKompromittierung des Mandanten, Diebstahl von AnmeldeinformationenSecrets sofort in Azure AD rotieren.

Auf Azure Key Vault umstellen: Nutzen Sie Get-AzKeyVaultSecret, um Secrets sicher abzurufen.

5. Abhängigkeit von Beta-APIsSkript funktioniert nach Microsoft-Updates nicht mehrBeta-Endpunkte ersetzen: Nutzen Sie Get-MgUser (v1.0) statt Get-MgBetaUser.

Abonnieren Sie das Changelog von Microsoft Graph.

Das macht Graph-API-Audits mit PowerShell wirklich belastbar

Passen Sie diese Einstellungen an Ihre Umgebung an. Präzision verhindert Fehlalarme und hält die Workflows störungsfrei.

Ausnahmen in Berichten

Nehmen Sie Dienstkonten, gemeinsame Postfächer und Break-Glass-Konten von Inaktivitätsscans aus. So vermeiden Sie, dass Lizenzen für kritische Ressourcen versehentlich zurückgenommen werden. Mit PowerShell-Filtern setzen Sie sie auf eine Whitelist, zum Beispiel mit diesem Skript:

$excludedUPNs = @("[email protected]", "[email protected]")
Get-MgUser | Where-Object { $_.UserPrincipalName -notin $excludedUPNs }

Inaktivitätsschwellen

Legen Sie die Schwellenwerte entsprechend Ihrer Risikobereitschaft fest. Ist ein Konto 90 Tage inaktiv, gilt es als geringes Risiko, 60 Tage als mittleres und 30 Tage als hohes Risiko. Je nach Risiko verschicken Sie Warn-E-Mails, entziehen die Lizenzen oder deaktivieren das Konto und gewinnen die Lizenz anschließend zurück. So sind Sie gegen Probleme abgesichert.

Häufigkeit der Audits

Wählen Sie den Zeitpunkt Ihrer Audits bewusst, um Sicherheitsrisiken und andere Probleme zu vermeiden. Für die meisten Unternehmen empfehlen sich monatliche Prüfungen, passend zu den Abrechnungszyklen.

In Branchen mit hoher Fluktuation sorgen wöchentliche Prüfungen dafür, dass die Berichte mit den Veränderungen in der Umgebung Schritt halten. Außerdem sollten Sie ein Audit sofort anstoßen, wenn Beschäftigte das Unternehmen verlassen.

Zuordnung von Maßnahmen

Erstellen Sie SOPs, die die nächsten Schritte automatisiert anstoßen. Mit den folgenden Skripten gewinnen Sie Lizenzen zurück und deaktivieren Konten:

  • Lizenzen zurückgewinnen:

Set-MgUserLicense -UserId "[email protected]" -RemoveLicenses @("skuId")

  • Konten deaktivieren:

Update-MgUser -UserId "[email protected]" -AccountEnabled:$false

Archivieren Sie die Daten im Anschluss an die Ausführung dieser Skripte. Leiten Sie sie per Graph API an die zuständige Führungskraft oder an SharePoint weiter.

So verschlankt NinjaOne Ihre Lizenz-Audits

Machen Sie aus manuellen Graph-API-Prüfungen eine vollständig automatisierte Compliance-Maschine über alle Mandanten hinweg.

  • Zentrale Skriptverteilung: Verteilen Sie Ihre Graph-API-PowerShell-Skripte mit einer einzigen Aktion auf über 100 Endpunkte und Mandanten.
  • Automatisierte Überwachung der Ausgaben: Behalten Sie CSV-Berichte und Protokolle über alle Kund:innen hinweg im Blick. Werden Dateien nicht aktualisiert, erfolgt sofort eine Alarmierung.
  • Fehlermeldungen in Ihren Tools: Erhalten Sie Benachrichtigungen per Slack, Teams oder E-Mail, wenn Skripte fehlschlagen.
  • Einheitliche mandantenübergreifende Berichte: Führen Sie Daten zu abgelaufenen Office-365-Lizenzen und inaktiven Benutzer:innen in einem Management-Dashboard zusammen.
  • Automatisch ausgelöste Behebung: Erstellen Sie anhand vordefinierter SOPs automatisiert Tickets in Ihrem PSA-Tool, sobald abgelaufene Lizenzen erkannt werden.

Kosten und Sicherheit mit Graph-API-Lizenzprüfungen im Griff behalten

Wer Lizenz- und Benutzer-Audits automatisiert, macht aus reaktiver Kontrolle proaktive Steuerung. Indem Sie ungenutzte Lizenzen zurückgewinnen und verwaiste Konten deaktivieren, verhindern Sie unnötige Kosten und schließen Angriffswege. Nutzen Sie das beschriebene Vorgehen, um aus ungenutzten Lizenzen Budgeteinsparungen und aus verwaisten Konten Compliance zu machen.

Quick-Start-Guide

NinjaOne unterstützt Sie dabei, geplante Graph-API-Prüfungen für abgelaufene Lizenzen und inaktive Benutzer:innen durchzuführen. Die NinjaOne-Plattform bietet Tools und Hilfestellung für:

  • Audits abgelaufener Lizenzen: Identifizieren Sie mit der Graph API Lizenzen, deren Ablaufdatum überschritten ist
  • Prüfung inaktiver Benutzer:innen: Erkennen Sie Benutzer:innen, die sich innerhalb eines definierten Zeitraums nicht angemeldet oder keine Dienste genutzt haben
  • Automatisierung dieser Prüfungen: Richten Sie geplante Aufgaben ein, die diese Audits regelmäßig ausführen

Verwandte Themen

FAQs

Sie benötigen in Azure AD die Rolle Globaler Administrator oder Berichtsleser sowie das Microsoft Graph PowerShell SDK und PowerShell 7 oder neuer. Ihre Azure-AD-App-Registrierung braucht zusätzlich die Berechtigungen User.Read.All, LicenseAssignment.ReadWrite.All und AuditLog.Read.All.

Die meisten Unternehmen führen diese Prüfungen monatlich durch, passend zu den Abrechnungszyklen. In Branchen mit hoher Fluktuation sind wöchentliche Prüfungen sinnvoll. Stoßen Sie ein Audit außerdem sofort an, wenn Beschäftigte das Unternehmen verlassen.

Ja. Setzen Sie Dienstkonten, gemeinsame Postfächer und Break-Glass-Konten per PowerShell-Filter anhand des User Principal Name auf eine Whitelist, damit sie nicht markiert oder versehentlich deaktiviert werden.

Die Aufgabenplanung eignet sich für einen einzelnen Rechner oder Mandanten. Ein RMM-Tool wie NinjaOne verteilt dasselbe Skript auf viele Endpunkte und Mandanten, bündelt die Ausgaben zentral und alarmiert Sie, wenn ein Durchlauf fehlschlägt.

Das könnte Sie auch interessieren

Sind Sie bereit, die schwierigsten Aufgaben der IT zu vereinfachen?