scenariusz
przy pracy z licencjami pojawia się wiele problemów. niektóre z nich to:
- odwzorowanie nazw SKU na nazwy potoczne – np. SKU 'Deskless’ to w interfejsie 'MICROSOFT STAFFHUB’. dość często są one trudne do rozszyfrowania lub wręcz mylące.
- jakie plany zawiera dana licencja? przykładowo – klient posiada licencję 'o365 E1′ – czy zawiera ona service plan AAD P1?
jest oczywiście wiele podobnych scenariuszy podczas audytów czy planowania konkretnych funkcjonalności czy np. migracji zarządzania licencjami do GBL. odpowiedzi na te pytania dostarcza [a w każdym razie powinna] strona ze spisem: https://docs.microsoft.com/en-us/azure/active-directory/enterprise-users/licensing-service-plan-reference . co więcej – jest na niej link do CSV z zamieszczoną tabelą… do czego już tylko krok do napisania sobie prostego skryptu pomagającego w zadanych scenariuszach.
UWAGA jak się przekonałem tej stronie nie można w pełni ufać – jest na niej dużo błędów i niespójności, najradykalniejszy przypadek jaki znalazłem to licencja M365 Business Premium, które wedle tabeli zawiera 24 plany, a w rzeczywistości, listując SKU – jest ich ponad 4o. błąd zgłoszony i mam nadzieję, że poprawią.
dla tych, którzy szukają rozwiązania
napisałem krótki skrypt, który zasysa tabelę w postaci CSV i pozwala na odpytania się kilka podstawowych rzeczy:
- rozwiązywanie nazw technicznych SKU na 'displayName’ [i odwrotnie] dla licencji i planów
- listowanie planów w licencji
- listowanie licencji zawierającej dany plan
przykłady
C:\ :))o- .\get-ServicePlanInfo.ps1 -resolveName deskless Microsoft StaffHub C:\ :))o- .\get-ServicePlanInfo.ps1 -resolveName 'MICROSOFT 365 BUSINESS standard' O365_BUSINESS_PREMIUM
dla tych, którzy szukają nauki
na co warto zwrócić uwagę w kodzie, to wykorzystanie ParameterSetName. są 4 różne operacje/bloki, wykonywane zależnie od wybrania jednego z 4 ParameterSetName:
[CmdletBinding(DefaultParameterSetName='default')] param ( #resolve Service Plan or License name [Parameter(ParameterSetName='resolveNames',mandatory=$true,position=0)] [string]$resolveName, #display all licenses containing given SP [Parameter(ParameterSetName='listLicenses',mandatory=$true,position=0)] [string]$showProducts, #show SPs for given license type [Parameter(ParameterSetName='listServicePlans',mandatory=$true,position=0)] [string]$productName )
switch($PSCmdlet.ParameterSetName) {....}
function resolveNames {...} function listLicenses {...} function listServicePlans {...} function default {...}
$run = "$($PSCmdlet.ParameterSetName) -name '$([string]$PSBoundParameters.Values)'" Invoke-Expression $run