In der heutigen digitalisierten Geschäftswelt ist eine effiziente Verwaltung von Microsoft 365 Lizenzen und Azure Active Directory (Azure AD) Benutzern unerlässlich. Ob es darum geht, Kosten zu optimieren, Compliance-Anforderungen zu erfüllen oder einfach nur den Überblick zu behalten – die Fähigkeit, schnell und präzise Informationen über Ihre lizenzierten Benutzer zu erhalten, ist von unschätzbarem Wert. Stellen Sie sich vor, Sie müssten herausfinden, welche Ihrer Mitarbeiter über eine bestimmte, vielleicht teure oder privilegierte, Lizenz verfügen. Im Azure-Portal kann das eine mühsame Klickarbeit sein, die besonders bei größeren Organisationen schnell ineffizient wird.
Glücklicherweise gibt es eine elegantere, schnellere und vor allem automatisierbare Lösung: die Kombination aus Azure PowerShell. Dieser Artikel führt Sie Schritt für Schritt durch den Prozess, wie Sie alle Benutzer in Ihrer Azure AD Umgebung identifizieren und exportieren können, die eine bestimmte Lizenz zugewiesen bekommen haben. Wir tauchen tief in die Welt von PowerShell ein, um Ihnen ein mächtiges Werkzeug an die Hand zu geben, das Ihren Alltag als IT-Administrator erheblich erleichtern wird.
Warum ist ein Überblick über Ihre Lizenzen so wichtig?
Bevor wir uns den technischen Details widmen, lassen Sie uns kurz beleuchten, warum die genaue Kenntnis Ihrer Lizenzverteilung so entscheidend ist:
- Kostenoptimierung: Ungenutzte oder überflüssige Lizenzen können erhebliche Kosten verursachen. Durch das Identifizieren von Benutzern, die Lizenzen besitzen, die sie nicht benötigen, können Sie Lizenzen freigeben und somit Ausgaben reduzieren.
- Compliance & Audits: In vielen Branchen sind strenge Compliance-Vorschriften einzuhalten. Eine präzise Lizenzübersicht hilft Ihnen, bei internen oder externen Audits jederzeit nachweisen zu können, wer welche Zugriffsrechte und Softwarelizenzen besitzt.
- Sicherheitsmanagement: Bestimmte Lizenzen, wie z.B. jene für erweiterte Sicherheitsfunktionen oder Administratoren, gewähren weitreichende Berechtigungen. Ein genauer Überblick hilft Ihnen, diese kritischen Lizenzen zu überwachen und sicherzustellen, dass sie nur an berechtigte Personen vergeben werden.
- Ressourcenplanung: Bei der Einführung neuer Software, der Planung von Upgrades oder der Integration neuer Abteilungen ist es entscheidend zu wissen, welche Lizenzen bereits vorhanden sind und welche noch benötigt werden.
- Benutzerverwaltung: Für das Onboarding und Offboarding von Mitarbeitern sowie für Rollenwechsel ist es wichtig, Lizenzen effizient zu zuweisen oder zu entziehen.
Kurz gesagt: Ein transparenter Überblick über Ihre Lizenzen ist die Basis für eine effiziente, sichere und kostengünstige IT-Infrastruktur.
Die Werkzeuge: Azure PowerShell im Detail
Warum gerade PowerShell? Während das Azure-Portal eine hervorragende grafische Benutzeroberfläche für viele Aufgaben bietet, stößt es bei der Abfrage und Filterung großer Datenmengen oder bei der Automatisierung immer wieder an seine Grenzen. PowerShell hingegen ist ein Kommandozeilen-Shell und eine Skriptsprache, die speziell für die Systemverwaltung entwickelt wurde. Es bietet:
- Automatisierung: Wiederkehrende Aufgaben können skriptbasiert automatisiert werden.
- Skalierbarkeit: Auch bei Tausenden von Benutzern liefert PowerShell schnell und zuverlässig Ergebnisse.
- Granularität: Sie können sehr spezifische Filter und Abfragen erstellen, die im Portal oft nicht möglich sind.
- Berichterstellung: Die Ergebnisse können flexibel in verschiedene Formate (CSV, JSON, HTML) exportiert werden.
Für die Interaktion mit Azure AD verwenden wir das Azure AD PowerShell Modul. Beachten Sie, dass Microsoft das neue Microsoft Graph PowerShell SDK als langfristigen Nachfolger positioniert. Für die hier beschriebene Aufgabe ist das Azure AD Modul jedoch weiterhin perfekt geeignet und oft einfacher zu handhaben, da es spezifischer für Azure AD-Objekte ausgelegt ist.
Vorbereitung ist alles: Voraussetzungen schaffen
Bevor wir loslegen können, müssen einige Vorbereitungen getroffen werden:
1. Azure AD PowerShell Modul installieren
Falls Sie das Azure AD PowerShell Modul noch nicht installiert haben, können Sie dies mit folgendem Befehl in einer Administrator-PowerShell-Sitzung tun:
Install-Module -Name AzureAD -Scope CurrentUser
Wenn Sie eine ältere Version installiert haben, können Sie diese mit Update-Module -Name AzureAD
aktualisieren.
2. Verbindung zu Azure AD herstellen
Bevor Sie Befehle ausführen können, müssen Sie sich mit Ihrem Azure AD Tenant verbinden. Führen Sie diesen Befehl aus und melden Sie sich mit einem Konto an, das über ausreichende Berechtigungen verfügt (mindestens „Global Administrator”, „User Administrator” oder eine benutzerdefinierte Rolle mit Leseberechtigungen für Verzeichnisdaten und Lizenzen, z.B. Directory.Read.All
):
Connect-AzureAD
Es öffnet sich ein Authentifizierungsfenster, in dem Sie Ihre Anmeldedaten eingeben können.
Schritt-für-Schritt: Benutzer mit einer bestimmten Lizenz exportieren
Nun kommen wir zum Kernstück – dem PowerShell-Skript, das uns hilft, unsere Aufgabe zu bewältigen.
Schritt 1: Die gewünschte Lizenz-SKU identifizieren
Jede Microsoft 365 Lizenz hat eine eindeutige SKU ID (GUID) und oft auch einen SkuPartNumber, der lesbarer ist. Um herauszufinden, welche Lizenzen in Ihrem Tenant verfügbar sind und welche SKU IDs diese haben, verwenden Sie den Befehl:
Get-AzureADSubscribedSku | Select-Object SkuPartNumber, SkuId, CapabilityStatus, ConsumedUnits, @{N='ServicePlans'; E={$_.ServicePlans.ServicePlanName -join ', '}}
Die Ausgabe zeigt Ihnen eine Liste Ihrer verfügbaren Lizenzen an, z.B. „M365_BUSINESS_PREMIUM” mit der zugehörigen SkuId
(eine lange GUID). Merken Sie sich die SkuId
oder den SkuPartNumber
der Lizenz, nach der Sie filtern möchten. Für unser Beispiel nehmen wir an, wir suchen nach Benutzern mit der „Microsoft 365 Business Premium” Lizenz, deren SkuPartNumber
„M365_BUSINESS_PREMIUM” sein könnte.
# Beispiel: Ziel-SKU festlegen
$targetSkuPartNumber = "M365_BUSINESS_PREMIUM" # Oder die SkuId als GUID, z.B. "b05e124f-c7cc-445a-8742-99ff6438a4c3"
Schritt 2: Alle Benutzer abrufen und filtern
Der Befehl Get-AzureADUser
ruft Benutzerinformationen aus Azure AD ab. Um sicherzustellen, dass wir *alle* Benutzer erhalten (standardmäßig werden nur die ersten 100 zurückgegeben), verwenden wir den Parameter -All $true
. Anschließend filtern wir diese Benutzer nach der zugewiesenen Lizenz.
Jedes Benutzerobjekt in Azure AD hat eine Eigenschaft namens AssignedLicenses
, die eine Liste der Lizenzen enthält, die dem Benutzer direkt zugewiesen wurden. Wir werden diese Eigenschaft überprüfen, um unsere Ziel-Lizenz zu finden.
# 1. Ziel-Lizenz-SKU ID (GUID) ermitteln, basierend auf dem SkuPartNumber
$skuDetails = Get-AzureADSubscribedSku | Where-Object { $_.SkuPartNumber -eq $targetSkuPartNumber }
if (-not $skuDetails) {
Write-Error "Lizenz mit SkuPartNumber '$targetSkuPartNumber' nicht gefunden. Bitte überprüfen Sie den Wert."
exit
}
$targetSkuId = $skuDetails.SkuId
Write-Host "Suche nach Benutzern mit der Lizenz: $($skuDetails.SkuPartNumber) (ID: $($targetSkuId))"
# 2. Alle Benutzer abrufen und nach der spezifischen Lizenz filtern
$usersWithLicense = Get-AzureADUser -All $true | Where-Object {
# Prüfen, ob der Benutzer Lizenzen zugewiesen hat
$_.AssignedLicenses -ne $null -and
# Prüfen, ob die Ziel-Lizenz-SKU ID unter den zugewiesenen Lizenzen ist
$_.AssignedLicenses.SkuId -contains $targetSkuId
}
Wichtiger Hinweis: Dieses Skript konzentriert sich auf *direkt zugewiesene* Lizenzen. Wenn Sie gruppenbasierte Lizenzierung verwenden, werden Benutzer, die ihre Lizenz über eine Gruppe erhalten haben, in der Eigenschaft AssignedLicenses
*nicht* direkt als zugewiesen aufgeführt. Um auch diese Benutzer zu erfassen, wäre ein komplexeres Skript erforderlich, das Gruppenmitgliedschaften und die Lizenzzuweisungen der Gruppen selbst analysiert. Für die meisten Anwendungsfälle und den Fokus auf direkt zugewiesene Lizenzen ist der obige Ansatz jedoch ausreichend.
Schritt 3: Relevante Benutzerinformationen auswählen
Sobald wir die gefilterten Benutzer haben, möchten wir wahrscheinlich nur bestimmte Eigenschaften exportieren. Gängige Eigenschaften sind DisplayName
, UserPrincipalName
(die E-Mail-Adresse), ObjectId
und möglicherweise weitere wie Department
oder JobTitle
.
# 3. Relevante Benutzerinformationen auswählen
$selectedUserData = $usersWithLicense | Select-Object DisplayName, UserPrincipalName, ObjectId, Department, JobTitle,
@{N='AssignedLicenses'; E={($_.AssignedLicenses | Select-Object -ExpandProperty SkuPartNumber) -join ', '}}
Hier erstellen wir eine benutzerdefinierte Eigenschaft namens „AssignedLicenses”, die eine kommaseparierte Liste der SkuPartNumber
aller zugewiesenen Lizenzen des Benutzers enthält. Das macht die Ausgabe lesbarer.
Schritt 4: Ergebnisse nach CSV exportieren
Der letzte Schritt ist der Export der gesammelten Daten in eine CSV-Datei. Dieses Format ist ideal für die weitere Verarbeitung in Tabellenkalkulationsprogrammen wie Excel.
# 4. Ergebnisse nach CSV exportieren
$outputPath = "C:tempUsersWith_$($targetSkuPartNumber)_License.csv" # Definieren Sie hier Ihren gewünschten Pfad
if (-not (Test-Path (Split-Path $outputPath))) {
New-Item -ItemType Directory -Force -Path (Split-Path $outputPath) | Out-Null
}
$selectedUserData | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8
Write-Host "Export abgeschlossen. Die Daten wurden gespeichert unter: $outputPath"
Write-Host "Anzahl der gefundenen Benutzer mit der Lizenz '$targetSkuPartNumber': $($selectedUserData.Count)"
Der Parameter -NoTypeInformation
verhindert, dass eine Zeile mit Typinformationen in die CSV-Datei geschrieben wird, was die Datei sauberer macht. -Encoding UTF8
stellt sicher, dass Sonderzeichen korrekt dargestellt werden.
Das komplette Skript im Überblick
Hier ist das vollständige PowerShell-Skript, das Sie in einem Stück ausführen können:
# --- PowerShell-Skript: Benutzer mit spezifischer Azure AD Lizenz exportieren ---
# 1. Parameter definieren
# Geben Sie hier den SkuPartNumber der Lizenz ein, nach der Sie filtern möchten.
# Beispiel: "M365_BUSINESS_PREMIUM", "ENTERPRISEPACK" (für M365 E3), "SPE_E3" (für EMS E3)
$targetSkuPartNumber = "M365_BUSINESS_PREMIUM"
# Geben Sie hier den vollständigen Pfad zur Ausgabedatei an
$outputPath = "C:tempUsersWith_$($targetSkuPartNumber)_License.csv"
# --- Voraussetzungen & Verbindung ---
# Sicherstellen, dass das AzureAD Modul installiert ist
try {
Get-Module -Name AzureAD -ErrorAction Stop | Out-Null
} catch {
Write-Host "AzureAD PowerShell Modul nicht gefunden. Installiere es jetzt..."
Install-Module -Name AzureAD -Scope CurrentUser -Force
Write-Host "AzureAD Modul installiert."
}
# Verbindung zu Azure AD herstellen
Write-Host "Verbinde mit Azure AD..."
try {
Connect-AzureAD -ErrorAction Stop
Write-Host "Erfolgreich mit Azure AD verbunden."
} catch {
Write-Error "Fehler beim Verbinden mit Azure AD. Stellen Sie sicher, dass Sie über die erforderlichen Berechtigungen verfügen."
exit
}
# --- Lizenz-SKU ID ermitteln ---
Write-Host "Ermittle die SkuId für '$targetSkuPartNumber'..."
try {
$skuDetails = Get-AzureADSubscribedSku | Where-Object { $_.SkuPartNumber -eq $targetSkuPartNumber }
if (-not $skuDetails) {
Write-Error "Lizenz mit SkuPartNumber '$targetSkuPartNumber' nicht gefunden. Bitte überprüfen Sie den Wert."
Disconnect-AzureAD
exit
}
$targetSkuId = $skuDetails.SkuId
Write-Host "Gefundene Lizenz: $($skuDetails.SkuPartNumber) (ID: $($targetSkuId))"
} catch {
Write-Error "Fehler beim Abrufen der Lizenzdetails: $($_.Exception.Message)"
Disconnect-AzureAD
exit
}
# --- Benutzer abrufen und filtern ---
Write-Host "Rufe alle Azure AD Benutzer ab und filtere nach der Lizenz..."
try {
$usersWithLicense = Get-AzureADUser -All $true | Where-Object {
$_.AssignedLicenses -ne $null -and
$_.AssignedLicenses.SkuId -contains $targetSkuId
}
Write-Host "Anzahl der gefundenen Benutzer mit der Lizenz '$targetSkuPartNumber': $($usersWithLicense.Count)"
} catch {
Write-Error "Fehler beim Abrufen und Filtern der Benutzer: $($_.Exception.Message)"
Disconnect-AzureAD
exit
}
# --- Relevante Benutzerinformationen auswählen ---
Write-Host "Wähle relevante Benutzerdaten aus..."
$selectedUserData = $usersWithLicense | Select-Object DisplayName, UserPrincipalName, ObjectId, Department, JobTitle,
@{N='AssignedLicenses'; E={($_.AssignedLicenses | Select-Object -ExpandProperty SkuPartNumber) -join ', '}}
# --- Ergebnisse nach CSV exportieren ---
Write-Host "Exportiere die Daten nach CSV: $outputPath"
try {
# Sicherstellen, dass der Zielordner existiert
if (-not (Test-Path (Split-Path $outputPath))) {
New-Item -ItemType Directory -Force -Path (Split-Path $outputPath)) | Out-Null
}
$selectedUserData | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8 -Force
Write-Host "Export erfolgreich abgeschlossen. Die Daten finden Sie unter: $outputPath"
} catch {
Write-Error "Fehler beim Exportieren der Daten: $($_.Exception.Message)"
} finally {
# Verbindung zu Azure AD trennen
Write-Host "Trenne die Verbindung zu Azure AD..."
Disconnect-AzureAD
Write-Host "Skriptausführung beendet."
}
# --- Skript Ende ---
Dieses Skript enthält bereits grundlegende Fehlerbehandlung (try-catch
Blöcke), um eine robustere Ausführung zu gewährleisten und nützliche Meldungen auszugeben, falls etwas schiefgeht.
Erweiterte Überlegungen und Best Practices
Mit dem obigen Skript haben Sie eine solide Basis. Hier sind einige weitere Punkte, die Sie berücksichtigen können, um Ihre Lizenzverwaltung noch weiter zu optimieren:
- Automatisierung planen: Für wiederkehrende Berichte können Sie dieses PowerShell-Skript über den Windows Aufgabenplaner, Azure Automation oder eine Azure Function regelmäßig ausführen lassen.
- Andere Exportformate: Neben CSV können Sie die Daten auch in andere Formate exportieren, z.B. in eine HTML-Datei für einen übersichtlicheren Bericht, der direkt im Browser geöffnet werden kann. Verwenden Sie dafür
ConvertTo-Html
oderConvertTo-Json
. - Spezifische Lizenzpläne: Eine Lizenz (SKU) kann verschiedene Servicepläne umfassen (z.B. Exchange Online, SharePoint Online, Teams). Wenn Sie wissen möchten, ob ein Benutzer einen *spezifischen* Serviceplan innerhalb einer Lizenz aktiviert hat, müssen Sie tiefer in die
ServicePlans
-Eigenschaft des Benutzerobjekts eintauchen. - Delegierte Berechtigungen: Statt eines Global Administrators sollten Sie für automatisierte Skripte immer das Prinzip der geringsten Rechte anwenden und ein Dienstprinzip (Service Principal) mit spezifischen delegierten Berechtigungen (z.B.
User.Read.All
undOrganization.Read.All
) verwenden. - Microsoft Graph API / SDK: Wie bereits erwähnt, ist das Microsoft Graph PowerShell SDK die Zukunft der Microsoft 365 und Azure AD Verwaltung. Es bietet eine einheitliche API für alle Microsoft-Dienste. Auch wenn das Azure AD PowerShell Modul für diesen Anwendungsfall noch gut funktioniert, kann es sinnvoll sein, sich mit dem Graph SDK vertraut zu machen, um für zukünftige Anforderungen gerüstet zu sein.
Fazit
Die Verwaltung von Lizenzen in Azure Active Directory muss keine mühsame Aufgabe sein. Mit der Kraft von Azure PowerShell können Sie schnell und effizient detaillierte Berichte über Ihre Benutzer und deren zugewiesene Lizenzen erstellen. Dies verschafft Ihnen nicht nur einen „perfekten Überblick”, sondern ermöglicht auch eine proaktive Kostenoptimierung, verbessert die Sicherheit und stellt die Compliance in Ihrer Organisation sicher.
Indem Sie die hier gezeigten Schritte befolgen, rüsten Sie sich mit einem wertvollen Skillset aus, das Ihnen hilft, Ihre Azure AD Umgebung effektiver zu verwalten und auf dem neuesten Stand zu halten. Experimentieren Sie mit den Befehlen, passen Sie das Skript an Ihre spezifischen Bedürfnisse an und erleben Sie, wie PowerShell Ihre Aufgaben in der IT-Administration revolutionieren kann.