Smetti di sprecare denaro: come automatizzare l'ottimizzazione delle licenze di Microsoft 365 con PowerShell
By Mirko Peters · · Updated
Bentornato sul blog! Se gestisci un tenant di Microsoft 365, conosci probabilmente la sensazione di sgomento che provi quando apri la fattura a fine mese. Vedi decine, forse centinaia, di licenze attive assegnate a utenti che non effettuano l'accesso dall'anno fiscale precedente. I controlli manuali nel portale danno l'impressione di essere produttivi, ma spesso non individuano account inattivi, c
Automatically translated with AI from the original post. Read the English original
Bentornato sul blog! Se gestisci un tenant di Microsoft 365, conosci probabilmente la sensazione di sgomento che provi quando apri la fattura a fine mese. Vedi decine, forse centinaia, di licenze attive assegnate a utenti che non effettuano l'accesso dall'anno fiscale precedente. I controlli manuali nel portale danno l'impressione di essere produttivi, ma spesso non individuano account inattivi, condivisioni rischiose e sprechi di licenze. Se sei stanco di fare verifiche a campione nell'interfaccia di amministrazione e di ricevere brutte sorprese durante gli audit trimestrali, è arrivato il momento di portare l'automazione nel tuo flusso di lavoro.
In questo articolo vedremo nel dettaglio come scrivere uno script PowerShell pianificato che incrocia i log di accesso con le licenze attive. Al termine di questa guida saprai come individuare gli SKU non utilizzati, recuperare ogni mese i costi inutili e proteggere il tuo tenant da un carico amministrativo sempre più disordinato.
Introduzione all'ottimizzazione delle licenze di Microsoft 365
L'ottimizzazione delle licenze viene spesso vista come un mal di testa annuale. I responsabili IT corrono a esportare dati manuali, chiedono ai capi reparto se i collaboratori esterni sono ancora in azienda e tirano a indovinare se un account sia davvero abbandonato. Questo approccio reattivo garantisce uno spreco di budget. Ogni giorno in cui un collaboratore uscito o un dipendente che ha lasciato l'azienda mantiene una licenza E5 o Business Premium, la tua organizzazione perde denaro.
Per risolvere il problema, dobbiamo trattare l'ottimizzazione delle licenze come un processo continuo e automatizzato. Sfruttando PowerShell e Microsoft Graph possiamo creare script che fanno il lavoro pesante al posto nostro, fornendoci dati utili prima che il caffè del mattino sia pronto.
Perché i controlli manuali nel portale non bastano
Perché non affidarsi semplicemente all'interfaccia di amministrazione nativa di Microsoft 365? Il portale è pensato per la comodità, non per una governance approfondita. Quando accedi all'interfaccia web, vedi istantanee di un preciso momento, senza contesto storico. Il portale non permette facilmente di confrontare le date dell'ultimo accesso con i singoli SKU di licenza per migliaia di utenti in un'unica vista chiara e leggibile.
Inoltre, i controlli manuali dipendono interamente dalla memoria umana. Ti sei ricordato di verificare gli account di servizio? Hai controllato se quella casella condivisa ha davvero bisogno di una licenza Exchange Online Plan 2? L'errore umano genera punti ciechi, e questi punti ciechi costano denaro e introducono rischi per la sicurezza.
Scelta dei moduli e degli ambiti PowerShell corretti
Prima di scrivere anche solo una riga di logica dello script, devi preparare il tuo set di strumenti. L'ecosistema PowerShell di Microsoft si è evoluto e affidarsi ai moduli legacy porterà solo ad avvisi di deprecazione e script non funzionanti. Il tuo toolkit di base dovrebbe includere:
- Microsoft Graph PowerShell: lo standard moderno per la gestione di utenti, gruppi e oggetti della directory.
- ExchangeOnlineManagement: essenziale per verificare le caselle di posta, le regole di inoltro e le licenze delle caselle condivise.
- PnP.PowerShell: fondamentale per controllare i siti SharePoint, i link ospiti e la proliferazione delle condivisioni esterne.
Assicurati di applicare il principio del privilegio minimo quando concedi le autorizzazioni ai tuoi script. Non usare mai le credenziali di Amministratore globale per gli script automatizzati.
Definire i report di audit settimanali in sola lettura
La regola d'oro dell'automazione IT è semplice: prima la sola lettura. Non iniziare mai il percorso di automazione con script che eliminano automaticamente gli utenti o rimuovono le licenze. La prima versione deve concentrarsi interamente sulla raccolta dei dati.
Imposta una pianificazione settimanale che esegua un audit completo in sola lettura. Questo audit deve valutare gli utenti inattivi, gli elenchi degli accessi ospiti, le assegnazioni delle licenze rispetto all'attività di accesso effettiva, le configurazioni delle caselle di posta e i gruppi di Microsoft 365 orfani. Con un ritmo settimanale sostituisci le emergenze caotiche con una revisione di dieci minuti di report puliti e generati automaticamente.
Incrociare i log di accesso con le licenze attive
Il segreto dell'ottimizzazione delle licenze è il confronto incrociato. Una licenza assegnata a un account utente non ha alcun senso se quell'utente non si autentica da 90 giorni. Lo script deve recuperare due set di dati principali da Microsoft Entra ID:
- Gli SKU di licenza assegnati all'utente.
- La data dell'ultimo accesso dell'utente (interattivo e non interattivo).
Unendo questi due dati tramite oggetti PowerShell, puoi calcolare subito lo spreco di licenze. Se l'ultimo accesso di un utente supera una soglia definita (ad esempio 60 o 90 giorni), lo script segnala l'account come candidato al recupero della licenza.
Automatizzare la distribuzione dei report e l'archiviazione degli artefatti
Un report che resta in silenzio in una directory locale non serve a nulla. Devi inviare i risultati direttamente alle persone che possono intervenire. Configura lo script in modo che generi file CSV strutturati e riepiloghi HTML puliti.
Successivamente, fai in modo che lo script invii il riepilogo via email alla distribution list della governance IT oppure lo pubblichi direttamente in un canale dedicato di Microsoft Teams tramite webhook. Inoltre, archivia gli artefatti CSV grezzi in una libreria documenti SharePoint dedicata alla governance, così da mantenere uno storico tracciabile a fini di conformità.
Pianificare in sicurezza con Azure Automation e Utilità di pianificazione
Dove devono risiedere questi script? Puoi eseguirli da un computer locale o da un Windows Server tramite Utilità di pianificazione, usando un archivio credenziali sicuro, ma l'approccio di livello enterprise è Azure Automation.
Distribuendo gli script come runbook di Azure Automation e autenticandoti tramite identità gestita, elimini il rischio di password incorporate nel codice o di segreti delle entità servizio scaduti. Azure Automation gestisce senza difficoltà l'ambiente di esecuzione, la registrazione e la gestione degli errori nel cloud.
Implementare le misure di sicurezza e conformità
L'automazione senza misure di protezione è un disastro in attesa di accadere. Per proteggere il tuo tenant, integra nella pipeline di automazione le seguenti salvaguardie:
- Registrazione dettagliata: acquisisci ogni singolo passaggio dell'esecuzione dello script con ID di correlazione.
- Blocchi Try/Catch: gestisci con eleganza throttling, timeout di rete ed errori di autorizzazioni, inviando avvisi a una casella di posta condivisa se un'esecuzione non va a buon fine.
- Code delle azioni in sospeso: invece di rimuovere automaticamente le licenze, instrada prima le azioni ad alto impatto attraverso una coda « in sospeso » o un flusso di approvazione.
Pianificare per fasi la strategia di correzione
Non cercare di automatizzare tutto fin dal primo giorno. Implementa la strategia di correzione per fasi chiare:
- Settimana 1-2: solo report. Raccogli i dati, verifica i falsi positivi e modifica gli elenchi di eccezioni.
- Settimana 3-4: azioni leggere. Inizia a far scadere i link degli ospiti inattivi e a segnalare le raccomandazioni di rimozione delle licenze che richiedono approvazione manuale.
- Continuativo: automatizza gli elementi a basso rischio, mantenendo però gate di approvazione umana per le modifiche distruttive.
Risolvere i problemi più comuni nell'automazione con PowerShell
Anche gli script migliori incontrano qualche intoppo. Se ottieni risultati vuoti, ricontrolla le autorizzazioni di Graph e le versioni dei moduli, e prova la query in Graph Explorer per isolare il problema. Se si verificano errori casuali, probabilmente il tuo script sta raggiungendo i limiti di throttling. Implementa una logica di backoff esponenziale e di nuovo tentativo per mantenere stabili le esecuzioni. Infine, fai attenzione ai falsi positivi mantenendo un elenco solido di account di servizio e di account di emergenza (break-glass) da escludere.
Domande frequenti
L'automazione manderà in crisi il mio tenant?
No, se parti in sola lettura, aggiungi approvazioni e limiti rigorosamente le autorizzazioni concesse agli account di automazione.
Mi servono subito i moduli Graph PowerShell?
Sì, è la strada moderna da seguire. Usali insieme ai moduli Exchange Online e PnP per coprire tutte le aree di amministrazione.
Quanto velocemente possiamo vedere il ritorno sull'investimento?
La prima esecuzione settimanale fa emergere di solito una quantità sorprendente di licenze inutilizzate e di account ospite inattivi, offrendo subito opportunità di risparmio.
E per multi-geo o MSP?
Parametrizza le configurazioni dei tenant, centralizza l'infrastruttura di logging ed etichetta i report generati con l'ID tenant, così da scalare su più ambienti.
Conclusione
Automatizzare l'ottimizzazione delle licenze di Microsoft 365 è uno dei progetti con il maggior ritorno che un amministratore possa intraprendere. Pone fine alla continua dispersione di spesa software inutile, rafforza la postura di sicurezza ripulendo gli account inattivi e ti libera da controlli manuali e ripetitivi nel portale.
Se vuoi seguire una panoramica completa di questi concetti, con analisi live degli script e consigli architetturali più approfonditi, non perdere l'episodio di podcast correlato: Automate Microsoft 365 Tenant Cleanup with PowerShell. Sintonizzati e porta oggi stesso le tue competenze di automazione a un livello superiore!