Une des premières étapes quand on souhaite effectuer une analyse Finops de ses licences cloud Microsoft est déjà d’exporer les licences dont on dispose ainsi que le nombre rééllement utilisées. Je vous mets à disposiion ce un script PowerShell qui exporte les licences Microsoft 365 (abonnements souscrits) avec tous les détails disponibles via la cmdlet Get-MgSubscribedSku. Ce script utilise le module Microsoft Graph PowerShell pour récupérer les informations, y compris les propriétés nested comme les unités prépayées (PrepaidUnits) et les plans de service (ServicePlans). Pour gérer ces propriétés nested dans un CSV, le script les convertit en chaînes lisibles (JSON pour PrepaidUnits et liste séparée par virgule pour ServicePlans).

Prérequis :

  • Installez le module Microsoft Graph si ce n’est pas déjà fait : Install-Module -Name Microsoft.Graph -Scope CurrentUser
  • Exécutez le script avec un compte administrateur ayant les permissions nécessaires (par exemple, Organization.Read.All ou LicenseAssignment.Read.All).
  • Connectez-vous à Microsoft Graph avant d’exécuter le script principal : Connect-MgGraph -Scopes "Organization.Read.All"

Script PowerShell :

PowerShell

# Connexion à Microsoft Graph (exécutez ceci une fois par session)
Connect-MgGraph -Scopes "Organization.Read.All"

# Récupération de toutes les licences souscrites avec toutes les propriétés
$skus = Get-MgSubscribedSku -All -Property * | ForEach-Object {
    # Conversion des propriétés nested pour l'export CSV
    $servicePlans = if ($_.ServicePlans) { ($_.ServicePlans | ForEach-Object { $_.ServicePlanName }) -join ", " } else { "" }
    $prepaidUnits = if ($_.PrepaidUnits) { $_.PrepaidUnits | ConvertTo-Json -Compress } else { "" }

    [PSCustomObject]@{
        SkuId              = $_.SkuId
        SkuPartNumber      = $_.SkuPartNumber
        CapabilityStatus   = $_.CapabilityStatus
        ConsumedUnits      = $_.ConsumedUnits
        PrepaidUnitsJson   = $prepaidUnits
        ServicePlans       = $servicePlans
        AppliesTo          = $_.AppliesTo
        Id                 = $_.Id
    }
}
# Export vers un fichier CSV en UTF-8 avec séparateur ";"
$skus | Export-Csv -Path "C:\Scripts\LicencesM365.csv" -Encoding UTF8 -Delimiter ";" -NoTypeInformation

Write-Host "Export terminé vers C:\Scripts\LicencesM365.csv"

Explications :

  • La cmdlet Get-MgSubscribedSku récupère les abonnements (SKUs) avec des détails comme l’ID du SKU, le nom (SkuPartNumber), les unités consommées, les unités prépayées, les plans de service, etc.
  • L’option -All assure la récupération de tous les éléments si paginés.
  • Les propriétés nested sont aplaties pour un CSV propre : ServicePlans devient une liste séparée par virgule, et PrepaidUnits un JSON compact.
  • L’export utilise -Encoding UTF8 pour l’UTF-8 et -Delimiter « ; » pour le séparateur point-virgule. Modifiez le chemin du fichier (-Path) selon vos besoins.
  • Si vous voulez plus de propriétés ou une personnalisation, ajustez l’objet [PSCustomObject] dans la boucle.
  • Il faut changer le répertoire c:\script ou modifier le script pour être prompté du nom de fichier et du répertoire de destination.

Le SkuId est l’ID interne de Microsoft qui permet de faire correspondre une licence cloud Microsoft avec la produit correspondant. Cela n’a rien avoir avec le SKU que l’on peut retrouver en tant que CSP dans la liste des prix Microsoft. Le SkuPartNumber est le nom interne de la licence Microsoft qui est souvent explicite même si pour certaines cela n’est pas trivial. Enfin le servicePlans contient tous les sous produits constituant la licence.

Exécutez-le dans PowerShell 7+ pour une meilleure compatibilité. Si vous rencontrez des erreurs (par exemple, permissions), vérifiez votre connexion ou les scopes. Vous pouvez aussi me laisser en commentaire le message d’erreur que vous obtenez.