Belangrijkste punten
- Risico’s opsporen: bevraag de Microsoft Graph API met PowerShell om verlopen Microsoft 365-licenties en Azure AD-accounts op te sporen die al 90 dagen of langer inactief zijn.
- Zorg voor de juiste toegang: stel een rol van Globale beheerder of Rapportenlezer in, installeer de Microsoft Graph PowerShell SDK en regel de machtigingen User.Read.All, LicenseAssignment.ReadWrite.All en AuditLog.Read.All voordat u de controles uitvoert.
- Resultaten exporteren en archiveren: sla de bevindingen op in CSV-rapporten met tijdstempel zodat u een audittrail houdt voor compliance en beslissingen over het terugwinnen van licenties.
- Automatiseer de planning: voer het script periodiek uit met Windows Taakplanner op één machine of rol het uit naar meerdere endpoints en tenants via een RMM-tool.
- Uitsluiten en afstemmen: zet serviceaccounts en break-glass-accounts op een whitelist en stel inactiviteitsdrempels in die passen bij de risicobereidheid van uw organisatie.
Ongebruikte Microsoft 365-licenties vreten ongemerkt aan uw budget en inactieve Azure AD-accounts vormen een reëel beveiligingsrisico. Automatiseer controles met de Microsoft Graph API om verlopen licenties en slapende accounts te detecteren voordat ze leiden tot verspilde uitgaven of beveiligingsgaten.
In deze handleiding laten we zien hoe u essentiële controles inplant via PowerShell om kwetsbaarheden af te sluiten en op te schalen naar al uw klanten.
Wilt u snel een visueel overzicht? Bekijk dan onze videogids Zo voert u geplande Graph API-controles uit op verlopen licenties en inactieve gebruikers.
Stap voor stap: Graph API-controles plannen via PowerShell
Automatiseer Graph API-controles om verspilde licenties terug te winnen, slapende accounts te beveiligen, aan compliance te voldoen en uw tenantbeheer te stroomlijnen – alles in één keer.
Use case: pas deze methode toe tijdens maandelijkse kostenreviews, beveiligingsaudits of vóór licentieverlengingen. Dit is ideaal voor MSP’s die verlopen Office 365-licenties terugwinnen of de beveiliging verharden na de offboarding van medewerkers. Zo spoort u inactieve gebruikers op voordat ze kwetsbaarheden in uw systeem worden.
Vereisten: zorg dat u het volgende hebt voordat we met de procedure beginnen:
- Beheerdersmachtigingen: controleer of uw account de rol Globale beheerder of Rapportenlezer heeft in Azure AD.
- Tools: Microsoft Graph PowerShell SDK (module Microsoft.Graph) en PowerShell 7+.
- Azure-configuratie: zorg dat uw Azure AD-app beschikt over de machtigingen User.Read.All, LicenseAssignment.ReadWrite.All en AuditLog.Read.All voor automatisering.
- Optioneel maar aanbevolen: download en installeer een RMM-tool zoals NinjaOne om scripts in te plannen, de uitvoer te monitoren en op te schalen naar meerdere tenants.
Stap 1: installeer de Microsoft Graph SDK en authenticeer
Richt uw toolkit in om licentie- en gebruikerscontroles te automatiseren. Door de Graph SDK te installeren, kunt u Azure AD-gegevens opvragen die de beheerder normaal verbergt en koppelt u uw script via authenticatie aan de API van Microsoft.
Stap voor stap:
- Installeer de SDK door dit script uit te voeren in PowerShell (Admin) of Windows Terminal (Admin):
Install-Module Microsoft.Graph -Scope CurrentUser -Force
- Authenticeer met dit script:
Connect-MgGraph -Scopes "User.Read.All", "LicenseAssignment.ReadWrite.All", "AuditLog.Read.All
U kunt ook een geregistreerde app met een client secret configureren en certificaat- of client credentials-flow gebruiken voor onbeheerde uitvoering.
Zodra u de Graph SDK hebt geauthenticeerd, kunt u in de volgende stappen inactieve Azure AD-gebruikers en verlopen Office 365-licenties opvragen.
Stap 2: zoek gebruikers met verlopen of niet-toegewezen licenties
Deze stap brengt verlopen licenties en inactieve accounts aan het licht die een beveiligingsrisico en onnodige kosten met zich meebrengen.
Stap voor stap:
- Voer in PowerShell (Admin) dit script uit om op tenantniveau te controleren op niet-toegewezen licenties:
Get-MgSubscribedSku |Select-Object SkuPartNumber,@{Name="TotalLicenses"; Expression={$_.PrepaidUnits.Enabled}},@{Name="UsedLicenses"; Expression={$_.ConsumedUnits}},@{Name="Available"; Expression={$_.PrepaidUnits.Enabled - $_.ConsumedUnits}} |Format-Table -AutoSize
- Voer dit script uit om gebruikers zonder licentie te vinden:
Get-MgUser -Filter "assignedLicenses/`$count eq 0" `-ConsistencyLevel eventual `-CountVariable unlicensedCount `-All |Select-Object DisplayName, UserPrincipalName |Export-Csv -Path "UnlicensedUsers.csv" -NoTypeInformation
- Voer dit script uit om inactieve gebruikers mét licentie te vinden:
$daysInactive = 90$cutoffDate = (Get-Date).AddDays(-$daysInactive)# Get licensed inactive usersGet-MgUser -All -Property "DisplayName,UserPrincipalName,SignInActivity,AssignedLicenses" |Where-Object {($_.SignInActivity.LastSignInDateTime -lt $cutoffDate) -and($_.AssignedLicenses.Count -gt 0)} |Select-Object DisplayName,UserPrincipalName,@{Name="LastSignIn"; Expression={$_.SignInActivity.LastSignInDateTime}} |Export-Csv -Path "InactiveLicensedUsers.csv" -NoTypeInformation
Belangrijk: houd er rekening mee dat SignInActivity Azure AD Premium P1/P2 vereist. Vermijd daarnaast beta-endpoints in productiescripts.
Na het uitvoeren van deze scripts hebt u twee CSV-bestanden: UnlicensedUsers.csv met gebruikers die een licentie nodig hebben en InactiveLicensedUsers.csv met accounts die een beveiligingsrisico vormen.
Stap 3: exporteer en log de auditresultaten
Zodra u de lijst met verlopen en niet-toegewezen licenties hebt, zet u die gegevens om in bruikbare inzichten via geautomatiseerde rapportage. Door deze gegevens te exporteren, creëert u permanente audittrails als bewijs van compliance en met automatisering signaleert u problemen voordat ze geld kosten.
Stap voor stap:
- Voer in PowerShell (Admin) dit script uit om te exporteren naar een CSV met tijdstempel:
- Script om een bestandsnaam met tijdstempel te genereren:
$timestamp = Get-Date -Format "yyyyMMdd-HHmm"$reportPath = "C:\Audits\LicenseReport_$timestamp.csv"
- Exporteer inactieve gebruikers met licentie:
$inactiveUsers | Export-Csv -Path $reportPath -NoTypeInformation
- Dit levert CSV-bestanden op die overal te openen zijn en dankzij de tijdstempel krijgt u versiebeheerde gegevens voor compliance.
- (Optioneel): voer dit script uit om rapporten te mailen:
Send-MailMessage -From "[email protected]" -To "[email protected]" `-Subject "ACTION REQUIRED: $($inactiveUsers.Count) Inactive Licensed Users" `-Body "Attached: Users with licenses but no sign-ins for 90+ days" `-Attachments $reportPath -SmtpServer "smtp.office365.com" -Port 587 `-Credential (Get-Credential)
- Voer dit script uit om alles volledig te automatiseren met de Azure AD-app:
$tenantId = "YOUR_TENANT_ID"$clientId = "YOUR_CLIENT_ID"$clientSecret = "YOUR_SECRET" | ConvertTo-SecureString -AsPlainText -ForceConnect-MgGraph -TenantId $tenantId -ClientId $clientId -ClientSecret $clientSecret
Tip: bewaar secrets in Azure Key Vault. Hardcode ze nooit.
Na het uitvoeren van deze scripts hebt u lokaal opgeslagen CSV-rapporten met tijdstempel en eventueel directe e-mailnotificaties naar belanghebbenden. Met deze bestanden kunt u geautomatiseerde runs opzetten via Taakplanner of RMM-tools zoals NinjaOne voor doorlopende monitoring.
Stap 4: automatiseren met Taakplanner of een RMM-beleid
Plan uw script één keer in en laat het maandelijks, jaarlijks of permanent draaien, zodat u proactieve monitoring hebt zonder er omkijken naar te hebben. Met regelmatige controles signaleert u problemen voordat ze uit de hand lopen. Daarvoor hebt u twee opties:
Optie 1: via Taakplanner (één machine)
Stap voor stap:
- Open de Opdrachtprompt (Admin) en voer deze opdracht uit:
schtasks /create /tn "M365LicenseAudit" /tr `"powershell.exe -ExecutionPolicy Bypass -File C:\Scripts\LicenseAudit.ps1" `/sc weekly /d MON /st 02:00 /ru "NT AUTHORITY\SYSTEM"
- Dit werkt omdat het als systeemaccount draait, ook wanneer er geen gebruiker is aangemeld.
Optie 2: via RMM-tools
Stap voor stap:
- Open uw RMM-tool naar keuze, bijvoorbeeld NinjaOne.
- Maak het script (uit optie 1) aan en sla het op in de scriptbibliotheek van NinjaOne.
- Wijs het script toe aan de beleidsgroep Microsoft 365 Clients.
- Configureer de uitvoer:
- Sla de CSV’s op in \\ClientShare\Audits.
- Upload ze naar het dashboard van de RMM voor een centraal overzicht.
Nadat u het script hebt ingepland, draait het op de toegewezen datum en tijd, slaat het de rapporten automatisch op in de aangewezen mappen en toont het de trends per tenant.
Waar u op moet letten
In dit onderdeel staan de mogelijke uitdagingen waarmee u rekening moet houden bij het volgen van deze handleiding.
| Risico’s | Mogelijke gevolgen | Oplossingen |
| 1. Ontbrekende gegevens in rapporten | Onvolledige audits, niet-gedetecteerde risico’s | Controleer de machtigingen: voer Get-MgContext uit om scopes zoals User.Read.All te verifiëren.Omzeil MFA-blokkades: gebruik certificaatauthenticatie in plaats van secrets. |
| 2. Script mislukt zonder melding | Vals gevoel van veiligheid, hiaten in compliance | Schakel logging in: voeg Start-Transcript -Path C:\Logs\Audit.log toe aan de scripts.Monitor Logboeken: kijk onder Logboeken voor toepassingen en services > PowerShell. |
| 3. Gebruikers worden niet gemarkeerd | Verlopen licenties/inactieve accounts worden gemist | Valideer de drempels: controleer of $cutoffDate aansluit op het beleid. Controleer de licentievelden: gebruik |
| 4. Hardcoded secrets | Compromittering van de tenant, diefstal van referenties | Roteer secrets onmiddellijk in Azure AD. Stap over op Azure Key Vault: gebruik Get-AzKeyVaultSecret om secrets veilig op te halen. |
| 5. Afhankelijkheid van de beta-API | Script werkt niet meer na updates van Microsoft | Vervang beta-endpoints: gebruik Get-MgUser (v1.0) in plaats van Get-MgBetaUser.Abonneer u op de changelog van Microsoft Graph. |
Belangrijke aandachtspunten voor waterdichte Graph API-audits met PowerShell
Stem deze instellingen af op uw omgeving. Precisie voorkomt vals alarm en houdt workflows soepel.
Uitsluitingen in rapporten
Sluit serviceaccounts, gedeelde postvakken en break-glass-accounts uit van inactiviteitsscans. Zo voorkomt u dat licenties van kritieke resources per ongeluk worden teruggewonnen. Met PowerShell-filters zet u ze op een whitelist via dit script:
$excludedUPNs = @("[email protected]", "[email protected]")Get-MgUser | Where-Object { $_.UserPrincipalName -notin $excludedUPNs }
Inactiviteitsdrempels
Stel drempels in op basis van uw risicobereidheid. Is een account 90 dagen inactief, dan geldt dat nu als laag risico, 60 dagen als gemiddeld risico en 30 dagen als hoog risico. Onderneem actie op basis van het risico: stuur waarschuwingsmails, trek licenties in of schakel het account uit en win de licentie terug. Zo blijft u beschermd tegen problemen.
Auditfrequentie
Plan uw audits op het juiste moment om beveiligingsrisico’s en andere problemen te voorkomen. Voor de meeste bedrijven zijn maandelijkse controles aan te raden, in lijn met de factuurcycli.
In sectoren met een hoge omzet zorgen wekelijkse controles ervoor dat de rapporten de veranderingen in de omgeving bijhouden. Start de audit bovendien direct zodra een medewerker het bedrijf verlaat.
Acties koppelen
Stel SOP’s op die de vervolgstappen automatisch in gang zetten. Voer de volgende scripts uit om licenties terug te winnen en accounts uit te schakelen:
- Licenties terugwinnen:
Set-MgUserLicense -UserId "[email protected]" -RemoveLicenses @("skuId")
- Accounts uitschakelen:
Update-MgUser -UserId "[email protected]" -AccountEnabled:$false
Archiveer de gegevens nadat u deze scripts hebt uitgevoerd. Stuur ze via de Graph API door naar de manager of naar SharePoint.
Zo stroomlijnt NinjaOne uw licentieaudits
Verander Graph API-controles van handmatige klussen in volledig geautomatiseerde compliance-engines over al uw tenants heen.
- Centrale scriptuitrol: rol uw Graph API PowerShell-scripts in één handeling uit naar meer dan 100 endpoints of tenants.
- Automatische monitoring van de uitvoer: volg CSV-rapporten en logbestanden bij al uw klanten. Blijft een update van een bestand uit, dan gaan er meteen notificaties af.
- Foutmeldingen in uw eigen tools: ontvang meldingen via Slack, Teams of e-mail wanneer scripts mislukken.
- Eén rapport over alle tenants: voeg gegevens over verlopen Office 365-licenties en inactieve gebruikers samen in één dashboard voor het management.
- Automatische remediatie: maak automatisch tickets aan in uw PSA-tool op basis van vooraf gedefinieerde SOP’s om verlopen licenties te detecteren.
Houd kosten en beveiliging in de hand met Graph API-licentiecontroles
Door licentie- en gebruikersaudits te automatiseren, verandert reactief toezicht in proactieve controle. Door ongebruikte licenties terug te winnen en slapende accounts uit te schakelen, voorkomt u weglekkende kosten en sluit u aanvalsroutes af. Gebruik de bovenstaande procedure om ongebruikte licenties om te zetten in budgetbesparing en verouderde accounts in compliance.
Quick-start guide
NinjaOne helpt u bij het uitvoeren van geplande Graph API-controles op verlopen licenties en inactieve gebruikers. Het NinjaOne-platform biedt tools en richtlijnen voor:
- Verlopen licenties auditen: gebruik de Graph API om licenties op te sporen waarvan de vervaldatum is verstreken
- Inactieve gebruikers controleren: detecteer gebruikers die zich binnen een bepaalde periode niet hebben aangemeld of geen services hebben gebruikt
- Deze controles automatiseren: stel geplande taken in om deze audits regelmatig uit te voeren
Gerelateerde onderwerpen
- 8 beste praktijken voor het beveiligen van API’s
- Notificaties instellen voor inactieve gebruikersaccounts in Linux: een uitgebreide scripthandleiding
- Detectie van inactieve gebruikersaccounts automatiseren met PowerShell
- Ongebruikte lokale accounts op Windows-systemen opsporen en beheren
- Uitgebreide handleiding voor het uitschakelen van gebruikersaccounts in Linux voor IT-professionals
