Перестаньте марнувати гроші: як автоматизувати оптимізацію ліцензій Microsoft 365 за допомогою PowerShell
By Mirko Peters · · Updated
Ласкаво просимо назад у блог! Якщо ви адмініструєте клієнт Microsoft 365, ви, напевно, знаєте те неприємне відчуття, коли наприкінці місяця відкриваєте рахунок. Ви бачите десятки, а може, й сотні активних ліцензій, призначених користувачам, які не входили в систему з минулого фінансового року. Ручна перевірка порталу здається продуктивною, але вона регулярно пропускає застарілі облікові записи, ри
Automatically translated with AI from the original post. Read the English original
Ласкаво просимо назад у блог! Якщо ви адмініструєте клієнт Microsoft 365, ви, напевно, знаєте те неприємне відчуття, коли наприкінці місяця відкриваєте рахунок. Ви бачите десятки, а може, й сотні активних ліцензій, призначених користувачам, які не входили в систему з минулого фінансового року. Ручна перевірка порталу здається продуктивною, але вона регулярно пропускає застарілі облікові записи, ризикований спільний доступ і великі втрати на ліцензіях. Якщо вам набридло вибірково перевіряти центр адміністрування та отримувати неприємні сюрпризи під час щоквартальних аудитів, настав час автоматизувати роботу.
У цьому дописі ми детально розглянемо, як написати PowerShell-скрипт за розкладом, який співставляє журнали входу з активними ліцензіями. Наприкінці цього посібника ви зрозумієте, як позначати невикористовувані SKU, щомісяця повертати зайві витрати та захищати клієнт від надмірного адміністративного навантаження.
Вступ до оптимізації ліцензій Microsoft 365
Оптимізацію ліцензій часто сприймають як головний біль, який повторюється раз на рік. ІТ-менеджери поспіхом вивантажують дані вручну, телефонують керівникам відділів, щоб дізнатися, чи досі працюють підрядники, і здогадуються, чи обліковий запис справді покинуто. Такий реактивний підхід гарантовано призводить до втрати бюджету. Кожен день, коли ліцензія E5 або Business Premium залишається за підрядником, який уже пішов, або за співробітником, що звільнився, ваша організація втрачає гроші.
Щоб це виправити, оптимізацію ліцензій слід розглядати як безперервний автоматизований процес. Використовуючи PowerShell і Microsoft Graph, ми можемо створити скрипти, які виконують важку роботу за нас і надають дієві дані ще до того, як ваша ранкова кава звариться.
Чому ручні перевірки порталу не справляються
Чому б просто не покластися на вбудований центр адміністрування Microsoft 365? Портал створено для зручності, а не для глибокого управління. Коли ви входите у веб-інтерфейс, ви бачите знімки стану на певний момент без історичного контексту. Портал не дає легко співставити дати останнього входу з конкретними SKU ліцензій для тисяч користувачів в одному зрозумілому огляді.
Крім того, ручні перевірки повністю залежать від людської пам’яті. Чи пам’ятали ви перевірити службові облікові записи? Чи перевірили ви, чи справді спільній поштовій скриньці потрібна ліцензія Exchange Online Plan 2? Людська помилка створює сліпі зони, а ці сліпі зони коштують грошей і створюють ризики безпеки.
Вибір відповідних модулів і областей дії PowerShell
Перш ніж написати хоча б один рядок логіки скрипта, потрібно зібрати інструменти. Екосистема PowerShell від Microsoft змінилася, і робота із застарілими модулями лише призводитиме до попереджень про застарілість і непрацездатних скриптів. Ваш основний набір інструментів має включати:
- Microsoft Graph PowerShell: сучасний стандарт для керування користувачами, групами та об’єктами каталогу.
- ExchangeOnlineManagement: необхідний для аудиту поштових скриньок, правил переадресації та ліцензування спільних поштових скриньок.
- PnP.PowerShell: критично важливий для перевірки сайтів SharePoint, гостьових посилань і зовнішнього спільного доступу, що розростається.
Переконайтеся, що під час надання дозволів своїм скриптам ви дотримуєтеся принципу найменших привілеїв. Ніколи не використовуйте облікові дані глобального адміністратора для автоматизованих скриптів.
Визначення щотижневих звітів аудиту лише для читання
Золоте правило ІТ-автоматизації просте: спершу лише читання. Ніколи не починайте шлях автоматизації зі скриптів, які автоматично видаляють користувачів або знімають ліцензії. Ваша перша ітерація має бути повністю зосереджена на збиранні даних.
Налаштуйте щотижневий розклад, який запускає комплексний аудит лише для читання. Цей аудит має оцінювати неактивних користувачів, списки гостьового доступу, призначення ліцензій порівняно з фактичною активністю входу, конфігурації поштових скриньок і осиротілі групи Microsoft 365. Встановивши щотижневий ритм, ви замінюєте хаотичне гасіння пожеж десятихвилинним переглядом чистих, автоматично згенерованих звітів.
Співставлення журналів входу з активними ліцензіями
Головна фішка оптимізації ліцензій — це співставлення. Ліцензія, призначена обліковому запису користувача, нічого не означає, якщо цей користувач не автентифікувався протягом 90 днів. Вашому скрипту потрібно отримати два основних набори даних із Microsoft Entra ID:
- Призначені користувачу SKU ліцензій.
- Дату останнього входу користувача (інтерактивного та неінтерактивного).
Поєднавши ці два джерела даних через об’єкти PowerShell, ви миттєво розрахуєте, де саме марнуються ліцензії. Якщо останній вхід користувача перевищує заданий поріг (наприклад, 60 або 90 днів), скрипт позначає такий обліковий запис як кандидата на повернення ліцензії.
Автоматизація доставки звітів і зберігання артефактів
Звіт, який лежить без руху в локальній папці, не має жодної користі. Результати потрібно передавати безпосередньо тим, хто може вжити заходів. Налаштуйте скрипт так, щоб він створював структуровані CSV-файли та стислі HTML-зведення.
Далі нехай скрипт надсилає зведення на розсилку вашого відділу IT-governance або публікує його в окремому каналі Microsoft Teams через вебхук. Крім того, зберігайте сирі CSV-артефакти в захищеній бібліотеці документів SharePoint для governance, щоб мати історичний слід для цілей відповідності вимогам.
Безпечне планування з Azure Automation і Task Scheduler
Де мають жити ці скрипти? Їх можна запускати з локального комп’ютера або сервера Windows через Task Scheduler, використовуючи захищене сховище облікових даних. Проте для корпоративного рівня правильним підходом є Azure Automation.
Розгорнувши скрипти як runbook у Azure Automation і автентифікуючись через керовану ідентичність (Managed Identity), ви усуваєте ризик жорстко закодованих паролів або прострочених секретів служб. Azure Automation без проблем бере на себе середовище виконання, журналювання та обробку помилок у хмарі.
Впровадження захисних механізмів безпеки та відповідності
Автоматизація без обмежень рано чи пізно призведе до катастрофи. Щоб захистити ваш клієнт, вбудуйте в конвеєр автоматизації такі запобіжники:
- Детальне журналювання: фіксуйте кожен крок виконання скрипта з ідентифікаторами кореляції.
- Блоки Try/Catch: коректно обробляйте обмеження частоти запитів, тайм-аути мережі та помилки дозволів, надсилаючи сповіщення на спільну поштову скриньку, якщо запуск завершився невдало.
- Черги відкладених дій: замість автоматичного зняття ліцензій спершу направляйте дії з високим впливом через чергу «очікування» або робочий процес погодження.
Поетапне впровадження стратегії усунення
Не намагайтеся автоматизувати все в перший день. Впроваджуйте стратегію усунення поетапно:
- Тижні 1–2: лише звіти. Збирайте дані, перевіряйте хибні спрацьовування та коригуйте списки винятків.
- Тижні 3–4: м’які дії. Почніть завершувати терміни дії застарілих посилань для гостей і формувати рекомендації щодо вилучення ліцензій, які потребують ручного погодження.
- Далі постійно: автоматизуйте дії з низьким ризиком, зберігаючи етапи людського погодження для деструктивних змін.
Усунення типових проблем під час автоматизації в PowerShell
Навіть найкращі скрипти іноді спотикаються. Якщо результатів немає, двічі перевірте дозволи Graph і версії модулів, а для ізоляції проблеми протестуйте запит у Graph Explorer. Якщо збої трапляються випадково, ймовірно, ваш скрипт упирається в обмеження частоти запитів. Реалізуйте експоненційну затримку та логіку повторних спроб, щоб запуски були стабільними. Нарешті, остерігайтеся хибних спрацьовувань, підтримуючи надійний список винятків для облікових записів служб і аварійних облікових записів.
Поширені запитання
Чи зламає автоматизація мій клієнт?
Ні, якщо почати в режимі лише читання, додати погодження та суворо обмежити дозволи, які отримують облікові записи автоматизації.
Чи потрібен мені Graph PowerShell уже зараз?
Так, це сучасний шлях уперед. Використовуйте його разом із модулями Exchange Online і PnP, щоб охопити всі ваші адміністративні поверхні.
Як швидко можна побачити ROI?
Перший щотижневий запуск зазвичай виявляє вражаючу кількість невикористаних ліцензій і застарілих гостьових облікових записів, що одразу створює можливості для економії.
А як щодо кількох географій або MSP?
Параметризуйте конфігурації клієнтів, централізуйте інфраструктуру журналювання та позначайте вихідні звіти ідентифікатором клієнта (tenant ID), щоб масштабуватися на кілька середовищ.
Висновки
Автоматизація оптимізації ліцензій Microsoft 365 є одним із найефективніших проєктів, які може виконати адміністратор. Вона припиняє щомісячні втрати на марні витрати на програмне забезпечення, підвищує рівень безпеки через очищення застарілих облікових записів і звільняє від рутинних ручних перевірок у порталі.
Якщо ви хочете почути повний огляд цих концепцій, включно з розбором живих скриптів і глибшими архітектурними порадами, обов’язково послухайте пов’язаний епізод подкасту: Automate Microsoft 365 Tenant Cleanup with PowerShell. Долучайтеся вже сьогодні та підніміть свою автоматизацію на новий рівень!