Skip to the main content.

ScriptRunner Blog

Lizenzen und Microsoft Graph PowerShell

Inhaltsverzeichnis

 

 

Post Featured Image

Das Microsoft Graph SDK PowerShell-Modul ersetzt zwei andere Module. Erfahre mehr darüber, wie du dich mit Graph verbindest, Lizenzen findest, Änderungen vornimmst und Lizenzen entfernst.

Lange Zeit gab es die PowerShell-Module AzureAD und MSOnline für die Verwaltung von Benutzern, Gruppen, Lizenzen und mehr in einem Microsoft 365-Tenant. All das ändert sich, die "Deadline" war Mitte des Jahres. Microsoft hat diese beiden PowerShell-Module abgekündigt. Ihr Ersatz? Das Microsoft Graph SDK PowerShell-Modul. Auf den Microsoft LEARN-Seiten und in diesem Blogartikel erfährst du mehr zum Umstieg von AzureAD auf Microsoft Graph und dem Thema Lizenzen. 

 

 

Verbinden mit Graph

Berechtigungen

Zuerst müssen wir eine Verbindung zur Microsoft Graph API herstellen. Dazu brauchen wir die richtigen Berechtigungen, um diese Änderungen vorzunehmen. Graph verfügt über eine Reihe von Berechtigungen, die einen granularen Ansatz für die Sicherheit und die Sicherheitsressourcen in einem Tenant ermöglichen. Mit diesem PowerShell-Cmdlet können wir eine Liste der Berechtigungen abrufen, ohne uns zuerst mit Graph zu verbinden: 


Find-MgGraphPermission -PermissionType Any

01_truncated list of permissions

Liste der Berechtigungen (gekürzt)

Dies ist zwar eine gute Liste von Berechtigungen, aber sie reicht nicht aus, um herauszufinden, welche Berechtigung für die Verwaltung von Lizenzen für einen Tenant erforderlich ist. Wo können wir diese finden? Mit ein wenig Recherche finden wir diese Dokumentation über Graph API-Berechtigungen, die für bestimmte Aktionen erforderlich sind:

Microsoft | Learn (English) 
Microsoft | Learn (Deutsch) 

Beim Durchsuchen der Seiten finden wir diesen Verweis auf die Lizenzierung:

02_permissions required to manage licensing in MS Graph PowerShell

02_permissions required to manage licensing in MS Graph PowerShell_DE

Erforderliche Berechtigungen zur Verwaltung der Lizenzierung in Microsoft Graph PowerShell

Das ist wichtig, denn wenn wir uns mit Graph verbinden, brauchen wir einen Berechtigungsumfang, der es PowerShell ermöglicht, Objekte mit den richtigen Rechten zu verarbeiten.

Verbindungs-String

Das Cmdlet, das für die Verbindung zu Microsoft Graph verwendet wird, heißt entweder Connect-Graph oder Connect-MgGraph. Warum entweder? Das eine ist ein Alias und das andere ein echtes Cmdlet:

03_connection PowerShell cmdlets

Auswahl der PowerShell-Cmdlets für die Verbindung

Wir nutzen Connect-Graph. Neben den Berechtigungen haben wir noch ein paar andere Optionen für die Verbindung.

  • TenandID: Gib die GUID des Tenants an, damit die PowerShell sich mit dem Graph-Verbindungspunkt des gewünschten Tenants verbindet.
  • UseDeviceAuthentication: 'Gerätecode-Authentifizierung anstelle einer Browser-Steuerung verwenden' (optional).
  • Gerltungsbereiche (Scopes): Gib die Berechtigungen an, die während der Verbindung verwendet werden sollen, in unserem Fall 'Directory.ReadWRite.All'.
Connect-Graph -Scopes 'Directory.ReadWRite.All' -TenantID <your tenant's GUID>

Wenn du zum ersten Mal eine Verbindung herstellst, wirst du möglicherweise aufgefordert, dich anzumelden und/oder Berechtigungen zu erteilen. 

Zur Erinnerung: Denke daran, deine Verbindung zu Graph zu schließen, damit du nicht zu viele aktive Verbindungen (normalerweise drei) für Ressourcen in Microsoft 365 hast. 

04_disconnect PowerShell cmdlets

Zwei 'Disconnect' PowerShell Cmdlets

 

Lizenzen finden

Wir können eine Liste der verfügbaren Lizenzen erhalten, indem wir zuerst dieses Cmdlet ausführen, das uns eine Liste der verfügbaren Lizensierungspläne (SKUs) liefert:

Get-MgSubscribedSku | fl

05_available SKU in a tenant

Verfügbare SKUs in einem Tenant

Wenn wir dann dieses Cmdlet ausführen, erhalten wir eine Liste der einzelnen, lizenzierten Funktionen, welche wir für die Nutzer aktivieren / deaktivieren können:

(Get-MgSubscribedSku -SubscribedSkuId 5d0cc54e-0082-4eb8-a300-ce17a036f3f4_6fd2c87f-b296-42f0-b197-1e91e994b900).ServicePlans

06_truncated feature list

Ausschnitt der Liste 

Von hier aus können wir fortfahren. Jetzt können wir die ServicePlanId's für das Lizenzmanagement nachschlagen. Mehr dazu unter Microsoft | Learn (deutsche Seite) oder (englische Seite) 

SKU cmdlet (deutsch) und (englisch).
 

 

Änderungen vornehmen

Lizensierungskonzepte 

Bevor wir Benutzern oder Gruppen Lizenzen zuweisen, müssen wir einige Konzepte kennenlernen. Microsoft hat viele Lizenztypen und Gruppierungen (z.B. E3 / E5) und wir können diese als Grundlage für unsere Zuweisungen verwenden. Es kann jedoch vorkommen, dass ein Unternehmen nicht alle diese Lizenzen zuweisen möchte, entweder weil die Nutzer nicht entsprechend geschult sind, weil ein Unternehmen andere Lösungen hat oder kein Interesse an einer bestimmten Funktion hat, die in ihren Lizenzplänen enthalten ist. 

  • Gruppenbasierte Lizensierung: Die Zuweisung von Lizenzen an Nutzer/innen, die einer bestimmten Gruppe angehören, durch die Festlegung von Lizenzierungszuweisungen für diese Gruppe.
  • Gesamt-SKU: Diese SKU umfasst eine übergeordnete Lizenzgruppe wie E3 oder E5 und besteht aus einer Gruppe von in Microsoft 365 verfügbaren Funktionen.
  • Einzelne SKU: Eine SKU bezieht sich nur auf ein einziges Feature, das als Eigenschaft "ServicePlanId" bezeichnet wird.
  • Deaktivierte SKUs: Eine Liste von Funktionen, die für einen Nutzer nicht verfügbar sind, entweder direkt zugewiesen oder durch gruppenbasierte Lizenzierung.

 

Service-Pläne

Dies sind die Office 365 / Microsoft 365 Lizenzgruppen E1, E3 und E5. Im Folgenden findest du die SKU-IDs, die wir später benötigen.

  • Office 365 E1: 18181a46-0d4e-45cd-891e-60aabd171b4e
  • Office 365 E3: 6fd2c87f-b296-42f0-b197-1e91e994b900
  • Office 365 E5: c7df2760-2c81-4ef7-b578-5b5392b571df
  • Microsoft 365 E3: 05e9a617-0261-4cee-bb44-138d3ef5d965
  • Microsoft 365 E5: 06ebc4ee-1bb5-47dd-8120-11324bc54e06

Quelle: https://learn.microsoft.com/en-us/azure/active-directory/enterprise-users/licensing-service-plan-reference
 

Individuelle Lizenzen

Als erstes können wir mit individuellen Lizenzen beginnen, da es sich dabei in der Regel um einmalige Aktionen handelt, die eine Organisation für einen Onboarding-Prozess oder eine neue Rolle, die einem Nutzer zugewiesen wird, durchführen muss. Solche Zuweisungen brauchen nicht so viel Planung, da sie nur einen einzelnen Benutzer betreffen, und können ganz einfach mit der PowerShell durchgeführt werden. In den folgenden zwei Beispielen weisen wir den Nutzern Lizenzen einzeln und aus einer CSV-Datei zu, die Informationen zur Nutzeridentifikation enthält.  

Beispiel 1

Wir haben einige Benutzer, die nur Zugriff auf die meisten Funktionen benötigen, aber wir müssen Flow, PowerApps, Viva Engage (ehem. Yammer) und Buchungen deaktivieren. Lester und Nancy sind Praktikanten, die diese Funktionen nicht benötigen, und wir können ihre Lizenzierung wie folgt ändern:
 


$YammerID = '7547a3fe-08ee-4ccb-b430-5077c5041653'
$FlowID = '07699545-9485-468e-95b6-2fca3738be01'
$PowerAppsID = '9c0dab89-a30c-4117-86e7-97bda240acd2'
$BookingsID = '199a5c09-e0ca-4e37-8f7c-b05d533e1ea2'
$DisabledPlans = @( $YammerID, $FlowID, $PowerAppsID, $BookingsID )
$SKU = 'c7df2760-2c81-4ef7-b578-5b5392b571df'
Set-MgUserLicense -UserID Lester@mmcug.com -AddLicenses @{SkuId = $SKU ; DisabledPlans = $DisabledPlans} -RemoveLicenses @()
Set-MgUserLicense -UserID Nancy@mmcug.com -AddLicenses @{SkuId = $SKU ; DisabledPlans = $DisabledPlans} -RemoveLicenses @()
 

Jetzt haben Lester und Nancy drei deaktivierte Lizenzen in ihrem E5-Plan online.

Beispiel 2

Einer Reihe von Nutzern, die wir in einer CSV-Datei aufgelistet haben, muss die volle E5-Lizenz zugewiesen werden, da sie die zusätzlichen Funktionen benötigen. Ähnlich wie im vorherigen Beispiel mit Set-MgUserLicense verwenden wir eine Foreach-Schleife, um jeden Benutzer zu bearbeiten und die SKU für Office 365 E5 zuzuweisen.


$SKU = 'c7df2760-2c81-4ef7-b578-5b5392b571df'
$CSV = Import-CSV 'E5-USerList.csv'
Foreach ($Line in $CSV)
Set-MgUserLicense -UserID $_.UPN -AddLicenses @{SkuId = $SKU} -RemoveLicenses @()
}
 

Je nach Anzahl der Benutzer kann dies einige Zeit in Anspruch nehmen. Eine bessere Methode für eine große Änderung wie diese wäre die Verwendung der gruppenbasierten Lizenzierung, die wir als Nächstes behandeln werden:

 

Gruppenlizenzen

Neben der individuellen Zuweisung von Lizenzen an jeden Nutzer haben wir die Möglichkeit, Lizenzen über Entra ID- (ehem. Azure AD)-Gruppen zuzuweisen, auch bekannt als gruppenbasierte Lizenzierung. Vereinfacht gesagt, können wir mit Hilfe von Gruppen einen Nutzer von einer Lizenz zu einer anderen wechseln, indem wir ihn zu einer Gruppe hinzufügen, der eine Lizenz zugewiesen wurde. Wenn ein/e Nutzer/in die Lizenz nicht mehr benötigt, kann er/sie aus derselben Gruppe entfernt werden und die Lizenz wird dann entfernt..
 

Beispiel

In diesem Szenario führt die IT-Abteilung langsam verschiedene Funktionen ein, die in den gekauften Office E3-Lizenzen enthalten waren. Im Rahmen eines IT-Projekts werden Teams, Viva Engage (ehemals Yammer) und Sway nach und nach in den Abteilungen bzw. bei den Mitarbeitern eingeführt, während diese geschult werden. Daher sollen diese drei Funktionen zunächst für alle gesperrt werden, um sie dann zuzuweisen, wenn die Gruppen geschult sind und die interne IT-Abteilung den Zugriff auf diese Produkte bzw. Rollout-Clients (z. B. Teams) freigibt. Mit den vorherigen ServicePlanId's für das Produkt können wir eine Gruppe erstellen, die mit dem Konzept der Disabled Plans blockiert wird. In der folgenden PowerShell stellen wir die drei Produkte, die wir blockieren wollen, in einem Array zusammen: 


$TeamsID = '57ff2da0-773e-42df-b2af-ffb7a2317929'
$YammerID =  '7547a3fe-08ee-4ccb-b430-5077c5041653'
$SwayID = 'a23b959c-7ce8-4e57-9140-b90eb88a9e97'
$DisabledPlans = @( $TeamsID, $YammerID, $SwayID )
 

Als Nächstes haben wir zwei Gruppen erstellt, denen wir Lizenzen zuweisen werden, und wir können mittels PowerShell Informationen über diese Gruppen abrufen:

Get-MgGroup | Where DisplayName -like 'M365*'

 

Das Ergebnis ist wie folgt:


Id
                                                DisplayName
--                                                  -----------
06170e2a-8017-45f9-a0a5-27cb4a8781ce                M365E3-PostTraining
64a84c9f-eb10-422c-9333-c58bd5b45419                M365E3-PreTraining

Die Eigenschaft Id brauchen wir, um den beiden Gruppen ("vor" und "nach" dem Training) Lizenzen zuzuweisen. Für die Gruppe "PreTraining" benötigen wir die $DisabledPlans, die ID der Gruppe und die Office 365 E3 SKU von oben und geben sie wie folgt in das Cmdlet Set-MgGroupLicense ein: 


$GroupID = (Get-MgGroup | Where DisplayName -eq 'M365E3-PreTraining').Id
$SKU = 'c7df2760-2c81-4ef7-b578-5b5392b571df'
Set-MgGroupLicense -GroupID $GroupID  -AddLicenses @{SkuId = $SKU ; DisabledPlans = $DisabledPlans} -RemoveLicenses @()

 

Für die Gruppe "Post-Training" benötigen wir nur die Office 365 E3 SKU und die ID der Gruppe für dasselbe Cmdlet, wie hier gezeigt:

$GroupID = (Get-MgGroup | Where DisplayName -eq 'M365E3-PostTraining').Id
$SKU = 'c7df2760-2c81-4ef7-b578-5b5392b571df'
Set-MgGroupLicense -GroupID $GroupID  -AddLicenses @{SkuId = $SKU} -RemoveLicenses @()
 

 

Wenn wir im Microsoft 365 Admin Center nachsehen, können wir den Unterschied sehen: 

07_license changes with or without PowerShell script

LLizenzänderungen vor/nach dem PowerShell-Skript

Außerdem können wir die Unterschiede in der PowerShell bestätigen: 

Get-MgUserLicenseDetail -UserId Frank@domain.com | select -ExpandProperty ServicePlans | where ProvisioningStatus -eq Disabled

08_disabled licensed features

Deaktivierte lizenzierte Funktionen in Franks Konto
 

Get-MgUserLicenseDetail -UserId Brian@domain.com | select -ExpandProperty ServicePlans | where ProvisioningStatus -eq Disabled

Dies liefert ein leeres Ergebnis, was bedeutet, dass keiner der Dienste deaktiviert ist. Um eine Gesamtübersicht über alle aktiven Dienste zu erhalten, können wir diese beiden Cmdlets ausführen:


(Get-MgUserLicenseDetail -UserId Frank@domain.com | select -ExpandProperty ServicePlans | where ProvisioningStatus -ne Disabled).Count
(Get-MgUserLicenseDetail -UserId Brian@domain.com | select -ExpandProperty ServicePlans | where ProvisioningStatus -ne Disabled).Count

09_difference of three as expected

Wie erwartet eine Differenz von drei

 

Offboarding oder Lizenzentzug

Je nachdem, wie eine Lizenz angewendet wird, kann das Entfernen einer Lizenz so einfach sein wie das Entfernen des Benutzers aus einer bestimmten Gruppe oder es kann sein, dass wir alle zugewiesenen Lizenzen entfernen müssen. Beide Aufgaben können mit der PowerShell erledigt werden und sind eine Umkehrung der individuellen Zuweisung.


$SKU = 'c7df2760-2c81-4ef7-b578-5b5392b571df'
Set-MgUserLicense -UserID Lester@mmcug.com -AddLicenses @() -RemoveLicenses @($SKU) 

10_E5 license unchecked

Die E5-Lizenz ist jetzt für Lester nicht mehr aktiv
 

Wenn die Lizenz von einer Gruppe zugewiesen wird, entfernen wir den Benutzer einfach aus der Gruppenmitgliedschaft.

 

Fazit

Die neue Methode zur Verwaltung von Lizenzen ähnelt der älteren Entra ID- (Azure AD-)Methode. Die einzige zusätzliche Ebene besteht darin, zu wissen, welche Berechtigungen dem Benutzer zugewiesen werden sollen, wenn er Aufgaben in Graph PowerShell ausführt. Ansonsten ist der Gesamtprozess derselbe. Du solltest dich unbedingt mit der Graph PowerShell vertraut machen, da sie mit der Zeit viele andere PowerShell-Module ersetzen wird.

Kurzer Hinweis: Wenn du eine Auswertung darüber brauchst, wer welche Lizenzen hat, kannst du das auch mit PowerShell machen, wie hier gezeigt:


Get-MgUser -Filter "assignedLicenses/any(x:x/skuId eq $SKU)" -All

11_list of users with assigned license

Eine Liste der Benutzer mit der zugewiesenen E5-Lizenz

 

Good2know

ScriptRunner and Graph 

Microsoft Graph als Service für M365-Targets

Der Target-Typ für M365 wurde vor etwas mehr als einem Jahr um den Service für das Microsoft Graph Modul erweitert (ScriptRunner Portal Edition R4) . Die Verwendung von Microsoft Graph mit PowerShell ermöglicht das Automatisieren von komplexen Zusammenhängen im Kontext von Infrastruktur, Anwendern, deren Content und diversen Services und Eigenschaften. Für Microsoft ist es insofern strategisch, als es den Zugriff auf sehr unterschiedliche Daten ermöglichen soll als auch die Begrenzungen von PowerShell-Verbindungen (Connections) zu einem Mandanten (Tenant) aufheben soll, da es zustandslos mit REST arbeitet. 

Einen ersten Überblick zu Microsoft Graph mit PowerShell gibt es hier:

Einen Überblick über Microsoft Graph mit PowerShell findest du hier. Unten, ein Screenshot aus ScriptRunner: 

18_my O365 tenant

Neues Microsoft Graph Target (certificate & client secret)

Die Implementierung in ScriptRunner folgt der neuen Anwenderführung zum Anlegen und Konfigurieren von Targets. Einem bestehenden oder anzulegenden M365 Target kann der Service Microsoft Graph hinzugefügt werden. Die aktuelle Version von Microsoft Graph unterstützt die zwei Authentifizierungsverfahren mit Zertifikat oder mit Client Secret. Wird ein Zertifikat verwendet, so muss das Zertifikat im lokalen Zertifikatsspeicher abgelegt sein. Wird hingegen ein Client Secret verwendet, muss Name und Secret unter Credentials konfiguriert worden sein. In beiden Fällen ist im Mandanten (Tenant) ein Service Principal einzurichten oder es müssen dem registrierten ScriptRunner Service die Berechtigungen zugewiesen worden sein.The implementation in ScriptRunner follows the user guidance for creating and configuring targets. The Microsoft Graph service can be added to an existing M365 target or one that is to be created. The current version of Microsoft Graph supports the two authentication methods with certificate or with client secret. If a certificate is used, the certificate must be stored in the local certificate store. If, on the other hand, a client secret is used, the name and secret must have been configured under Credentials. In both cases, a service principal must be set up in the tenant or the permissions must have been assigned to the registered ScriptRunner service.

 

Weiterführende Links

Zusammenhängende Posts

Über den Autor: