Hinzufügen und Entfernen von M365 Lizenzen mit Microsoft Graph PowerShell

Hallo zusammen,

Kürzlich habe ich gezeigt, wie man mit dem AzureAD PowerShell Module Lizenzen in M365 hinzufügt und entfernt


Connect-AzureAD
Get-AzureADSubscribedSku
Get-AzureADSubscribedSku | Select -Property Sku*,ConsumedUnits -ExpandProperty PrepaidUnits


Die SKU Part Numer ist meist etwas kryptisch. Man schaue deshalb hier nach
https://docs.microsoft.com/en-us/azure/active-directory/enterprise-users/licensing-service-plan-reference

Mit dem folgenden Befehl sieht man einfach, die SkuID, den SkuNamen, wieviele Lizenzen man zu gewiesen hat (ConsumedUnits) und wie viele vorhanden sind (Enabled), sowie Suspended und Warning.

Get-AzureADSubscribedSku | Select -Property Sku*,ConsumedUnits -ExpandProperty PrepaidUnits | ft


Nun versuche ich das ganze über das Microsoft Graph PowerShell Module.

Connect-MgGraph -Scopes User.ReadWrite.All, Directory.ReadWrite.All


Da muss der Tenant Admin die Berechtigungen erlauben oder es gibt einen Azure AD Admin Consent Workflow.


Das Problem ist hier die Art wie die Prepaid Units als Property Array aufgeführt sind

Get-MgSubscribedSku
(Get-MgSubscribedSku)[0] | fl
(Get-MgSubscribedSku)[0].PrepaidUnits



Um die selbe Darstellung zu erhalten wie bei AzureAD ist ein kleines Script und PSCustomProperty notwendig.

###############################################################################
# SKU's an License with MgGraph and PSCustomObject
###############################################################################
#Array with all needed Properties using PSCustomObject
$ArraySKUS = @()
$SKUS = Get-MgSubscribedSku
Foreach ($SKU in $SKUS)
{
    #$ArraySKU = @()
    $AppliesTo = $SKU.AppliesTo
    $CapabilityStatus = $SKU.CapabilityStatus
    $SkuId = $SKU.SkuId
    $SkuPartNumber = $SKU.SkuPartNumber
    $ConsumedUnits = $SKU.ConsumedUnits
    $Enabled = $SKU.PrepaidUnits.Enabled
    $Suspended = $SKU.PrepaidUnits.Suspended
    $Warning = $SKU.PrepaidUnits.Warning
    $SKUObject = [PSCustomObject]@{
        AppliesTo             = $AppliesTo
        CapabilityStatus     = $CapabilityStatus
        SkuId                = $SkuId
        SkuPartNumber        = $SkuPartNumber
        ConsumedUnits        = $ConsumedUnits
        Enabled                = $Enabled
        Suspended            = $Suspended
        Warning                = $Warning
    }
    $ArraySKUS += $SKUObject
}
$ArraySKUS | FT




Beim hunzufügen und entfernen wird mit den SkuID's gearbeitet. Ein bisschen doof finde ich, dass man auch beim entfernen ein leeres Array beim Parameter "Add-Licenses" mitgeben muss. Das selbe gilt natürlich beim hinzufügen, dort wird ein leeres Array beim Parameter "RemoveLicenses" erwartet.
Andererseits ermöglicht das das gleichzeitige hinzufügen und entfernen unterschiedlicher Lizenzen - was durchaus ein Vorteil sein kann.

#Lizenz vom Benutzer anzeigen
Get-MgUserLicenseDetail -UserId m.muster@icewolf.ch

#Lizenz entfernen
Set-MgUserLicense -UserId m.muster@icewolf.ch -AddLicenses @() -RemoveLicenses @('e43b5b99-8dfb-405f-9987-dc307f34bcbd') #PhoneSystem

Set-MgUserLicense -UserId m.muster@icewolf.ch -AddLicenses @{SkuId = 'e43b5b99-8dfb-405f-9987-dc307f34bcbd'} -RemoveLicenses @() #PhoneSystem


Liebe Grüsse
Andres Bohren