Stop met geld verspillen: zo automatiseer je de optimalisatie van je Microsoft 365-licenties met PowerShell
By Mirko Peters · · Updated
Welkom terug op de blog! Als je een Microsoft 365-tenant beheert, ken je waarschijnlijk het ongemakkelijke gevoel dat je krijgt bij het openen van de factuur aan het einde van de maand. Je ziet tientallen, misschien wel honderden actieve licenties die zijn toegewezen aan gebruikers die sinds het vorige boekjaar niet meer hebben ingelogd. Handmatig controleren in het portaal voelt productief, maar
Automatically translated with AI from the original post. Read the English original
Welkom terug op de blog! Als je een Microsoft 365-tenant beheert, ken je waarschijnlijk het ongemakkelijke gevoel dat je krijgt bij het openen van de factuur aan het einde van de maand. Je ziet tientallen, misschien wel honderden actieve licenties die zijn toegewezen aan gebruikers die sinds het vorige boekjaar niet meer hebben ingelogd. Handmatig controleren in het portaal voelt productief, maar daarbij worden verouderde accounts, riskante delingen en enorme licentieverspilling regelmatig over het hoofd gezien. Als je het zat bent om steekproefsgewijs het beheercentrum na te lopen en bij je kwartaalaudits onaangename verrassingen te krijgen, is het tijd om automatisering in je werkproces op te nemen.
In deze post duiken we diep in de manier waarop je een gepland PowerShell-script schrijft dat inlogactiviteit kruiselings vergelijkt met actieve licenties. Aan het eind van deze gids weet je hoe je ongebruikte SKU's markeert, elke maand onnodige kosten terugdringt en je tenant beschermt tegen een wildgroei aan administratieve lasten.
Inleiding tot de optimalisatie van Microsoft 365-licenties
Licentieoptimalisatie wordt vaak gezien als een jaarlijkse hoofdpijn. IT-managers zijn druk bezig met het handmatig exporteren van gegevens, sturen afdelingshoofden berichten om te vragen of contractors nog actief zijn, en moeten gissen of een account echt verlaten is. Deze reactieve aanpak zorgt gegarandeerd voor verspild budget. Elke dag dat een vertrokken contractor of een medewerker die het bedrijf heeft verlaten nog een E5- of Business Premium-licentie heeft, verliest je organisatie geld.
Om dit op te lossen moeten we licentieoptimalisatie zien als een doorlopend, geautomatiseerd proces. Met PowerShell en Microsoft Graph kunnen we scripts bouwen die het zware werk voor ons doen, zodat we bruikbare gegevens hebben nog voordat onze ochtendkoffie klaar is.
Waarom handmatige controles in het portaal tekortschieten
Waarom zou je niet gewoon vertrouwen op het ingebouwde Microsoft 365-beheercentrum? Het portaal is ontworpen voor gemak, niet voor diepgaand governance. Wanneer je inlogt op de webinterface, zie je momentopnamen zonder historische context. Het portaal maakt het niet eenvoudig om de laatste inlogdatums af te zetten tegen specifieke licentie-SKU's voor duizenden gebruikers in één overzichtelijke weergave.
Bovendien hangen handmatige controles volledig af van het geheugen van de mens. Heb je gedacht aan de serviceaccounts? Heb je gecontroleerd of die gedeelde mailbox echt een Exchange Online Plan 2-licentie nodig heeft? Menselijke fouten leiden tot blinde vlekken, en die blinde vlekken kosten geld en brengen beveiligingsrisico's met zich mee.
De juiste PowerShell-modules en -scopes selecteren
Voordat je ook maar één regel scriptlogica schrijft, moet je je gereedschap verzamelen. Het PowerShell-ecosysteem van Microsoft is geëvolueerd, en wie vasthoudt aan verouderde modules krijgt alleen afkeuringswaarschuwingen en kapotte scripts. Je kernset zou het volgende moeten bevatten:
- Microsoft Graph PowerShell: De moderne standaard voor het beheren van gebruikers, groepen en directory-objecten.
- ExchangeOnlineManagement: Essentieel voor het controleren van postvakken, doorstuurregels en licentiering van gedeelde postvakken.
- PnP.PowerShell: Cruciaal voor het beoordelen van SharePoint-sites, gastlinks en een wildgroei aan externe delingen.
Zorg ervoor dat je het principe van minimale rechten toepast wanneer je machtigingen aan je scripts toekent. Gebruik nooit Global Administrator-inloggegevens voor geautomatiseerde scripts.
Wekelijkse alleen-lezen auditrapporten definiëren
De gouden regel van IT-automatisering is eenvoudig: eerst alleen-lezen. Begin je automatiseringsreis nooit met scripts die gebruikers automatisch verwijderen of licenties intrekken. Je eerste versie moet volledig gericht zijn op het verzamelen van gegevens.
Stel een wekelijks schema in dat een uitgebreide alleen-lezen audit uitvoert. Deze audit moet inactieve gebruikers, lijsten met gastentoegang, licentietoewijzingen versus daadwerkelijke inlogactiviteit, postvakconfiguraties en verweesde Microsoft 365-groepen beoordelen. Door een wekelijks ritme vast te leggen, vervang je chaotische crisisbestrijding door een review van tien minuten aan de hand van schone, automatisch gegenereerde rapporten.
Inlogregistraties kruiselings vergelijken met actieve licenties
Het geheime ingrediënt van licentieoptimalisatie is de kruisvergelijking. Een licentie op een gebruikersaccount is betekenisloos als die gebruiker al 90 dagen niet heeft geauthenticeerd. Je script moet twee hoofdbronnen ophalen uit Microsoft Entra ID:
- De aan de gebruiker toegewezen licentie-SKU's.
- De datum van de laatste aanmelding van de gebruiker (interactief en niet-interactief).
Door deze twee gegevensbronnen met PowerShell-objecten te combineren, kun je direct berekenen hoeveel licenties er verspild worden. Als de laatste aanmelding van een gebruiker een vooraf ingestelde drempel overschrijdt (bijvoorbeeld 60 of 90 dagen), markeert het script dat account als kandidaat voor licentieterugname.
Rapportage automatisch verzenden en artefacten opslaan
Een rapport dat ongebruikt in een lokale map ligt, heeft geen waarde. Je moet je bevindingen rechtstreeks aanleveren bij de mensen die actie kunnen ondernemen. Configureer je script zodat het gestructureerde CSV-bestanden en overzichtelijke HTML-samenvattingen genereert.
Laat het script vervolgens de samenvatting per e-mail sturen naar je distributielijst voor IT-governance, of plaats deze via een webhook rechtstreeks in een speciaal Microsoft Teams-kanaal. Sla daarnaast de ruwe CSV-artefacten op in een beveiligde SharePoint-documentbibliotheek voor governance, zodat je een historisch spoor hebt dat je voor compliancedoeleinden kunt tonen.
Veilig plannen met Azure Automation en Taakplanner
Waar moeten deze scripts draaien? Je kunt ze uitvoeren vanaf een lokale computer of een Windows Server via Taakplanner, met een beveiligde credentialopslag. De aanpak die geschikt is voor grote organisaties is echter Azure Automation.
Door je scripts als Azure Automation-runbooks te implementeren en te authenticeren via een Managed Identity, elimineer je het risico van hardcoded wachtwoorden of verlopen serviceprincipal-geheimen. Azure Automation zorgt moeiteloos voor de uitvoeringsomgeving, logging en foutafhandeling in de cloud.
Veiligheids- en compliancevangrails inrichten
Automatisering zonder vangrails is een ramp die wacht om te gebeuren. Bouw de volgende waarborgen in je automatiseringspijplijn in om je tenant te beschermen:
- Uitgebreide logging: Leg elke stap van de scriptuitvoering vast met correlatie-ID's.
- Try/Catch-blokken: Vang throttling, netwerktime-outs en machtigingsfouten correct af, en stuur bij een mislukte run een melding naar een gedeelde postbus.
- Wachtrijen voor openstaande acties: Verwijder licenties niet automatisch. Stuur acties met grote impact eerst door een "in afwachting"-wachtrij of een goedkeuringsworkflow.
Je saneringsstrategie gefaseerd uitrollen
Probeer niet alles op dag één te automatiseren. Rol je saneringsstrategie uit in duidelijke fasen:
- Week 1-2: Alleen rapportages. Verzamel gegevens, beoordeel valse positieven en pas je uitzonderingslijsten aan.
- Week 3-4: Lichte acties. Laat verlopen gastlinks vervallen en toon aanbevelingen voor het verwijderen van licenties die handmatige goedkeuring vereisen.
- Doorlopend: Automatiseer items met een laag risico, maar houd menselijke goedkeuringspunten aan voor wijzigingen die niet terug te draaien zijn.
Veelvoorkomende valkuilen bij PowerShell-automatisering oplossen
Zelfs de beste scripts lopen soms tegen problemen aan. Als je lege resultaten krijgt, controleer dan je Graph-machtigingen en modulversies, en test de query in Graph Explorer om het probleem te isoleren. Als je willekeurige fouten krijgt, raakt je script waarschijnlijk de throttlinglimieten. Implementeer exponentiële backoff en retrylogica om je runs stabiel te houden. Let ten slotte op valse positieven door een robuuste lijst te onderhouden met serviceaccounts en noodtoegangsaccounts.
Veelgestelde vragen
Gaat automatisering mijn tenant breken?
Nee, zolang je alleen-lezen begint, goedkeuringen toevoegt en de machtigingen van je automatiseringsaccounts strikt beperkt.
Heb ik nu Graph PowerShell nodig?
Ja, het is de moderne weg vooruit. Gebruik het samen met de modules voor Exchange Online en PnP om al je beheeroppervlakken te dekken.
Hoe snel zien we het rendement?
De eerste wekelijkse run brengt doorgaans een verrassend aantal ongebruikte licenties en verlopen gastaccounts aan het licht, wat meteen kansen oplevert om kosten te besparen.
Hoe zit het met multi-geo of MSP's?
Parameteriseer je tenantconfiguraties, centraliseer je loginfrastructuur en label je uitvoerrapporten met de tenant-ID om over meerdere omgevingen te kunnen schalen.
Conclusie
Het automatiseren van je licentieoptimalisatie voor Microsoft 365 is een van de projecten met het grootste hefboomeffect die een beheerder kan oppakken. Het stopt de maandelijkse verspilling van softwarekosten, versterkt je beveiliging door verlopen accounts op te ruimen en bespaart je tijdrovende handmatige controles in het portaal.
Wil je een volledige uitleg van deze concepten horen, inclusief live scriptanalyses en diepgaandere architectuurtips? Bekijk dan zeker de bijbehorende podcastaflevering: Automate Microsoft 365 Tenant Cleanup with PowerShell. Luister vandaag nog mee en til je automatisering naar een hoger niveau!