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
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! :-)