Prijavite djelomične dodjele licenci putem Graph SDK-a za PowerShell

05/04/2026

Tema „koliko plaćamo za Microsoft 365“ je uvijek relevantna, posebno kada Microsoft pokuša neke nove taktike da izvuče ekstra $$$ od kupaca (poput nedavnih „Pravih uspona“ povezanih sa MDO). Postoji mnogo stvari koje treba uzeti u obzir kada se bavite troškovima licenciranja, kao što su neaktivni korisnici, korisnici sa „duplikatom“ licenci, ili čak ukupno dodijeljene licence.

Licence, a posebno planovi usluga, također se koriste za kontrolu pristupa određenoj aplikaciji. Na primjer, ako želite onemogućiti pristup aplikaciji Rezervacije za određenog korisnika, možete onemogućiti odgovarajući plan usluge. Exchange Online poštanski sandučići su općenito osigurani dodjeljivanjem odgovarajuće licence. Za druge usluge, Microsoft ne može nametnuti zahtjeve za licenciranje ili može biti nezavisan od pružanja usluga. Bez obzira da li imate omogućene sve usluge za određeni SKU, i dalje plaćate punu cijenu.

Iako postoje scenariji u kojima želite da se deaktivira određeni plan usluge, kako biste minimizirali troškove licenciranja, trebali biste povremeno pregledavati takve dodjele i potencijalno ih zamijeniti prikladnijim (samostalnim) licencama gdje je to moguće. Ovo nije ništa novo, a većina rješenja i skripti za izvještavanje već pokrivaju takve scenarije, iako to često rade koristeći izvještaje o korištenju i u nekim slučajevima evidencije revizije. Nema ništa loše u tome, ali hajde da istražimo šta možemo pokriti koristeći samo Entra bitove, i to na najbrži mogući način.

Sada postoji nekoliko metoda i svojstava na strani Entra koja pokrivaju licenciranje. The Odobrene licence svojstvo navodi sve SKU-ove koji su dodijeljeni korisniku, zajedno sa svim onemogućenim planovima usluga. The Dodijeljeni planovi blob vam daje listu planova usluga i njihov status, ali Microsoft je odlučio uključiti historijske podatke u njega, tako da skup vrijednosti plana usluge koji dobijete možda ne predstavlja trenutni skup SKU-ova dodijeljenih korisniku. Evo primjera sa mojim računom:

Get-MgUser -UserId vasil@michev.info -Property AssignedPlans | select -ExpandProperty AssignedPlans

AssignedDateTime  CapabilityStatus Service                                 ServicePlanId
----------------  ---------------- -------                                 -------------
08/12/21 14:13:03 Deleted          SharePoint                              c7699d2e-19aa-44de-8edf-1736da088ca1
08/12/21 14:13:03 Deleted          SharePoint                              13696edf-5a08-49f6-8134-03083ed8ba30
14/08/19 06:57:22 Enabled          DynamicsNAV                             39b5c996-467e-4e60-bd62-46066f572726
...

Prvi unos u izlazu iznad odgovara SharePoint Online planu 1 (SHAREPOINTSTANDARD). Licenca koja sadrži navedeni plan trenutno nije dodijeljena mom korisničkom računu, pa ako bismo se oslanjali isključivo na vrijednosti koje vraća Dodijeljeni planovi imovine, prijavili bismo netačne informacije. S druge strane, ovaj historijski snimak nam omogućava da dobijemo neku predstavu o tome koje su usluge prethodno bile omogućene na računu, bez potrebe da dodirujemo revizorski trag.

The Get-MgUserLicenseDetail Cmdlet je bolja alternativa za izvještavanje o dodjeli licenci jer vraća samo planove usluga koji pripadaju trenutno dodijeljenim SKU-ovima, zajedno s nazivom plana usluge. Nažalost, postoje i neki nedostaci. Ono što je najvažnije, ne možete dohvatiti navedene podatke za sve svoje korisnike u jednom upitu, već ih morate postaviti za svakog korisnika pojedinačno. Dakle, iako je ova metoda najbolja za korištenje, ona jednostavno ne funkcionira za potrebe ovog scenarija.

Ukratko, za našu svrhu je dohvat dovoljno Odobrene licence i izvršiti provjere na strani klijenta. Možemo biti i malo detaljniji i uključiti Dodijeljeni planovi blob, uglavnom za pokrivanje planova usluga sa statusom osim Omogućeno. Jedan cmdlet je dovoljan da dobijemo sve ove podatke, a upit možemo dodatno optimizirati korištenjem filtera za vraćanje samo korisnika s barem jednim dodijeljenim SKU-om. Kao najbolju praksu, također možemo odabrati samo svojstva koja nas zanimaju, iako to u ovom slučaju ima malu razliku. Evo primjera cmdleta:

Get-MgUser -Filter 'assignedLicenses/$count ne 0' -ConsistencyLevel eventual -CountVariable licensedUserCount -PageSize 999 -All -Property UserPrincipalName,DisplayName,AssignedLicenses,AssignedPlans | Select-Object -Property UserPrincipalName,DisplayName,AssignedLicenses,AssignedPlans

Filter koji koristimo iznad smatra se naprednim upitom i uključujemo ga -Nivo konzistentnosti i -Varijabla brojanja parametri. Kako se Graph SDK brine za paginaciju i prigušivanje, ovaj pojedinačni cmdlet bi trebao biti dovoljan za naše potrebe.

Kako je cilj provjeriti koliko imamo “nedovoljno osiguranih” dodjela licenci, možemo definirati neke kriterije koji će nam pomoći u ovom procesu. Na primjer, možda bismo željeli isključiti sve SKU-ove koji su besplatni za korištenje, kao npr TEAMS_FREE SKU na primjer (sa SKUid-om od 16ddbbfc-09ea-4de2-b1d7-312db6112d70). S druge strane, želimo biti sigurni da su „kritični“ planovi usluga omogućeni u svim relevantnim SKU-ovima. Na primjer, ne želite da imate Microsoft 365 Apps for Business SKU dodjele za koje je OFFICE 365 BUSINESS plan usluge (094e7854-93fc-4d55-b2c0-3ab5369ebdc1) u onemogućenom stanju.

Naravno, definicija “kritičnog” plana usluga će se vjerovatno razlikovati od organizacije do organizacije. Najbolje što možete učiniti ovdje je pregledati listu podržanih SKU-ova i planova usluga i otkriti koji su vam najrelevantniji. Kao što je spomenuto na početku, trebali biste razmotriti i aspekt kontrole pristupa određenim uslugama i funkcionalnostima. Dok ste već kod toga, priprema liste “besplatnih” SKU-ova relevantnih za vašu organizaciju je takođe nešto u čemu vam povezani dokument može pomoći.

Posljednji građevni blok koji nam treba je funkcija koja uključuje svu logiku koja se koristi za provjere licence. Nakon što dohvatimo podatke za sve naše korisnike, proslijedit ćemo ih gornjoj funkciji da analiziramo detalje licenciranja i vratimo jednostavan $true/$false vrijednost, ovisno o tome da li je licenca “potpuno osigurana” ili ne. Zatim možemo odštampati podatke u odgovarajućem formatu.

Bez daljeg odlaganja, uzmite svoju kopiju skripte iz mog GitHub repo-a. Prije nego što ga pokrenete, obavezno pregledajte skup SKU-ova koje želite isključiti (tzv. „besplatne“ ili one za koje niste zainteresirani) i planove koje će skripta uzeti u obzir, a sve se nalaze u području „Varijable“ na vrhu. Unesite promjene prema potrebi, a zatim pokrenite skriptu s korisnikom s dovoljnim dozvolama za čitanje informacija o korisniku i licenci kompanije. Ako se od vas zatraži, trebali biste pristati na to User.Read.All i LicenseAssignment.Read.All rasponi. Ako je potrebno, ažurirajte cmdlet veze kako biste umjesto toga koristili željeni metod, kao što je upravljani identitet za automatsko izvršavanje.

Nema parametara koje morate navesti, tako da je pokretanje skripte jednostavno kao:

.\GraphSDK_Partial_SKU_report.ps1

Ako trebate napraviti bilo kakve promjene u logici “otkrivanja licence” koju koristi skripta, većina toga se može pronaći kao dio Provjerite punu licencu pomoćna funkcija. Već sam pokrio većinu relevantnih detalja, ali evo još nekoliko o kojima biste možda željeli znati. Namjerno filtriramo sve planove usluga koji ne odgovaraju trenutno dodijeljenom skupu licenci. Oni će i dalje biti vidljivi u izlazu preko kolone Dodijeljeni planovi, ali se ne koriste u određivanju da li je licenca u potpunosti dodijeljena. The – ekv operater se koristi za provjeru statusa određenog plana usluge ($plan.CapabilityStatus -eq “Omogućeno”), jer želimo istaknuti svaki scenarij u kojem se navedeni status ne podudara Omogućeno vrijednost.

Pratimo status svake licence putem $FullLicense varijabla, koja je postavljena na $false po defaultu. stoga, Provjerite punu licencu funkcija će uvijek vratiti samo a $truth vrijednost ako su svi planovi usluga koje provjeravamo uključeni Omogućeno uslov, zbog čega je važno provjeriti da li ste pregledali i popunili odgovarajuće varijable. U kontekstu skripte, “puna” licenca znači SKU za koji sve navedeno servisni planovi su uključeni Omogućeno zemlju, ne nužno SKU za koju sve servisni planovi su uključeni Omogućeno stanje.

Evo kako izgleda izlaz skripte. CSV datoteka će sadržavati samo korisnike s djelimično dodijeljenim licencama, jer su to oni na koje želite da se fokusirate. Lista razdvojena tačka-zarezom se takođe koristi za Odobrene licence i Dodijeljeni planovi kolone podataka, jer oba mogu imati više vrijednosti. Za ovo drugo, možda ćete želeti da brzo vidite status, koji će biti postavljen ispred svakog unosa plana usluge, kao što je prikazano u nastavku:

[Enabled]4495894f-534f-41ca-9d3b-0ebf1220a423;[Enabled]4a82b400-a79f-41a4-b4e2-e94f5787b113;[Deleted]57ff2da0-773e-42df-b2af-ffb7a2317929

Također se generiše sveobuhvatniji HTML izlaz. U njemu nam tri tabele daju skup korisnika samo sa besplatnim licencama, onih sa plaćenim licencama koje su „potpuno“ dodijeljene i one sa djelimičnim dodijeljenim licencama. Potonji scenarij je ono na što želite da se fokusirate, pa ćemo u toj tabeli izložiti neke dodatne detalje, zajedno sa pravilnim sortiranjem skupa dostupnih planova. Snimak ekrana ispod ilustruje HTML izlaz:

Djelomični SKU-ovi

Opet, oslanjamo se isključivo na Odobrene licence podatke kako biste utvrdili da li je licenca u potpunosti osigurana i uzmite u obzir samo planove usluga specificirane u konfiguraciji skripte. Ispis dodijeljenih planova u HTML izlazu omogućava nam da brzo izvršimo dodatno filtriranje na strani klijenta, ako je potrebno. I, kao što je gore spomenuto, također nam omogućava da dobijemo neke historijske alokacije plana, koje mogu, ali ne moraju biti relevantne za vaš scenarij.

I evo ga, jednostavnu skriptu koja se može koristiti za izvještavanje o “djelimičnoj” dodjeli licenci u vašoj organizaciji, odnosno licencama za koje plaćate punu cijenu, ali neke “važne” usluge mogu biti onemogućene. Očigledno je da će vrijednost za izvlačenje ovdje uvelike varirati od stanara do stanara, ali želio bih podijeliti ovu pomalo zanimljivu poslovnu vježbu s javnošću 🙂

Da budemo jasni, ovo nije potpuni izvještaj o licenciranju, niti izvještaj koji se bavi “neaktivnim” licencama. Ako ih tražite, isprobajte ovu Tonyjevu skriptu.

www.oblakznanja.com