{"id":438,"date":"2026-10-23T15:57:03","date_gmt":"2026-10-23T15:57:03","guid":{"rendered":"https:\/\/hostcare.nl\/?p=438"},"modified":"2026-10-23T15:57:03","modified_gmt":"2026-10-23T15:57:03","slug":"search-unifiedauditlog-stopt-2027-auditlogquery-api","status":"publish","type":"post","link":"https:\/\/hostcare.nl\/?p=438","title":{"rendered":"Search-UnifiedAuditLog stopt in 2027: migreer auditautomatisering naar Microsoft Graph"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Microsoft maakt de Microsoft Graph AuditLogQuery-API algemeen beschikbaar voor programmatische bevraging van het Microsoft Purview-auditlog. Tegelijk kondigt Microsoft aan dat de Exchange Online PowerShell-cmdlet <code>Search-UnifiedAuditLog<\/code> op 15 oktober 2027 stopt. Organisaties die de cmdlet in scripts, rapportages, forensische onderzoeken of eigen integraties gebruiken, moeten die automatisering dus tijdig ombouwen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dit is geen aanwijzing dat auditing zelf nu wordt uitgezet. De aangekondigde wijziging gaat specifiek over programmatische opvraging met <code>Search-UnifiedAuditLog<\/code>. Het risico zit in de koppelingen die ongemerkt van die cmdlet afhankelijk zijn: een dagelijks exportscript, een compliance-rapport, een SOC-runbook of een interne applicatie kan na de einddatum geen auditresultaten meer ophalen als er niets verandert.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wat verandert er precies?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">De nieuwe route loopt via de Microsoft Graph-resource <code>\/security\/auditLog\/queries<\/code>. Een toepassing maakt eerst een <code>auditLogQuery<\/code> met de gewenste periode en filters. De query heeft daarna een status, zoals <code>running<\/code>, <code>succeeded<\/code> of <code>failed<\/code>. Pas wanneer de query klaar is, leest de toepassing de bijbehorende records uit via <code>\/security\/auditLog\/queries\/{id}\/records<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dat patroon is wezenlijk anders dan een PowerShell-script dat een cmdlet uitvoert en de resultaten direct door de pijplijn verwerkt. Bouw de vervanger daarom als een taak met een wachtrij: query indienen, de status gecontroleerd uitlezen, pas daarna records pagineren en een checkpoint vastleggen. Zo kan een proces veilig hervatten als een run wordt onderbroken.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Voor wie heeft dit impact?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">De wijziging is relevant voor organisaties die <code>Search-UnifiedAuditLog<\/code> zelf aanroepen, ook indirect. Denk aan PowerShell-scripts in Azure Automation of een geplande taak, maatwerk voor incidentonderzoek, periodieke exports naar een datawarehouse en interne compliance-rapportages. Kijk niet alleen in de centrale scriptrepository: de cmdlet komt vaak ook voor in beheeraccounts, runbooks, ticketbijlagen en leveranciersscripts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Een organisatie die de cmdlet niet gebruikt, hoeft voor deze uitfasering geen migratie uit te voeren. Wel is dit een goed moment om vast te leggen welke auditgegevens geautomatiseerd worden opgehaald, welke bewaartermijn daarvoor geldt en wie eigenaar is van de koppeling. Zonder die inventaris blijft een stuk operationele of bewijsvoering-gerelateerde automatisering gemakkelijk buiten beeld.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rechten en beschikbaarheid zorgvuldig beoordelen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">De AuditLogQuery-API gebruikt Microsoft Graph-machtigingen. Microsoft documenteert zowel productgerichte machtigingen, bijvoorbeeld voor Exchange, SharePoint, OneDrive of Entra, als de bredere machtiging <code>AuditLogsQuery.Read.All<\/code>. Kies het kleinst mogelijke bereik dat het beoogde scenario dekt, leg de reden van de beheertoestemming vast en laat een app-registratie en die toestemming via het normale wijzigingsproces beoordelen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Controleer ook de cloud waar de toepassing draait. In de actuele Graph-documentatie staat de API als beschikbaar voor de wereldwijde Microsoft 365-cloud; US Government L4, US Government L5 (DoD) en Microsoft 365 beheerd door 21Vianet staan daar niet als ondersteund. Neem die beperking mee in een ontwerp voor een internationale of multitenantomgeving en ga niet uit van \u00e9\u00e9n identieke implementatie voor alle clouds.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Capaciteit en foutafhandeling zijn onderdeel van de migratie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">De limieten gelden op tenantniveau, dus voor alle toepassingen samen. Microsoft noemt als basisallocatie ten minste 200 ingediende query\u2019s per voortschrijdend venster van 24 uur en ten minste 50 query\u2019s die tegelijk in de wachtrij staan of draaien. Voor \u00e9\u00e9n query geldt een basislimiet van ten minste 1.000.000 records. Hogere capaciteit is mogelijk, maar Microsoft publiceert niet hoe die toekenning precies wordt berekend.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Een query die de recordlimiet bereikt, kan de status <code>succeeded<\/code> krijgen. Controleer daarom expliciet <code>isRecordCountLimitExceeded<\/code>; een vergelijking tussen een benaderd recordaantal en de limiet is volgens Microsoft niet betrouwbaar. Splits grote onderzoeken desnoods op in kleinere tijdvakken of specifiekere filters. Bij HTTP-status <code>429 Too Many Requests<\/code> moet de toepassing de opgegeven <code>Retry-After<\/code>-waarde volgen, of anders een exponentieel oplopende wachttijd (<em>back-off<\/em>) toepassen. Meteen opnieuw proberen vergroot juist de kans op herhaalde throttling.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Praktische migratieaanpak<\/h3>\n\n\n\n<ol class=\"wp-block-list\"><li><strong>Inventariseer het gebruik.<\/strong> Zoek naar <code>Search-UnifiedAuditLog<\/code>, maar ook naar wrapperfuncties en modules die de cmdlet aanroepen. Leg per script vast welke gegevens worden opgehaald, hoe vaak dit gebeurt, wie eigenaar is en welke vervolgprocessen ervan afhangen.<\/li><li><strong>Classificeer de query\u2019s.<\/strong> Breng periode, Microsoft 365-onderdeel, bewerking, gebruiker, object en verwacht volume in kaart. Kies daarna de kleinst noodzakelijke Graph-machtiging en laat die via de bestaande beveiligings- en toestemmingsprocedure goedkeuren.<\/li><li><strong>Bouw een asynchroon verwerkingsproces.<\/strong> Laat dit proces een query aanmaken, de status met een beheerst interval controleren en de records pas verwerken wanneer de definitieve status succesvol is. Sla de query-id, de uitgevoerde filters en een technisch log op, zodat een onderzoek reproduceerbaar blijft.<\/li><li><strong>Ontwerp voor limieten.<\/strong> Centraliseer indien mogelijk het indienen van query\u2019s per tenant, bewaak het aantal actieve taken en implementeer <code>Retry-After<\/code> en een exponentieel oplopende wachttijd. Controleer bij iedere afgeronde query of de recordlimiet is overschreden.<\/li><li><strong>Vergelijk uitkomsten parallel.<\/strong> Laat een representatief onderzoek tijdelijk zowel met de bestaande cmdlet als met Graph lopen. Vergelijk niet alleen aantallen, maar ook velden, tijdzone, filtergedrag en de verwerking door het doelsysteem.<\/li><li><strong>Plan de omschakeling ruim voor 15 oktober 2027.<\/strong> Zet de oude route pas uit na een acceptatietest, documenteer de terugvalprocedure voor de overgangsperiode en werk runbooks, dashboards en leveranciersafspraken bij.<\/li><\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Een veilig technisch basispatroon<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Onderstaand patroon laat de volgorde zien, niet een volledig productiescript. Vul uitsluitend filters in die voor het onderzoek nodig zijn en behandel de toegangstoken- en foutafhandeling buiten de voorbeeldcode.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>POST \/v1.0\/security\/auditLog\/queries\n  - filterStartDateTime en filterEndDateTime\n  - eventueel operation-, user- of recordtypefilters\n\nGET  \/v1.0\/security\/auditLog\/queries\/{query-id}\n  - herhaal met back-off zolang de status niet terminal is\n  - controleer na afloop isRecordCountLimitExceeded\n\nGET  \/v1.0\/security\/auditLog\/queries\/{query-id}\/records\n  - verwerk alle pagina's en leg een checkpoint vast<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Gebruik geen blinde \u00e9\u00e9n-op-\u00e9\u00e9nvertaling van PowerShell-parameters. De Graph-API heeft een eigen gegevensmodel en een eigen autorisatiemodel. Test daarom per use case, zeker wanneer een script een breed tijdsvenster of een groot aantal auditrecords verwerkt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tijdlijn en aandachtspunt voor beheerders<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">De AuditLogQuery-API is volgens Microsoft Message Center MC1505599 in oktober 2026 algemeen beschikbaar. De bestaande cmdlet blijft volgens dezelfde aankondiging werken tot en met 14 oktober 2027. Vanaf 15 oktober 2027 levert <code>Search-UnifiedAuditLog<\/code> geen toegang meer tot het auditlog. Wacht niet tot de laatste maanden: de meeste tijd gaat doorgaans zitten in eigenaarschap, toestemming, testdata en aanpassing van afhankelijke processen, niet in de eerste API-aanroep.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Offici\u00eble documentatie<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/admin.microsoft.com\/AdminPortal\/home#\/MessageCenter\/:\/messages\/MC1505599\" target=\"_blank\" rel=\"noopener\">Microsoft 365 Message Center: Microsoft Purview Audit: AuditLogQuery API algemeen beschikbaar en Search-UnifiedAuditLog wordt uitgefaseerd (MC1505599)<\/a> <em>(aanmelden vereist)<\/em><\/li><li><a href=\"https:\/\/learn.microsoft.com\/en-us\/graph\/api\/security-auditcoreroot-post-auditlogqueries?view=graph-rest-1.0\" target=\"_blank\" rel=\"noopener\">Microsoft Learn: een auditLogQuery maken met Microsoft Graph<\/a><\/li><li><a href=\"https:\/\/learn.microsoft.com\/en-us\/graph\/api\/security-auditlogquery-list-records?view=graph-rest-1.0\" target=\"_blank\" rel=\"noopener\">Microsoft Learn: auditLogRecords uitlezen<\/a><\/li><li><a href=\"https:\/\/learn.microsoft.com\/en-us\/graph\/throttling-limits#security-audit-log-query-service-limits\" target=\"_blank\" rel=\"noopener\">Microsoft Learn: limieten voor Security audit log query<\/a><\/li><\/ul>\n\n","protected":false},"excerpt":{"rendered":"<p>Microsoft stopt Search-UnifiedAuditLog op 15 oktober 2027. Zo inventariseert en migreert u auditautomatisering naar de AuditLogQuery-API, met aandacht voor rechten, limieten en foutafhandeling.<\/p>\n","protected":false},"author":1,"featured_media":436,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[74,69,119,63],"class_list":["post-438","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-microsoft-365","tag-beheer","tag-beveiliging","tag-microsoft-graph","tag-microsoft-purview"],"_links":{"self":[{"href":"https:\/\/hostcare.nl\/index.php?rest_route=\/wp\/v2\/posts\/438","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hostcare.nl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hostcare.nl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hostcare.nl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hostcare.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=438"}],"version-history":[{"count":2,"href":"https:\/\/hostcare.nl\/index.php?rest_route=\/wp\/v2\/posts\/438\/revisions"}],"predecessor-version":[{"id":518,"href":"https:\/\/hostcare.nl\/index.php?rest_route=\/wp\/v2\/posts\/438\/revisions\/518"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hostcare.nl\/index.php?rest_route=\/wp\/v2\/media\/436"}],"wp:attachment":[{"href":"https:\/\/hostcare.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=438"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hostcare.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=438"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hostcare.nl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=438"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}