Tema “koliko plaćamo za Microsoft 365” uvijek je relevantna, pogotovo kada Microsoft isproba neke nove taktike za izvlačenje dodatnih $$$ od kupaca (kao što je nedavno “Pravi usponi” povezani s MDO-om). Postoji mnogo stvari koje treba uzeti u obzir kada se počnete baviti troškovima licenciranja, kao što su neaktivni korisnici, korisnici s “dupliciranim” licencama ili čak prekomjerno dodijeljenim licencama.
Licence, a posebno planovi usluga, također se koriste za kontrolu pristupa određenoj aplikaciji. Na primjer, ako određenom korisniku želite onemogućiti pristup aplikaciji Rezervacije, možete onemogućiti odgovarajući plan usluge. Exchange Online poštanski sandučići općenito se osiguravaju dodjeljivanjem odgovarajuće licence. Za druge usluge Microsoft možda neće nametnuti zahtjev za licenciranjem ili je to neovisno o pružanju usluga. Bez obzira na to imate li omogućene sve usluge za određeni SKU, i dalje plaćate punu cijenu.
Iako postoje scenariji u kojima želite da određeni plan usluge bude onemogućen, 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, i većina rješenja za izvješćivanje i skripti već pokrivaju takve scenarije, iako to često čine korištenjem izvješća o korištenju i u nekim slučajevima revizijskih zapisa. Nema ništa loše u tome, ali istražimo što 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 Entre koja pokrivaju licenciranje. The Dodijeljene licence svojstvo navodi sve SKU-ove dodijeljene korisniku, zajedno sa svim onemogućenim planovima usluga. The Dodijeljeni planovi blob vam daje popis planova usluga i njihov status, ali Microsoft je odlučio uključiti povijesne podatke u njega, stoga skup vrijednosti plana usluga koje dobijete možda neće predstavljati trenutni skup SKU-ova dodijeljenih korisniku. Evo primjera s 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 gornjem izlazu odgovara planu usluge SharePoint Online Plan 1 (SHAREPOINTSTANDARD). Licenca koja sadrži spomenuti plan trenutno nije dodijeljena mom korisničkom računu, pa ako bismo se oslonili isključivo na vrijednosti koje vraća Dodijeljeni planovi imovine, prijavili bismo netočne podatke. S druge strane, ova povijesna snimka omogućuje nam da steknemo neku ideju o tome koje su usluge prethodno bile omogućene na računu, bez potrebe za dodirivanjem revizijskih zapisa.
The Get-MgUserLicenseDetail cmdlet je bolja alternativa za izvješćivanje o dodjeli licenci jer vraća samo planove usluga koji pripadaju trenutno dodijeljenim SKU-ovima, zajedno s nazivom plana usluga. Nažalost, ima i nekih nedostataka. Ono što je najvažnije, ne možete dohvatiti navedene podatke za sve svoje korisnike putem jednog upita i umjesto toga ih morate postavljati za svakog korisnika pojedinačno. Dakle, iako je ova metoda najbolja za korištenje, ona jednostavno ne odgovara za potrebe ovog scenarija.
Ukratko, za našu svrhu dovoljno je dohvatiti Dodijeljene licence i izvršite provjere na strani klijenta. Također možemo biti malo temeljitiji i uključiti Dodijeljeni planovi blob, uglavnom za pokrivanje planova usluga sa statusom osim Omogućeno. Jedan cmdlet je dovoljan da dobijemo sve te podatke, a mi možemo dodatno optimizirati upit korištenjem filtra za vraćanje samo korisnika s barem jednim dodijeljenim SKU-om. Kao najbolja praksa, također možemo odabrati samo nekretnine koje nas zanimaju iako to u ovom slučaju čini malu razliku. Evo primjera cmdleta:
Get-MgUser -Filter 'assignedLicenses/$count ne 0' -ConsistencyLevel eventual -CountVariable licensedUserCount <span class="pl-k">-</span>PageSize <span class="pl-c1 pl-token">999 </span>-All -Property UserPrincipalName,DisplayName,AssignedLicenses,AssignedPlans | Select-Object -Property UserPrincipalName,DisplayName,AssignedLicenses,AssignedPlans
Filtar koji gore koristimo smatra se napredni upitpa uključujemo -Razina dosljednosti i -Varijabla brojanja parametri. Kako se Graph SDK brine o paginaciji i prigušivanju, ovaj bi jedan cmdlet 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 tom procesu. Na primjer, možda bismo htjeli isključiti sve SKU-ove koji su besplatni za upotrebu, kao što je TEAMS_FREE SKU na primjer (sa SKUid 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 imati dodjele SKU-a Microsoft 365 Apps for Business za koji je plan usluge OFFICE 365 BUSINESS (094e7854-93fc-4d55-b2c0-3ab5369ebdc1) u onemogućenom stanju.
Naravno, definicija “kritičnog” plana usluga vjerojatno će se razlikovati od organizacije do organizacije. Najbolje što ovdje možete učiniti je pregledati popis podržanih SKU-ova i planova usluga i otkrijte koji su vam najrelevantniji. Kao što je spomenuto na početku, trebali biste također razmotriti aspekt kontrole pristupa određenim uslugama i funkcionalnostima. Dok ste već kod toga, priprema popisa “besplatnih” SKU-ova relevantnih za vašu organizaciju također je nešto u čemu vam povezani dokument može pomoći.
Posljednji gradivni blok koji nam treba je funkcija koja uključuje svu logiku koja se koristi za provjere licenci. Nakon što dohvatimo podatke za sve naše korisnike, proslijedit ćemo ih navedenoj funkciji da raščlani pojedinosti o licenciranju i vrati jednostavan $true/$false vrijednost, ovisno o tome je li licenca “potpuno osigurana” ili ne. Zatim možemo ispisati podatke u prikladnom formatu.
Bez daljnjeg odlaganja, nabavite svoju kopiju scenarij iz mog GitHub repoa. Prije nego što je pokrenete, svakako pregledajte skup SKU-ova koje treba isključiti (poznate kao “besplatni” ili oni koji vas ne zanimaju) i planove koje će skripta razmatrati, a sve se nalazi u području “Varijable” na vrhu. Po potrebi izvršite izmjene, a zatim pokrenite skriptu s korisnikom s dovoljnim dopuštenjima za čitanje podataka o licenci korisnika i tvrtke. Ako se to od vas zatraži, trebate pristati na Korisnik.Pročitaj.Sve i LicenseAssignment.Read.All dometi. Ako je potrebno, ažurirajte cmdlet za povezivanje da biste umjesto toga koristili svoju preferiranu metodu, na primjer upravljani identitet za automatizirano izvršavanje.
Nema parametara koje morate dati, 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 mogli znati. Namjerno filtriramo sve planove usluga koji ne odgovaraju trenutno dodijeljenom skupu licenci. Oni će i dalje biti vidljivi u izlazu putem stupca Dodijeljeni planovi, ali se ne koriste u određivanju je li licenca dodijeljena u cijelosti. The -ekv operator se koristi za provjeru statusa određenog plana usluge ($plan.CapabilityStatus -eq “Omogućeno”), jer želimo istaknuti svaki scenarij u kojem navedeni status ne odgovara Omogućeno vrijednost.
Pratimo status svake licence putem $FullLicense varijabla, koja je postavljena na $false prema zadanim postavkama. Dakle, Provjerite punu licencu funkcija će uvijek vratiti samo a $istina vrijednost ako su svi planovi usluga koje provjeravamo u Omogućeno stanje, zbog čega je važno provjeriti jeste li pregledali i dopunili odgovarajuće varijable. U kontekstu skripte, “puna” licenca znači SKU za koji svi navedeno servisni planovi su u Omogućeno država, ne nužno SKU za koji sve servisni planovi su u Omogućeno stanje.
Evo kako izgleda izlaz skripte. CSV datoteka sadržavat će samo korisnike s djelomičnim dodijeljenim licencama, budući da su to oni na koje se želite usredotočiti. Popis odvojen točkom i zarezom koristi se i za Dodijeljene licence i Dodijeljeni planovi podatkovnih stupaca, jer oba mogu imati više vrijednosti. Za potonje bi također mogli željeti brzo vidjeti 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
Generira se i sveobuhvatniji HTML izlaz. U njemu nam tri tablice daju skup korisnika samo s besplatnim licencama, onih s plaćenim licencama koje su “potpuno” dodijeljene i onih s djelomičnim dodjelama licenci. Potonji scenarij je ono na što se želite usredotočiti, stoga izlažemo neke dodatne pojedinosti u toj tablici, zajedno s pravilnim sortiranjem skupa dostupnih planova. Snimak zaslona u nastavku ilustrira HTML izlaz:
Opet, oslanjamo se isključivo na Dodijeljene licence podatke kako bismo utvrdili je li licenca u potpunosti osigurana i uzimamo u obzir samo planove usluga navedene u konfiguraciji skripte. Ispisivanje dodijeljenih planova u HTML izlazu omogućuje nam brzo izvođenje dodatnog filtriranja na strani klijenta, ako je potrebno. I, kao što je gore spomenuto, također nam omogućuje da dobijemo neke povijesne dodjele plana, koje mogu, ali ne moraju biti relevantne za vaš scenarij.
I eto ga, jednostavnu skriptu koja se može koristiti za izvješćivanje o “djelomičnim” dodjelama licenci u vašoj organizaciji, odnosno licencama za koje plaćate punu cijenu, ali su neke “važne” usluge možda onemogućene. Očito je da će se vrijednost koju ovdje treba izdvojiti uvelike razlikovati od stanara do stanara, ali htio bih podijeliti ovu pomalo zanimljivu vježbu vezanu uz posao s javnošću 🙂
Da budemo jasni, ovo nije potpuno izvješće o licenciranju, niti izvješće koje se bavi “neaktivnim” licencama. Ako tražite takve, pokušajte ovaj scenarij od strane Tonyja.
