Arrêtez de gaspiller de l’argent : comment automatiser l’optimisation des licences Microsoft 365 avec PowerShell
By Mirko Peters · · Updated
Bienvenue sur le blog ! Si vous gérez un locataire Microsoft 365, vous connaissez sans doute ce sentiment de malaise lorsque vous ouvrez la facture en fin de mois. Vous y voyez des dizaines, voire des centaines, de licences actives attribuées à des utilisateurs qui ne se sont pas connectés depuis l’exercice fiscal précédent. Les vérifications manuelles dans le portail donnent une impression de pro
Automatically translated with AI from the original post. Read the English original
Bienvenue sur le blog ! Si vous gérez un locataire Microsoft 365, vous connaissez sans doute ce sentiment de malaise lorsque vous ouvrez la facture en fin de mois. Vous y voyez des dizaines, voire des centaines, de licences actives attribuées à des utilisateurs qui ne se sont pas connectés depuis l’exercice fiscal précédent. Les vérifications manuelles dans le portail donnent une impression de productivité, mais elles passent régulièrement à côté des comptes inactifs, des partages à risque et des dépenses de licences considérables. Si vous en avez assez de contrôler par sondage le centre d’administration et de découvrir de désagréables surprises lors de vos audits trimestriels, il est temps d’intégrer l’automatisation à votre façon de travailler.
Dans cet article, nous allons examiner en détail comment écrire un script PowerShell planifié qui croise les journaux de connexion avec les licences actives. À la fin de ce guide, vous saurez comment signaler les références SKU inutilisées, réduire chaque mois les coûts superflus et protéger votre locataire contre une charge administrative qui s’étend sans contrôle.
Présentation de l’optimisation des licences Microsoft 365
L’optimisation des licences est souvent perçue comme une corvée annuelle. Les responsables informatiques s’activent pour extraire manuellement des exports, relancent les responsables de service pour savoir si les prestataires sont toujours en mission et devinent si un compte est réellement abandonné. Cette approche réactive garantit un gaspillage budgétaire. Chaque jour où un prestataire parti ou un collaborateur ayant quitté l’entreprise conserve une licence E5 ou Business Premium, votre organisation perd de l’argent.
Pour y remédier, il faut considérer l’optimisation des licences comme un processus continu et automatisé. En tirant parti de PowerShell et de Microsoft Graph, nous pouvons créer des scripts qui effectuent le gros du travail et fournissent des données exploitables avant même que votre café du matin ne soit prêt.
Les limites des vérifications manuelles dans le portail
Pourquoi ne pas simplement vous fier au centre d’administration natif de Microsoft 365 ? Le portail a été conçu pour la commodité, et non pour une gouvernance approfondie. Lorsque vous vous connectez à l’interface web, vous consultez des instantanés ponctuels, sans contexte historique. Le portail ne permet pas facilement de croiser les dates de dernière connexion avec des références SKU de licences spécifiques pour des milliers d’utilisateurs, dans une vue unique et lisible.
De plus, les vérifications manuelles dépendent entièrement de la mémoire humaine. Avez-vous pensé à contrôler les comptes de service ? Avez-vous vérifié si cette boîte aux lettres partagée avait réellement besoin d’une licence Exchange Online Plan 2 ? Les erreurs humaines créent des angles morts, et ces angles morts coûtent de l’argent et introduisent des risques de sécurité.
Choisir les bons modules et étendues PowerShell
Avant d’écrire la moindre ligne de logique de script, il faut rassembler votre boîte à outils. L’écosystème PowerShell de Microsoft a évolué, et s’appuyer sur d’anciens modules ne mène qu’à des avertissements de dépréciation et à des scripts défaillants. Votre boîte à outils de base doit comprendre :
- Microsoft Graph PowerShell : la norme moderne pour la gestion des utilisateurs, des groupes et des objets de l’annuaire.
- ExchangeOnlineManagement : indispensable pour auditer les boîtes aux lettres, les règles de transfert et les licences des boîtes aux lettres partagées.
- PnP.PowerShell : essentiel pour examiner les sites SharePoint, les liens invités et la prolifération des partages externes.
Veillez à appliquer le principe du moindre privilège lorsque vous accordez des autorisations à vos scripts. N’utilisez jamais les identifiants d’administrateur général pour des scripts automatisés.
Définir des rapports d’audit hebdomadaires en lecture seule
La règle d’or de l’automatisation informatique est simple : la lecture seule d’abord. Ne commencez jamais votre démarche d’automatisation avec des scripts qui suppriment automatiquement des utilisateurs ou retirent des licences. Votre première itération doit se concentrer entièrement sur la collecte de données.
Mettez en place une planification hebdomadaire qui exécute un audit complet en lecture seule. Cet audit doit évaluer les utilisateurs inactifs, les listes d’accès invités, l’attribution des licences par rapport à l’activité réelle de connexion, la configuration des boîtes aux lettres et les groupes Microsoft 365 orphelins. En instaurant un rythme hebdomadaire, vous remplacez les interventions d’urgence désordonnées par un examen de dix minutes de rapports propres, générés automatiquement.
Croiser les journaux de connexion avec les licences actives
Le secret de l’optimisation des licences réside dans le croisement des données. Une licence attribuée à un compte utilisateur n’a aucun sens si cet utilisateur ne s’est pas authentifié depuis 90 jours. Votre script doit extraire deux jeux de données principaux de Microsoft Entra ID :
- Les références SKU de licences attribuées à l’utilisateur.
- La date de dernière connexion de l’utilisateur (interactive et non interactive).
En joignant ces deux jeux de données à l’aide d’objets PowerShell, vous pouvez calculer immédiatement le gaspillage de licences. Si la dernière connexion d’un utilisateur dépasse un seuil défini (par exemple 60 ou 90 jours), le script signale ce compte comme candidat à la récupération de licence.
Automatiser la diffusion des rapports et le stockage des artefacts
Un rapport qui reste enfoui dans un répertoire local ne sert à rien. Vous devez transmettre vos constats directement aux personnes capables d’agir. Configurez votre script pour générer des fichiers CSV structurés et des synthèses HTML épurées.
Ensuite, faites envoyer la synthèse par courriel à votre liste de distribution de gouvernance IT, ou publiez-la directement dans un canal Microsoft Teams dédié via un webhook. Par ailleurs, stockez les fichiers CSV bruts dans une bibliothèque de documents SharePoint de gouvernance sécurisée afin de conserver une traçabilité historique à des fins de conformité.
Planifier en toute sécurité avec Azure Automation et le Planificateur de tâches
Où ces scripts doivent-ils être hébergés ? Vous pouvez les exécuter depuis un ordinateur local ou un Windows Server à l’aide du Planificateur de tâches, en vous appuyant sur un magasin d’identifiants sécurisé. Toutefois, l’approche de niveau entreprise reste Azure Automation.
En déployant vos scripts sous forme de runbooks Azure Automation et en vous authentifiant au moyen d’une identité managée, vous éliminez le risque de mots de passe codés en dur ou de secrets de principal de service expirés. Azure Automation prend en charge l’environnement d’exécution, la journalisation et la gestion des erreurs, de manière transparente, dans le cloud.
Mettre en place des garde-fous de sécurité et de conformité
Une automatisation sans garde-fous est une catastrophe qui n’attend que de se produire. Pour protéger votre locataire, intégrez les dispositifs de protection suivants à votre chaîne d’automatisation :
- Journalisation détaillée : enregistrez chaque étape de l’exécution du script avec des identifiants de corrélation.
- Blocs Try/Catch : gérez correctement la limitation de débit, les délais d’attente réseau et les erreurs d’autorisation, en envoyant une alerte à une boîte aux lettres partagée en cas d’échec d’une exécution.
- Files d’attente d’actions en attente : plutôt que de retirer automatiquement les licences, faites passer les actions à fort impact par une file d’attente « en attente » ou par un workflow d’approbation.
Échelonner votre stratégie de remédiation
N’essayez pas d’automatiser tout dès le premier jour. Déployez votre stratégie de remédiation en phases claires :
- Semaines 1 et 2 : rapports uniquement. Collectez les données, examinez les faux positifs et ajustez vos listes d’exceptions.
- Semaines 3 et 4 : actions légères. Commencez à faire expirer les liens d’invités obsolètes et à présenter les recommandations de suppression de licences qui requièrent une approbation manuelle.
- En continu : automatisez les éléments à faible risque, tout en maintenant des points de validation humaine pour les modifications destructrices.
Résoudre les écueils courants de l’automatisation PowerShell
Même les meilleurs scripts rencontrent des difficultés. Si les résultats sont vides, vérifiez attentivement vos autorisations Graph et les versions de vos modules, puis testez la requête dans Graph Explorer pour isoler le problème. Si les échecs sont aléatoires, votre script atteint probablement les limites de débit. Mettez en œuvre une logique de nouvelle tentative avec temporisation exponentielle afin de garantir la stabilité de vos exécutions. Enfin, méfiez-vous des faux positifs : tenez à jour une liste d’exclusion solide pour les comptes de service et les comptes d’accès d’urgence.
Questions fréquentes
L’automatisation va-t-elle casser mon locataire ?
Non, à condition de commencer en lecture seule, d’ajouter des approbations et de limiter strictement les autorisations accordées à vos comptes d’automatisation.
Ai-je besoin de Graph PowerShell dès maintenant ?
Oui, c’est la voie moderne à suivre. Utilisez-le en complément des modules Exchange Online et PnP pour couvrir l’ensemble de vos périmètres d’administration.
Dans quel délai peut-on constater un retour sur investissement ?
La première exécution hebdomadaire fait généralement apparaître un nombre étonnant de licences inutilisées et de comptes invités obsolètes, offrant des économies immédiates.
Qu’en est-il du multi-géo ou des MSP ?
Paramétrez les configurations de vos locataires, centralisez votre infrastructure de journalisation et associez chaque rapport produit à l’identifiant de locataire correspondant afin de passer à l’échelle sur plusieurs environnements.
Conclusion
Automatiser l’optimisation de vos licences Microsoft 365 fait partie des projets à plus fort levier qu’un administrateur puisse mener. Cela met fin à la dépense mensuelle des logiciels inutilisés, renforce votre posture de sécurité en nettoyant les comptes obsolètes et vous libère des vérifications manuelles fastidieuses dans le portail.
Si vous souhaitez suivre une présentation complète de ces concepts, incluant des analyses de scripts en direct et des conseils d’architecture plus approfondis, découvrez l’épisode de podcast associé : Automate Microsoft 365 Tenant Cleanup with PowerShell. Rendez-vous à l’écoute pour passer au niveau supérieur dans votre automatisation dès aujourd’hui !