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
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-referenceMit 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
(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
# 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
