Nils Pelzer
11 Jan 2017 | Aktualisiert am: 16 Dez 2022
Expertenbeiträge | 4 Min. Lesezeit

Normalerweise ist das erste, was man macht, wenn man einen neuen Benutzer in Office 365 angelegt, diesem Nutzer eine Lizenz zuzuweisen. Dazu ruft man die Nutzerlizenzen-Übersicht im Office 365-Portal auf. Dort findet man alle verfügbaren Lizenzen. Aber was, wenn für ein bestimmtes Produkt keine Lizenzen mehr verfügbar sind?

assign_license

Ich wollte herausfinden, welche Benutzer diese sechs Visio-Lizenzen nutzen. Leider kann man diese Information im Office-365-Portal nur herausfinden, indem man die Lizenzübersicht eines jeden Benutzers aufruft und die Namen von Lizenznutzern händisch festhält. Scheinbar werden Lizenzinformationen nur im jeweiligen Benutzerobjekt gespeichert. Es gibt keine Übersicht, die Aufschluss gibt, welchen Benutzern eine bestimmte Lizenz zugeteilt wurde.

Deshalb entschied ich mich, zu untersuchen, was mit PowerShell möglich ist – und ich fand eine Lösung für mein Problem! Aber warum lediglich die Lizenzen eines Produkts prüfen? Ich entschied mich, ein kleines Skript zu schreiben, dass mir alle Nutzer aller Lizenzen liefert.

Um mit PowerShell eine Verbindung mit Ihrem Office-365-Mandanten herzustellen, benötigen Sie zwei Dinge:

  1. Microsoft Online Services -Anmelde-Assistant für IT Experten RTW
    https://www.microsoft.com/de-de/download/details.aspx?id=41950
  2. Azure Active Directory Module for Windows PowerShell (64-bit version)
    http://go.microsoft.com/fwlink/p/?linkid=236297

Mehr Informationen, wie Sie PowerShell in Ihrem Office-365-Mandanten nutzen können, finden Sie hier: https://msdn.microsoft.com/en-us/library/jj151815.aspx#bkmk_installmodule [Englisch]

Wenn Sie diese Tools installiert haben, können Sie sich mit Ihrem Mandanten verbinden: Connect-MsolService

Geben Sie Ihre Anmeldedaten ein. Nun können Sie Informationen über Ihre Office-365-Nutzer erhalten und diese verändern.

Zunächst wollen wir alle verfügbaren Office-365-Lizenzen in Erfahrung bringen:

$MsolAccountSkus = Get-MsolAccountSku

Und zusätzlich alle Benutzer, die Lizenzen nutzen:

$LicensedMsOnlineUsers = Get-MsolUser | Where-Object { $_.IsLicensed -eq "TRUE" }

$MsolAccountSkus ist ein Array von Objekten, die Informationen über alle verfügbaren Lizenzen enthalten, z. B. ID, wie viele Lizenzen verbraucht sind und wie viele noch verfügbar sind.

accountskuid

Die AccountSkuId ist eine Kombination aus dem Namen Ihres Mandanten und dem Namen der Lizenz.

$LicesedMsOnlineUsers ist ein Array aller Benutzerobjekte, die Office-365-Lizenzen nutzen. Die Information, welche Lizenzen genutzt werden, sind in den Licenses.AccountSkuID-Eigenschaften gespeichert. Hierbei handelt es sich um ein Array mit allen vergebenen AccountSkuIDs. Zum Beispiel:

licensedmson

$MsolAccountSkus und $LicesedMsOnlineUsers sind im Grunde das, was man in der Nutzerlizenzen-Übersicht im Office-365-Portal sieht.

Es gibt viele Möglichkeiten, mein Ziel zu erreichen. Ich entschloss mich, jede Information, die ich benötigte, zu sammeln und in einem benutzerdefinierten Objekt zu speichern. Diese Objekte werden wiederum in einem Array $O365_Licenses gespeichert.

FUNCTION O365_License_Object($AccountSkuID, $ActiveUnits, $ConsumedUnits 
, $RemainingUnits,){
    $Object = New-Object PSObject 
    $Object | add-member Noteproperty AccountSkuID $AccountSkuID                           
    $Object | add-member Noteproperty ActiveUnits $ActiveUnits
    $Object | add-member Noteproperty ConsumedUnits $ConsumedUnits
    $Object | add-member Noteproperty RemainingUnits $RemainingUnits
    $Object | add-member Noteproperty Users $Users

    return $Object
} #End O365_License_Object

Diese Funktion erstellt ein benutzerdefiniertes Objekt, das den Namen der Lizenz (AccountSkuID), wie viele Lizenzen in Ihrem Office 365-Mandanten verfügbar sind (ActiveUnits), wie viele Lizenzen bereits an Benutzer vergeben sind (ConsumedUnits), wie viele Lizenzen noch verfügbar sind (RemainingUnits) und welchem Nutzer diese Lizenz zugeteilt wurde (Users).

Ich sammle die Information für jedes Element in $MsolAccountSkus, erstelle ein neues benutzerdefiniertes Objekt und speichere es in $O365_Licenses.

$O365_Licenses = @() 

foreach($MsolAccountSku in $MsolAccountSkus){

    $AccountSkuID = $MsolAccountSku.AccountSkuID
    $ActiveUnits = $MsolAccountSku.ActiveUnits
    $ConsumedUnits = $MsolAccountSku.ConsumedUnits
    $RemainingUnits = $ActiveUnits - $ConsumedUnits

    $O365_License = O365_License_Object $AccountSkuID $ActiveUnits $ConsumedUnits $RemainingUnits
    $O365_Licenses += ,$O365_License
}

Der nächste Schritt ist herauszufinden, welche Lizenzen welchen Benutzern zugeteilt wurden. Dafür durchlaufe ich jedes Element in $O365_Licenses und prüfe, ob sich in $LicensedMsOnlineUsers Elemente befinden, die die gleiche AccountSkuID haben. Ist das der Fall, wird der UPN des Benutzers im Attribut .users des $O365_License gespeichert.

foreach($O365_License in $O365_Licenses){
    
    $Users = @()
     
    foreach($LicensedMsOnlineUser in $LicensedMsOnlineUsers){
        if($LicensedMsOnlineUser.Licenses.AccountSkuId.Contains($O365_License.AccountSkuID)){
            $Users += $LicensedMsOnlineUser.UserPrincipalName
        }
    }
    $O365_License.Users += $Users
}

Nun ist jedes Element in $O365_Licenses ein Objekt, das Informationen enthält, die ich in Erfahrung bringen wollte. Zum Beispiel:

365_licenses

Nun können Sie diese Informationen visualisieren, zum Beispiel in einer HTML-Tabelle, die einen Überblick über alle Lizenzen und alle Nutzer darstellt.

Answering