Microsoft 365 : comment surveiller la consommation des licences ?

I. Présentation

Sur des tenants Office 365, ou plutôt Microsoft 365, il m'est arrivé à plusieurs reprises d'avoir des problèmes avec des comptes utilisateurs à cause d'une licence qui ne s'attribuait pas, tout simplement car il n'y en avait plus de disponible ! La licence était utilisée à 100% et je n'avais aucun moyen de recevoir cette information avant que le problème arrive... Ce qui est plutôt embarrassant.

Pour palier à cette problématique, j'ai créé un script PowerShell qui va vérifier la consommation des licences Office 365 afin d'envoyer une alerte par e-mail si une licence dépasse un certain seuil d'utilisation.

Ce script ne surveille pas le nombre de licences utilisées, mais il s'intéresse plutôt au nombre de licences disponibles (c'est une façon de voir les choses). Au début, j'étais parti pour réaliser un calcul simple en définissant un seuil commun à l'ensemble des licences, par exemple : s'il reste moins de 10 licences disponibles sur la licence X alors on envoie une alerte par e-mail. Mais finalement, ce n'est pas la solution la plus cohérente : s'il reste moins de 10 licences disponibles pour une licence où vous en avez seulement 15, le seuil d'alerte à 10 ne semble pas adapté.

Du coup, je me suis réorienté vers une solution basée sur un seuil d'alerte dynamique grâce à un pourcentage. Ainsi, le script va permettre de définir un seuil d'alerte avec une valeur en pourcentage. Par exemple, on peut envoyer une alerte si la quantité disponible est inférieure à 5% sur une licence Office 365.

Bien entendu, ce script est améliorable : il s'agit d'une base opérationnelle que chacun peut reprendre à sa façon...!

Pour rappel, avant de commencer : la consommation des licences est visible manuellement via le Centre d'administration Microsoft 365 (admin.microsoft.com). Ensuite, dans le menu de gauche cliquez sur "Facturation" puis sur "Licences".

II. Script PowerShell : surveillance des licences

Passons maintenant au fameux script PowerShell qui va permettre de surveiller le taux d'utilisation des licences Office 365.

La première partie de ce script sert à définir quelques variables :

  • $O365TenantName

Nom du tenant ou de l'entreprise, c'est uniquement pour le rapport e-mail. Valeur libre.

  • $O365SkuAlert

Seuil d'alerte exprimé en pourcentage (pourcentage de licence disponible). Si l'on indique "5" comme valeur, lors une alerte sera envoyée pour une licence qui a moins de 5% de licences disponibles.

  • $O365SkuList

Liste des licences à surveiller : si vous laissez cette valeur vide, toutes les licences seront surveillées. Si vous désirez surveiller seulement quelques licences, indiquez le nom sous cette forme :

$O365SkuList = @("itconnect:STANDARDWOFFPACK_FACULTY","itconnect:FLOW_FREE")

Si vous avez besoin d'aide pour récupérer le nom des licences, consultez notre article à ce sujet : PowerShell - Nom des licences Office 365

  • Remarques supplémentaires

Pour que ce script fonctionne, vous allez devoir vous connecter à Office 365 via PowerShell et la commande Connect-MsolService. Si vous ne savez pas comment faire, je vous invite à suivre ce tutoriel : Se connecter à Office 365 avec PowerShell

Les licences qui sont dans votre tenant mais où la quantité achetée est égale à 0, seront ignorées.

L'exécution du script va permettre de générer un rapport HTML à envoyer par e-mail sous cette forme, correspondant au contenu de la variable $HTMLTab. Je vous laisserai vous amuser avec le CSS pour le customiser. Dans l'exemple ci-dessous, j'ai positionné le seuil d'alerte à 70% pour faire ressortir plusieurs licences dans le rapport.

Dans le script ci-dessous, vous devez adapter la partie envoi d'e-mail pour indiquer les valeurs correspondantes à votre configuration. En complément, si vous souhaitez automatiser le lancement du script via une tâche planifiée (ce qui est l'intérêt), vous devez également gérer la partie Credentials pour la connexion à Office 365 via Connect-MsolService.

Voici le code complet :

$O365TenantName = "IT-Connect"
$O365SkuAlert = 5
$O365SkuList = ""

# Connexion à Office 365
Connect-MsolService -Credential (Get-Credential)

# En-tête HTML
$HTMLTab = "<h3>$O365TenantName - Alerte sur une ou plusieurs licences</h3>
            <table style='border: 1px solid black'>
              <tr style='background-color:black;color:white;'>
              <th style='padding:10px'>Licence</th>
              <th style='padding:10px'>Quantité totale</th>
              <th style='padding:10px'>Quantité disponible</th>
              <th style='padding:10px'>Pourcentage disponible</th>
            </tr>"

if($O365SkuList -eq ""){
  $O365SkuList = (Get-MsolAccountSku).AccountSkuId
}

# Compteurs d'alertes
$O365SkuAlertCount = 0

Foreach($O365Sku in $O365SkuList){

  # Récupérer les informations sur la licence en cours de traitement
  $O365SkuInfos = Get-MsolAccountSku | Where{ $_.AccountSkuId -eq $O365Sku }

  # Inutile de vérifier la licence si la quantité active est à 0
  if($($O365SkuInfos.ActiveUnits) -ne 0){

    # Récupérer le pourcentage d'utilisation de la licence et calculer le pourcentage de licence restant
    [decimal]$O365SkuConsumed = ($O365SkuInfos.ConsumedUnits/$O365SkuInfos.ActiveUnits).tostring("P") -replace "\%","" -replace ",","."
    $O365SkuRemaining = 100 - $O365SkuConsumed
    # Calcul quantité restante/disponible
    $O365SkuRemainingCount = $O365SkuInfos.ActiveUnits - $O365SkuInfos.ConsumedUnits

    # Générer une ligne dans le tableau pour chaque licence en alerte
    if($O365SkuRemaining -le $O365SkuAlert){

      $HTMLTab += "<tr style='text-align:center;'><td>$($O365SkuInfos.AccountSkuId)</td><td>$($O365SkuInfos.ActiveUnits)</td><td>$O365SkuRemainingCount</td><td>$O365SkuRemaining %</td></tr>"
      $O365SkuAlertCount++
    }
  }
}

$HTMLTab += "</table>"

# Notification par e-mail envoyée seulement s'il y a au moins une alerte
if($O365SkuAlertCount -gt 0){
  $MailEncoding = [System.Text.Encoding]::UTF8
  Send-MailMessage -Body $HTMLTab -BodyAsHtml -Encoding $MailEncoding `
                   -Subject "$O365TenantName - Alerte utilisation des licences" `
                   -From "[email protected]" -SmtpServer "smtp.mon-serveur.fr" -To "[email protected]"
}

Ce script est très utile pour surveiller la consommation des licences Office 365. Si vous avez une question, vous pouvez laisser un commentaire sur cet article ?

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5561.Voir tous les posts

11 thoughts on “Microsoft 365 : comment surveiller la consommation des licences ?

  • Salut !
    C’est super mais comment tu fais pour faire tourner ce script tous les jours ?
    Tu utilises un task scheduler ? Ou il est sur Azure ? Je connais pas trop un moyen simple et fiable pour faire ce genre de reporting automatique via powershell… Si tu peux m’éclairer, merci !

    Répondre
    • Salut Fabien,
      Je l’ai mis en place plusieurs fois et effectivement, à chaque fois, j’ai utilisé une tâche planifiée pour l’exécuter.
      Pour que ce soit possible il faut gérer les credentials différemment pour ne pas avoir à les saisir 😉
      Bonne journée,
      Florian

      Répondre
    • Pour gérer les credentials automatiquement, tu peux utiliser le module Secret Management, qui se connecte à un Vault (coffre-fort) de mots de passe : bitwarden, keepass, azure vault, etc.
      Il te suffit ensuite de le faire tourner en tâche planifiée sur ton serveur préféré

      Répondre
  • Bonjour Florian,
    Merci beaucoup pour ce script qui m’a permis de gagner beaucoup de temps. Je peux te proposer une version avec la gestion des logs et un tableau de correspondance pour le nom des licences.
    N’hesites pas

    Répondre
  • Bonjour
    Ce script est parfait
    @Emmanuel Jahan ton script m’interesse ou on peux le recuperer ?

    Répondre
  • j’ai plusieurs message d’erreur:
    « Get-Credentials : Le terme «Get-Credentials» n’est pas reconnu comme nom d’applet de commande, fonction, fichier de
    script ou programme exécutable. Vérifiez l’orthographe du nom, ou si un chemin d’accès existe, vérifiez que le chemin
    d’accès est correct et réessayez.
    Au caractère Ligne:1 : 34
    + Connect-MsolService -Credential (Get-Credentials)
    + ~~~~~~~~~~~~~~~
    + CategoryInfo : ObjectNotFound: (Get-Credentials:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException »

    et celui la

    Send-MailMessage : Erreur lors du traitement. La réponse du serveur était: 5.7.3 STARTTLS is required to send mail
    [MR1P264CA0143.FRAP264.PROD.OUTLOOK.COM]
    Au caractère Ligne:3 : 3
    + Send-MailMessage -Body $HTMLTab -BodyAsHtml -Encoding $MailEncoding …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation : (System.Net.Mail.SmtpClient:SmtpClient) [Send-MailMessage], SmtpExcep
    tion
    + FullyQualifiedErrorId : SmtpException,Microsoft.PowerShell.Commands.SendMailMessage

    Répondre
    • Hello Dary,
      Pour la première erreur, il s’agit d’une faute de frappe de ma part, c’est « Get-Credential » et non « Get-Credentials ».
      Pour la seconde erreur, tu devrais essayer d’ajouter -UseSSL à la commande Send-MailMessage.
      Bon courage!
      Florian

      Répondre
  • Bonjour,
    Est-il possible de recevoir une notification lorsqu’un groupe avec une affectation de licence est en erreur.
    Par exemple : Groupe_XXX à une affection pour une licence Business Premium, mais il n’y a plus de licence disponible. Donc dans le menu « Licences » de Azure Active Directory, une erreur apparait, est-il possible d’être notifié quand cette erreur apparait pour nous prévenir qu’il manque une licence et qu’il faut donc l’ajouter ?

    Répondre

Répondre à Florian Burnel Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.