Spring til indhold

Graph lukker for licensdata: tjek jeres licensrapporter nu

Af Michal Lampe Sørensen · 7 min læsning · 15. september 2026

Verificeret mod Microsoft Learn, september 2026

Indhold

TL;DR

Microsoft lukker et hul i Graph-permissionen User.ReadBasic.All. Den har hidtil kunnet læse brugeres licensdetaljer og app-rolletildelinger, selvom ingen af delene hører til en basisprofil. Udrulningen startede midt i september 2026 og er færdig sidst på måneden. Tenant-totalerne (hvor mange licenser I betaler for, og hvor mange der er i brug) rammes ikke. Det, der rammes, er per-bruger-opslaget: hvem har hvilken licens. Bruger jeres rapporteringsværktøj den permission, holder det op med at levere de data, typisk uden at sige fra.

Hvad Microsoft lukker, og hvornår

Graph-permissionen User.ReadBasic.All har givet adgang til mere, end navnet lover. Ud over navn, e-mailadresse og profilbillede har den også kunnet læse to ting, der ikke hører til i en basisprofil: brugeres licensdetaljer og deres app-rolletildelinger.

Det lukker Microsoft nu. Udrulningen begyndte midt i september 2026 og ventes færdig sidst på måneden. Ændringen gælder både delegated og app-only adgang.

En app, der kun har User.ReadBasic.All, kan efter udrulningen ikke længere læse:

  • Licensdetaljer per bruger — GET /users/{id}/licenseDetails, i PowerShell Get-MgUserLicenseDetail
  • App-rolletildelinger — GET /users/{id}/appRoleAssignments, i PowerShell Get-MgUserAppRoleAssignment

Bruger en app kun permissionen til det, den er beregnet til, altså navne, e-mailadresser og billeder i en personsøgning eller et intranet, skal der ikke laves noget om.

Microsoft skriver, at berørte apps kan opleve "failures or permission-related errors". Om jeres værktøj viser en fejl eller bare en tom kolonne, afhænger helt af, hvordan det er skrevet. Regn ikke med at få besked.

De to spørgsmål om licenser: kun det ene rammes

Der er to vidt forskellige spørgsmål, man stiller Graph om licenser, og de bruger hver sit endpoint. Forskellen afgør, om det her rører jer.

"Hvor mange licenser betaler vi for, og hvor mange er taget i brug?" kommer fra /subscribedSkus. Det er tenant-totalerne: prepaidUnits.enabled mod consumedUnits, altså købt mod tildelt. Endpointet kræver som minimum LicenseAssignment.Read.All og virker både delegated og app-only. Det rører ændringen ikke.

"Hvem har hvilken licens?" kommer fra /users/{id}/licenseDetails. Det er her, User.ReadBasic.All har fungeret, og det er her, det stopper. Værd at bemærke: det endpoint understøtter slet ikke app-only adgang. Kun delegated, altså i en brugers navn.

I praksis betyder det, at den grove optælling er i sikkerhed, mens det detaljerede opslag er det, der kan gå i stå. Og det er ærgerligt, for det er sjældent totalerne, der sparer penge. "Vi har 47 E3-licenser og 45 er tildelt" fører ikke til nogen handling. "Disse otte brugere har E3 og har ikke rørt Teams eller SharePoint i tre måneder" gør. Det er den sidste type rapport, der bygger på per-bruger-opslaget.

SpørgsmålEndpointRammes af ændringen
Hvor mange licenser har vi købt og tildelt?/subscribedSkusNej
Hvilke licenser har denne bruger?/users/{id}/licenseDetailsJa
Hvilke apps er denne bruger tildelt?/users/{id}/appRoleAssignmentsJa

Sådan finder I ud af, om det rammer jer

De fleste mindre virksomheder kalder ikke selv Graph. Men noget i jeres tenant gør det næsten helt sikkert, og det er sjældent noget, I selv har bygget.

De typiske kandidater er et licensoptimeringsværktøj fra en tredjepart, en rapporteringsportal hos jeres it-leverandør, et HR- eller onboardingsystem, der slår op i Entra, eller et PowerShell-script, som nogen skrev for to år siden og satte til at køre hver måned.

I kan selv kigge efter. I Entra-administrationscenteret under Identity → Applications → Enterprise applications kan I åbne en app og se dens Permissions. Er User.ReadBasic.All blandt de godkendte, og trækker appen licensdata, er den kandidat til at knække.

Efter udrulningen er der ét sted mere at se: log-ind for service principals. Fejler et kald på grund af manglende rettigheder, efterlader det spor der, også når værktøjets egen brugerflade tier stille.

Scriptet er det, der bliver overset. En app i Enterprise applications kan I se i en liste. Et PowerShell-script på en server hos jeres leverandør kan ingen se, og det er præcis den slags, der er skrevet med den bredeste permission, der lige virkede den dag.

Sådan retter I det

Microsoft peger på tre veje, afhængigt af, hvad appen faktisk skal bruge:

Hvad appen skal læsePermission at skifte til
Licensdetaljer per brugerLicenseAssignment.Read.All
App-rolletildelingerUser.Read.All
Begge deleUser.Read.All

Skiftet kræver, at en administrator giver samtykke på ny, og at appen bliver rullet ud og testet igen. Det er ikke stort arbejde, men det er heller ikke noget, der sker af sig selv.

En ting er værd at holde fast i undervejs. Fristelsen, når et kald pludselig fejler, er at give Directory.Read.All og komme videre. Den permission giver læseadgang til hele jeres directory. Skal appen kun læse licenser, er LicenseAssignment.Read.All det rigtige valg, og det er samtidig den, Microsoft selv angiver som mindst privilegeret på begge licens-endpoints.

Det er i øvrigt hele pointen med ændringen. User.ReadBasic.All blev givet til apps, fordi den lød harmløs, og så fulgte der licens- og rolledata med, som ingen havde taget stilling til. Microsoft lukker hullet, fordi permissionen gav mere, end den lovede.

Skal jeres værktøj læse licenser per bruger, uden at nogen er logget ind, er licenseDetails en blindgyde: endpointet understøtter kun delegated adgang. Microsofts nyere Cloud Licensing API kan det med User-UsageRight.Read.All, som virker både delegated og app-only. Den er til gengæld stadig i beta, så byg ikke produktionsrapportering på den endnu.

Tre spørgsmål til jeres it-leverandør

Har I ikke selv nogen, der arbejder med Graph, er det her, I kan gribe ind. Send tre spørgsmål videre:

1

Hvilke permissions har de apps, I bruger i vores tenant?

Vi leder efter User.ReadBasic.All blandt de godkendte permissions under Enterprise applications.

2

Læser vores licensrapport per bruger, eller kun totaler?

Per-bruger-detaljer rammes. Tenant-totaler fra /subscribedSkus gør ikke.

3

Hvad sker der i rapporten, hvis kaldet fejler?

Kommer der en fejlmeddelelse, eller står der bare nul?

Det tredje er det vigtigste. En rapport, der viser en fejl, bliver rettet i næste uge. En rapport, der viser nul tildelte licenser, uden at sige hvorfor, bliver taget for gode varer, og så træffer nogen en beslutning om opsigelse eller nedgradering på et tomt datasæt.

Svaret "vi bruger kun totalerne" er gyldigt og gode nyheder. Svaret "det tjekker vi lige" er også fint. Svaret "det plejer at virke" er det, I skal følge op på inden udgangen af september.

Og en ting mere: det her koster ikke noget og kræver ingen bestemt plan. Graph-permissions følger ikke licensniveauet. Uanset om I kører Business Basic eller E5, er ændringen den samme, og løsningen er den samme.

Kilder: Microsoft Graph permissions reference (Microsoft Learn), List licenseDetails (Microsoft Learn), List subscribedSkus (Microsoft Learn), Cloud licensing API i Microsoft Graph, beta (Microsoft Learn) og meddelelse MC1470871 i Message Center, refereret af mwpro.co.uk og ourcloudnetwork.com.

Regn på licenserne uden et rapporteringsværktøj

Sammenlign planer og se, hvad I betaler for mod hvad I bruger. Ingen adgang til jeres tenant, ingen permissions.

Åbn optimeringsværktøjet

Ofte stillede spørgsmål

Hvornår træder ændringen i kraft?+

Udrulningen begyndte midt i september 2026 og ventes færdig sidst på måneden. Der er ikke en enkelt skæringsdato for alle tenants, så ændringen kan ramme jer på et hvilket som helst tidspunkt i det vindue. Derfor giver det mening at tjekke nu frem for at vente på, at noget holder op med at virke.

Holder vores licensrapportering op med at virke?+

Kun hvis den læser licensoplysninger per bruger med permissionen User.ReadBasic.All. Rapporter, der bygger på tenant-totaler fra /subscribedSkus, altså hvor mange licenser I har købt og tildelt, er ikke berørt. Spørg jeres leverandør hvilken af delene jeres rapport bruger. Bemærk, at et værktøj sagtens kan blive ved med at køre og bare vise tomme felter i stedet for en fejl.

Hvilken permission skal vi bruge i stedet?+

LicenseAssignment.Read.All til licensdetaljer og User.Read.All til app-rolletildelinger. Skal appen bruge begge dele, peger Microsoft på User.Read.All. Vælg den mindst privilegerede, der løser opgaven, og undgå at gribe til Directory.Read.All bare for at få kaldet til at virke igen. Skiftet kræver nyt administratorsamtykke.

Kræver det en bestemt Microsoft 365-plan at rette?+

Nej. Graph-permissions hænger ikke sammen med hvilken plan I har. Ændringen og løsningen er den samme, uanset om I kører Business Basic, Business Premium eller E5, og der er ingen ekstra omkostning forbundet med at skifte permission. Det kræver til gengæld en administrator, der kan give samtykke på vegne af organisationen.

Skal du have et par øjne på jeres licenser?

Jeg arbejder til dagligt med Microsoft 365 og hjælper danske virksomheder med at vælge den rigtige licens og undgå at betale for meget. Skriv til mig, så vender jeg tilbage.

Skriv til mig