Site icon Gioxx.org

Licenze Microsoft 365: modifica bulk via PowerShell 7 e Graph

PowerShell: usare Try/Catch per un output pulito in caso di errore

Tempo fa ti avevo parlato di PowerShell 7 e Microsoft Graph per tirare fuori la situazione licenze aggiornate di un tenant Microsoft 365 (Report licenze di Office 365 via PowerShell 7 e Microsoft Graph).
Oggi riprendo l’argomento perché nel frattempo ho avuto necessità di ritoccare le licenze di molti degli utenti gestiti in occasione del rinnovo parco licenze aziendali Microsoft.

Mi è servita nuovamente la PowerShell (ormai solo versione 7 aggiornata, non torno indietro), Microsoft Graph (con un pelo più di autorizzazioni rispetto al passato) e la documentazione Microsoft che fortunatamente non ha mancato di farmi capire come muovermi al meglio) e un po’ di file CSV da dare in pasto al terminale, tutta roba che voglio vedere insieme a te a mo’ di ripasso e appunti per il futuro nel caso servisse ancora e la memoria dovesse fare cilecca.

Connect-Graph

Dovresti ormai averlo installato e potrai richiamarlo facilmente via PowerShell. Già che ci siamo, lancia la connessione con già i permessi necessari per operare (documentazione ufficiale disponibile all’indirizzo learn.microsoft.com/en-us/microsoft-365/enterprise/remove-licenses-from-user-accounts-with-microsoft-365-powershell). Ti servirà successivamente autenticarti e darti i permessi nel momento in cui Microsoft ti chiederà conferma di accesso in lettura e scrittura sugli utenti del tenant (non servirà invece per il diritto di sola lettura dell’intera organizzazione):

Connect-Graph -Scopes User.ReadWrite.All, Organization.Read.All

Welcome To Microsoft Graph! :-)

La corrispondenza delle licenze

Quello che ti serve conoscere ora è la corrispondenza tra il nome “pubblico” della licenza che tu puoi vedere tramite console Microsoft (la dashboard dell’amministratore) e quello che viene effettivamente riconosciuto da PowerShell, una roba così confusionaria che credo sia stata partorita durante la pausa alcolica da grandi menti di Redmond, che ringrazio molto per il viaggio senza droghe aggiunte. Te la spiego un attimo meglio. Per licenze intendo quelle che tu stesso puoi vedere puntando il browser alla pagina admin.microsoft.com/Adminportal/Home?#/licenses.
Qui spesso hanno nomi ben precisi che però arrivando alla stessa tabella via PowerShell potrebbero non sembrarti più così parlanti:

PS C:\> Get-MgSubscribedSku -All | select skuid,skupartnumber

SkuId                                SkuPartNumber
-----                                -------------
c5928f49-12ba-48f7-ada3-0d743a3601d5 VISIOCLIENT
1f2f344a-700d-42c9-9427-5cea1d5d7ba6 STREAM
f8a1db68-be16-40ed-86d5-cb42ce701560 POWER_BI_PRO
8f0c5670-4e56-4892-b06d-91c085d7004f SPZA_IW
7ac9fe77-66b7-4e5e-9e46-10eed1cff547 DYN365_TEAM_MEMBERS
6470687e-a428-4b7a-bef2-8a291ad947c9 WINDOWS_STORE
6fd2c87f-b296-42f0-b197-1e91e994b900 ENTERPRISEPACK
f30db892-07e9-47e9-837c-80727f46fd3d FLOW_FREE
dcb1a3ae-b33f-4487-846a-a640262fadf4 POWERAPPS_VIRAL
4b9405b0-7788-4568-add1-99614e613b69 EXCHANGESTANDARD
84a661c4-e949-4bd2-a560-ed7766fcaf2b AAD_PREMIUM_P2
ea126fc5-a19e-42e2-a731-da9d437bffcf DYN365_ENTERPRISE_PLAN1
f245ecc8-75af-4f8e-b61f-27d8114de5f3 O365_BUSINESS_PREMIUM
a403ebcc-fae0-4ca2-8c8c-7a907fd6c235 POWER_BI_STANDARD
710779e8-3d4a-4c88-adb9-386c958d1fdf TEAMS_EXPLORATORY
efccb6f7-5641-4e0e-bd10-b4976e1bf68e EMS
eb18b715-ea9d-4290-9994-2ebf4b5042d2 D365_CUSTOMER_SERVICE_ENT_ATTACH
53818b1b-4a27-454b-8896-0dba576410e6 PROJECTPROFESSIONAL
19ec0d23-8335-4cbd-94ac-6050e30712fa EXCHANGEENTERPRISE
e612d426-6bc3-4181-9658-91aa906b0ac0 CDS_DB_CAPACITY
328dc228-00bc-48c6-8b09-1fbc8bc3435d CRMSTORAGE
1e1a282c-9c54-43a2-9310-98ef728faace DYN365_ENTERPRISE_SALES
16a55f2f-ff35-4cd5-9146-fb784e3761a5 DEFENDER_ENDPOINT_P1
8c4ce438-32a7-4ac5-91a6-e22ae08d9c8b RIGHTSMANAGEMENT_ADHOC
5b631642-bd26-49fe-bd20-1daaa972ef80 POWERAPPS_DEV
cdd28e44-67e3-425e-be4c-737fab2899d3 O365_BUSINESS
18181a46-0d4e-45cd-891e-60aabd171b4e STANDARDPACK

L’elenco qui sopra si basa sulle licenze che io ho in questo momento nel bouquet aziendale e che ho richiesto alla mia PowerShell, ma puoi fare riferimento a un ulteriore documento ufficiale Microsoft più completo che riporta i vari prodotti e i loro SkuId: learn.microsoft.com/en-us/azure/active-directory/enterprise-users/licensing-service-plan-reference (prezioso come l’oro quando vorrai tradurre da licenza che leggi in dashboard a reale licenza rilevata da PowerShell).

Giusto per fare un esempio concreto dai un’occhiata alla licenza con SkuPartNumber O365_BUSINESS_PREMIUM, è quella che in dashboard amministrativa viene dichiarata come “Microsoft 365 Business Standard“, me lo spieghi tu il collegamento da PREMIUM a Standard? Ora hai capito cosa intendo? Bene, andiamo avanti :-)

A cosa serve la corrispondenza? Presto detto: se vuoi staccare una (o più) licenza da un utente ti servirà conoscere lo SkuId da dichiarare nelle licenze da rimuovere e nonostante Microsoft consigli di lasciar fare la PowerShell per la trasformazione da SkuPartNumber a SkuId, talvolta il processo non va a buon fine e ti ritroverai con un pugno di mosche e l’utente senza alcuna modifica applicata. Preferisco quindi portarti su un metodo meno elegante ma certamente funzionante.

Per capirci: vuoi rimuovere una licenza E3 da un utente? Ok, la licenza E3 corrisponde all’ID 6fd2c87f-b296-42f0-b197-1e91e994b900, la potrai staccare dall’utente “Mario Rossi” così facendo:

Set-MgUserLicense -UserId mario.rossi@contoso.com -RemoveLicenses @("6fd2c87f-b296-42f0-b197-1e91e994b900") -AddLicenses @{}

Attenzione

Sei costretto a dichiarare anche il parametro -AddLicenses @{} seppur vuoto?
, vale anche al contrario, cioè se stai aggiungendo una licenza e non devi rimuoverne altre.

Vuoi aggiungere una licenza? Ok, la licenza Microsoft 365 Apps for business (quella che fornisce Microsoft Office completo e nulla più) corrisponde all’ID cdd28e44-67e3-425e-be4c-737fab2899d3. Aggiungiamola al sempre malcapitato Mario Rossi:

Set-MgUserLicense -UserId mario.rossi@contoso.com -AddLicenses @{SkuId = "cdd28e44-67e3-425e-be4c-737fab2899d3"} -RemoveLicenses @()

Le basi sono queste. Le cose si fanno un attimo più complicate quando devi togliere e mettere licenze, magari anche più di una contemporaneamente, nulla di inarrivabile.
Prima di passare alla ciccia però ti interesserà – forse – sapere che è possibile disabilitare singoli prodotti di una licenza Microsoft 365 aggiungendo il parametro “DisabledPlans” allo SkuId interessato.

DisabledPlans

Dichiarare i DisabledPlans per uno o più SkuId ti permette di andare a disattivare (in realtà a non attivare proprio) singole voci prodotto di una qualsiasi tra le licenze Microsoft 365. Per ottenere la lista dei singoli servizi di una licenza puoi chiedere aiuto al documento che ti ho proposto prima (sempre lui: learn.microsoft.com/en-us/azure/active-directory/enterprise-users/licensing-service-plan-reference) oppure usare la PowerShell:

Get-MgUserLicenseDetail -UserId mario.rossi@contoso.com | where skupartnumber -eq STANDARDPACK | select -ExpandProperty serviceplans

A quel punto dovrai nuovamente litigare con le corrispondenze tra nomi pubblicamente visibili e SkuPartNumber che la PowerShell digerisce.
Per capirci: una licenza E1 include al suo interno il prodotto Skype for Business. Se io non volessi attivarlo dovrei semplicemente aggiungere una licenza a Mario Rossi contenente la E1 (con ID 18181a46-0d4e-45cd-891e-60aabd171b4e) e disabilitare il piano Skype for Business (ID 0feaeb32-d00e-4d66-bd5a-43b5b83db82c), si traduce così:

Set-MgUserLicense -UserId mario.rossi@contoso.com -AddLicenses @{SkuId = "18181a46-0d4e-45cd-891e-60aabd171b4e" DisabledPlans = "0feaeb32-d00e-4d66-bd5a-43b5b83db82c"} -RemoveLicenses @()

Togli la licenza, metti la licenza

Ora che hai tutti gli elementi per operare, basta poco per comporre un automatismo basato su un file CSV. Dato un elenco di utenti ai quali rimuovere una determinata licenza (E3 nell’esempio), a me servirà assegnare loro una E1 rimuovendo il servizio Skype for Business e aggiungere anche una Microsoft 365 Apps for business per potergli permettere di utilizzare Office:

$e1OfficeAppsNoSkype = @(
  @{SkuId = "18181a46-0d4e-45cd-891e-60aabd171b4e"
  DisabledPlans = "0feaeb32-d00e-4d66-bd5a-43b5b83db82c"},
  @{SkuId = "cdd28e44-67e3-425e-be4c-737fab2899d3"}
)

Import-Csv C:\elenco.csv | foreach {
  Write-Progress "Cambio licenze $($_.mailbox)"
  Set-MgUserLicense -UserId $_.mailbox -RemoveLicenses @("6fd2c87f-b296-42f0-b197-1e91e994b900") -AddLicenses $e1OfficeAppsNoSkype
}

Ovviamente dovrai modificare la posizione del file CSV (nell’esempio C:\elenco.csv) e l’intestazione di colonna (nell’esempio mailbox) per poter usare lo script sopra riportato, ma per il resto potrai certamente metterti comodo e lasciar fare a PowerShell. Penserà lo script a togliere la licenza E3 e aggiungere una Microsoft 365 Apps for business insieme a una E1 senza Skype for Business.

Modificando anche di poco lo script qui sopra potrai davvero fare qualsiasi cosa tu voglia sulle licenze assegnate agli utenti. Potresti anche decidere di cercare a tutto spiano coloro che possiedono una determinata licenza senza prima averli già estratti e portati in CSV, quindi modificarli e cambiare le loro licenze “tutto live“. In caso di errori sarà la PowerShell a darti gli output che ti porteranno sulla giusta via, è così che ho scoperto alcune incongruenze di servizi tra licenze simili che ho facilmente sanato rimettendo “in bolla” una situazione iniziale tutt’altro che lineare e semplice.

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

#StaySafe


Credits:
learn.microsoft.com/en-us/powershell/module/microsoft.graph.users.actions/set-mguserlicense
learn.microsoft.com/en-us/microsoft-365/enterprise/disable-access-to-services-with-microsoft-365-powershell

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