Przestań marnować pieniądze: jak zautomatyzować optymalizację licencji Microsoft 365 za pomocą PowerShell
By Mirko Peters · · Updated
Witamy ponownie na blogu! Jeśli zarządzasz dzierżawą Microsoft 365, na pewno znasz to nieprzyjemne uczucie, gdy na koniec miesiąca otwierasz fakturę. Widzisz dziesiątki, a może setki aktywnych licencji przypisanych do użytkowników, którzy nie logowali się od poprzedniego roku obrotowego. Ręczne sprawdzanie portalu wydaje się produktywne, ale regularnie pomija nieaktywne konta, ryzykowne udostępnia
Automatically translated with AI from the original post. Read the English original
Witamy ponownie na blogu! Jeśli zarządzasz dzierżawą Microsoft 365, na pewno znasz to nieprzyjemne uczucie, gdy na koniec miesiąca otwierasz fakturę. Widzisz dziesiątki, a może setki aktywnych licencji przypisanych do użytkowników, którzy nie logowali się od poprzedniego roku obrotowego. Ręczne sprawdzanie portalu wydaje się produktywne, ale regularnie pomija nieaktywne konta, ryzykowne udostępnianie i ogromne straty na licencjach. Jeśli masz już dość doraźnego przeglądania centrum administracyjnego i nieprzyjemnych niespodzianek podczas kwartalnych audytów, nadszedł czas, aby włączyć automatyzację do swojego procesu pracy.
W tym wpisie szczegółowo omówimy, jak napisać zaplanowany skrypt PowerShell, który porównuje dzienniki logowania z aktywnymi licencjami. Po lekturze tego przewodnika będziesz wiedzieć, jak oznaczać nieużywane jednostki SKU, co miesiąc odzyskiwać zbędne koszty i chronić dzierżawę przed rozrastającym się obciążeniem administracyjnym.
Wprowadzenie do optymalizacji licencji Microsoft 365
Optymalizacja licencji jest często postrzegana jako bolesny obowiązek raz w roku. Menedżerowie IT w pośpiechu pobierają ręczne eksporty, dopytują kierowników działów, czy kontraktorzy nadal współpracują z firmą, i zgadują, czy konto jest faktycznie porzucone. Takie reaktywne podejście gwarantuje zmarnowany budżet. Każdego dnia, w którym odeszły kontraktor lub pracownik nadal posiada licencję E5 lub Business Premium, organizacja traci pieniądze.
Aby to naprawić, musimy traktować optymalizację licencji jako ciągły, zautomatyzowany proces. Wykorzystując PowerShell i Microsoft Graph, możemy tworzyć skrypty, które wykonają za nas ciężką pracę, dostarczając praktycznych danych, zanim wypijemy poranną kawę.
Dlaczego ręczne sprawdzanie portalu nie wystarcza
Dlaczego nie polegać wyłącznie na natywnym centrum administracyjnym Microsoft 365? Portal został zaprojektowany z myślą o wygodzie, a nie o głębokim zarządzaniu. Logując się do interfejsu webowego, widzisz migawki z konkretnego momentu, bez kontekstu historycznego. Portal nie pozwala łatwo zestawić dat ostatniego logowania z konkretnymi jednostkami SKU licencji u tysięcy użytkowników w jednym, czytelnym widoku.
Co więcej, ręczne sprawdzanie w całości zależy od ludzkiej pamięci. Czy pamiętałeś o sprawdzeniu kont usługowych? Czy zweryfikowałeś, czy to udostępniona skrzynka naprawdę potrzebuje licencji Exchange Online Plan 2? Błędy ludzkie prowadzą do martwych punktów, a te martwe punkty kosztują pieniądze i stwarzają zagrożenia dla bezpieczeństwa.
Wybór odpowiednich modułów i zakresów PowerShell
Zanim napiszesz choćby jedną linijkę logiki skryptu, musisz przygotować zestaw narzędzi. Ekosystem PowerShell firmy Microsoft ewoluował, a poleganie na przestarzałych modułach prowadzi jedynie do ostrzeżeń o wycofaniu i działających niepoprawnie skryptów. Twój podstawowy zestaw narzędzi powinien obejmować:
- Microsoft Graph PowerShell: nowoczesny standard zarządzania użytkownikami, grupami i obiektami katalogu.
- ExchangeOnlineManagement: niezbędny do audytu skrzynek, reguł przekazywania i licencjonowania skrzynek udostępnionych.
- PnP.PowerShell: kluczowy do przeglądu witryn SharePoint, linków dla gości i nadmiernego udostępniania zewnętrznego.
Pamiętaj o zasadzie najmniejszych uprawnień podczas nadawania uprawnień skryptom. Never używaj poświadczeń Administratora globalnego w zautomatyzowanych skryptach.
Definiowanie cotygodniowych raportów audytu tylko do odczytu
Złota zasada automatyzacji w IT jest prosta: najpierw tylko odczyt. Nigdy nie zaczynaj drogi z automatyzacją od skryptów, które automatycznie usuwają użytkowników lub odbierają licencje. Pierwsza iteracja powinna koncentrować się wyłącznie na zbieraniu danych.
Ustaw cotygodniowy harmonogram, który uruchamia kompleksowy audyt tylko do odczytu. Audyt ten powinien oceniać nieaktywnych użytkowników, listy dostępu gości, przypisanie licencji w porównaniu z rzeczywistą aktywnością logowania, konfiguracje skrzynek oraz osierocone grupy Microsoft 365. Dzięki ustalonemu cotygodniowemu rytmowi chaotyczne gaszenie pożarów zastąpisz dziesięciominutowym przeglądem czystych, automatycznie wygenerowanych raportów.
Zestawianie dzienników logowania z aktywnymi licencjami
Sekretem optymalizacji licencji jest zestawianie danych. Licencja przypisana do konta użytkownika nie ma znaczenia, jeśli ten użytkownik nie uwierzytelnił się od 90 dni. Twój skrypt musi pobrać dwa podstawowe zestawy danych z Microsoft Entra ID:
- Przypisane do użytkownika jednostki SKU licencji.
- Datę ostatniego logowania użytkownika (interaktywnego i nieinteraktywnego).
Łącząc te dwa zestawy danych za pomocą obiektów PowerShell, możesz od razu obliczyć marnotrawstwo licencji. Jeśli ostatnie logowanie użytkownika przekracza określony próg (na przykład 60 lub 90 dni), skrypt oznacza takie konto jako kandydata do odzyskania licencji.
Automatyzacja dostarczania raportów i przechowywania artefaktów
Raport, który leży w cichości w lokalnym katalogu, jest bezużyteczny. Musisz przekazać wnioski bezpośrednio osobom, które mogą podjąć działania. Skonfiguruj skrypt tak, aby generował uporządkowane pliki CSV oraz czytelne podsumowania w formacie HTML.
Następnie niech skrypt wyśle podsumowanie e-mailem na listę dystrybucyjną zespołu ds. ładu IT lub opublikuje je bezpośrednio w dedykowanym kanale w usłudze Microsoft Teams za pośrednictwem webhooka. Dodatkowo przechowuj surowe artefakty CSV w bezpiecznej bibliotece dokumentów SharePoint dla ładu, abyś miał historyczny ślad dokumentacji na potrzeby zgodności z przepisami.
Bezpieczne planowanie z Azure Automation i Harmonogramem zadań
Gdzie powinny znajdować się te skrypty? Możesz uruchamiać je z komputera lokalnego lub z serwera Windows Server za pomocą Harmonogramu zadań, korzystając z bezpiecznego magazynu poświadczeń, jednak podejściem klasy korporacyjnej jest Azure Automation.
Wdrażając skrypty jako runbooki Azure Automation i uwierzytelniając się za pomocą tożsamości zarządzanej, eliminujesz ryzyko zakodowanych na stałe haseł oraz wygasających sekretów jednostek usługi. Azure Automation sprawnie obsługuje środowisko wykonawcze, rejestrowanie zdarzeń i obsługę błędów w chmurze.
Wdrażanie zabezpieczeń i zasad zgodności
Automatyzacja bez zabezpieczeń to katastrofa czekająca na moment. Aby chronić swoją dzierżawę, wbuduj w potok automatyzacji następujące zabezpieczenia:
- Szczegółowe rejestrowanie: Rejestruj każdy krok wykonania skryptu wraz z identyfikatorami korelacji.
- Bloki Try/Catch: Obsługuj ograniczanie przepustowości, przekroczenia czasu oczekiwania sieci i błędy uprawnień w sposób kontrolowany, wysyłając alerty na wspólną skrzynkę pocztową, gdy uruchomienie zakończy się niepowodzeniem.
- Kolejki oczekujących działań: Zamiast automatycznie usuwać licencje, kieruj działania o dużym wpływie najpierw do kolejki „oczekujące” lub do procesu zatwierdzania.
Etapowe wdrażanie strategii naprawczej
Nie próbuj automatyzować wszystkiego od pierwszego dnia. Wdrażaj strategię naprawczą w jasno określonych etapach:
- Tydzień 1–2: Tylko raporty. Zbieraj dane, weryfikuj wyniki fałszywie dodatnie i dostosowuj listy wyjątków.
- Tydzień 3–4: Łagodne działania. Zacznij wygaszać nieaktualne linki gości oraz przedstawiaj rekomendacje usunięcia licencji wymagające ręcznego zatwierdzenia.
- W toku: Automatyzuj działania o niskim ryzyku, zachowując ludzkie bramki zatwierdzania dla zmian destrukcyjnych.
Rozwiązywanie typowych problemów w automatyzacji PowerShell
Nawet najlepsze skrypty napotykają przeszkody. Jeśli otrzymujesz puste wyniki, dokładnie sprawdź uprawnienia Graph oraz wersje modułów — przetestuj zapytanie w Graph Explorer, aby wyizolować problem. Jeśli występują losowe awarie, Twój skrypt prawdopodobnie trafia w limity ograniczania przepustowości. Wdróż wykładniczy mechanizm ponawiania prób (exponential backoff), aby zapewnić stabilność uruchomień. Wreszcie uważaj na wyniki fałszywie dodatnie, utrzymując solidną listę wykluczeń dla kont usług i kont awaryjnych („break-glass”).
Często zadawane pytania
Czy automatyzacja zepsuje moją dzierżawę?
Nie, jeśli zaczniesz w trybie tylko do odczytu, dodasz zatwierdzanie i ściśle ograniczysz uprawnienia przyznane kontom automatyzacji.
Czy potrzebuję teraz Graph PowerShell?
Tak, to nowoczesna droga naprzód. Używaj go razem z modułami Exchange Online i PnP, aby objąć wszystkie obszary administracyjne.
Jak szybko można zobaczyć zwrot z inwestycji?
Pierwsze cotygodniowe uruchomienie zwykle ujawnia zaskakująco dużo nieużywanych licencji i nieaktualnych kont gości, dając natychmiastowe możliwości redukcji kosztów.
A co z konfiguracjami wielogeograficznymi i dostawcami usług zarządzanych (MSP)?
Parametryzuj konfiguracje dzierżaw, centralizuj infrastrukturę rejestrowania i oznaczaj raporty wynikowe identyfikatorem dzierżawy, aby skalować rozwiązanie w wielu środowiskach.
Podsumowanie
Automatyzacja optymalizacji licencji Microsoft 365 to jeden z projektów o najwyższej dźwigni, jakie może podjąć administrator. Zatrzymuje miesięczne marnowanie wydatków na oprogramowanie, wzmacnia bezpieczeństwo przez porządkowanie nieaktualnych kont i uwalnia od żmudnych ręcznych sprawdzeń w portalu.
Jeśli chcesz obejrzeć kompletne omówienie tych koncepcji, w tym szczegółowe analizy skryptów na żywo i głębsze wskazówki architektoniczne, koniecznie zapoznaj się z powiązanym odcinkiem podcastu: Automate Microsoft 365 Tenant Cleanup with PowerShell. Posłuchaj już dziś i podnieś swoje umiejętności automatyzacji na wyższy poziom!