Site icon Gioxx.org

PowerShell: report licenze Microsoft 365 via Microsoft Graph

PowerShell: report licenze Microsoft 365 via Microsoft Graph 1

Nelle puntate precedenti: Report licenze di Office 365 via PowerShell 7 e Microsoft Graph.
Non ho voluto modificare nuovamente il vecchio articolo perché – rispetto al passato – stavolta ho sostituito tutte le vecchie chiamate al modulo MSOnline e mi baso esclusivamente su Graph per ottenere ciò che mi serve. Questo permette allo script di essere più veloce e certamente più compatibile con PowerShell 7, che poi è il risultato che desideravo raggiungere.

Il codice è già parte integrante della mia scatola dei giocattoli (github.com/gioxx/ps.toybox), se stai utilizzando quindi il mio modulo vuol dire che lo hai già pronto a eseguire quanto richiesto, diversamente ti faccio sbirciare qui di seguito il codice preciso che riguarda questa chiamata così che tu possa salvarlo magari in un tuo file PS1 e usarlo secondo necessità.

Il nuovo script

Avevo già lavorato per isolare e far utilizzare al mio script un file JSON esterno che potesse raccogliere le licenze disponibili su Microsoft 365 fornendo una “tabella di conversione” tra nome tecnico e nome più “amichevole” della licenza (github.com/gioxx/ps.toybox/commit/dfe3963624ec29843d3b5e8c1cead63c9b17613f), ma grazie all’articolo di Martin Heusser ho scoperto che Microsoft ne mette a disposizione uno davvero molto completo e l’ho trasformato (in origine si tratta di un file CSV) per poterlo incorporare nel JSON precedentemente pubblicato.

A questo punto ho pulito un po’ lo script e il risultato finale è il seguente:

function MsolAccountSku-Export {
param(
[Parameter(Mandatory=$false, ValueFromPipeline, HelpMessage="Folder where export CSV file (e.g. C:\Temp)")][string] $folderCSV
)
if ( (Get-Module -Name Microsoft.Graph -ListAvailable).count -eq 0 ) {
Write-Host "Please install the Graph module using this command (then relaunch this script): `nInstall-Module Microsoft.Graph" -f "Yellow"
exit
} else { Connect-MgGraph | Out-Null }
if ( (Get-Module -Name Microsoft.Graph.Users -ListAvailable).count -eq 0 ) {
Write-Host "Please install the Microsoft.Graph.Users module using this command (then relaunch this script): `nInstall-Module Microsoft.Graph.Users" -f "Yellow"
exit
} else {
if ( (Get-Module -Name Microsoft.Graph.Users).count -eq 0 ) {
Import-Module Microsoft.Graph.Users
}
}
Set-Variable ProgressPreference Continue
if ([string]::IsNullOrEmpty($folderCSV)) {
$folderCSV = "C:\Temp"
} else {
$folderCSV = $folderCSV.TrimEnd('\')
}
$Today = Get-Date -format yyyyMMdd
$Result=@()
$ProcessedCount = 0
$licenseFile = Invoke-RestMethod -Method Get -Uri 'https://raw.githubusercontent.com/gioxx/ps.toybox/main/JSON/M365_licenses.json'
$Users = Get-MgUser -Filter 'assignedLicenses/$count ne 0' -ConsistencyLevel eventual -CountVariable totalUsers -All
$Users | Foreach-Object {
$ProcessedCount++
$PercentComplete = (($ProcessedCount / $totalUsers) * 100)
$User = $_
Write-Progress -Activity "Processing $($User.DisplayName)" -Status "$ProcessedCount out of $totalUsers ($($PercentComplete.ToString('0.00'))%)" -PercentComplete $PercentComplete
$GraphLicense = Get-MgUserLicenseDetail -UserId $User.Id
if ($GraphLicense -ne $null) {
ForEach ( $License in $($GraphLicense.SkuPartNumber) ) {
ForEach ( $LicenseStringId in $licenseFile ) {
if ( $LicenseStringId.String_Id -eq $License ) {
$Result += New-Object -TypeName PSObject -Property $([ordered]@{
DisplayName = $User.DisplayName
UserPrincipalName = $User.UserPrincipalName
PrimarySmtpAddress = $User.Mail
Licenses = $LicenseStringId.Product_Display_Name
})
break
}
}
}
}
}
$CSV = SaveFileWithProgressiveNumber("$($folderCSV)\O365-User-License-Report_$($Today).csv")
$Result | Export-CSV $CSV -NoTypeInformation -Encoding UTF8 -Delimiter ";"
}

Rispetto al passato – noterai tu stesso – lo script conta molte meno righe perché andrà a leggere il contenuto del file JSON per poter effettuare la conversione e restituirti il nome riconoscibile della licenza assegnata all’utente finale. Ti restituirà il DisplayName dell’utente, il suo UserPrincipalName, il suo PrimarySmtpAddress e infine la licenza. Se non specificherai nulla da riga di comando (puoi passare il percorso completo dove salvare il file CSV), il file verrà generato nella cartella C:\Temp, lo troverai come O365-User-License-Report_$($Today).csv (al posto di Today verrà ovviamente inserita data odierna).

Nel caso ti stessi chiedendo a cosa serve la funzione SaveFileWithProgressiveNumber (magari perché lo script ti sta restituendo errore) puoi dare un’occhiata qui: github.com/gioxx/ps.toybox/blob/198bd3e73d68780f10eaffb274df733471b76f3a/Gioxx.ToyBox/Gioxx.ToyBox.psm1#L3.

In caso di dubbi, lo sai già, l’area commenti è a tua totale disposizione :-)

#StaySafe


Credits: medium.com/@mozzeph/translate-microsoft-365-license-guids-to-product-names-in-powershell-e8fa373ace16

Correzioni, suggerimenti? Lascia un commento nell'apposita area qui di seguito o contattami privatamente.
Ti è piaciuto l'articolo? Offrimi un caffè! ☕ :-)

L'articolo potrebbe non essere aggiornato

Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)

Condividi l'articolo con i tuoi contatti:
Exit mobile version