The Azure AD Graph and MSOnline PowerShell licensing API is scheduled for retirement on the 26th of August, 2022:
Migrating to the new Graph API is exciting news – great new technology with new features!
Or at least that’s what you’d expect until you start working with the new API…
The sheer complexity of moving from the basic ADAL authentication to the MSAL-based PowerShell graph API will shake up many admins.
Sure, if you’re working full-time with Office 365 management and have the opportunity to take your PowerShell skills for a daily walk – no problem.
Unfortunately, Microsoft seems unable to grasp the daily life of thousands and thousands of admins working with Office 365.
Many admins need to cover many technologies like networks, databases, and end-user support. Unfortunately, they don’t have the time to sit down and learn a new PowerShell API every six months.
Especially not a flawed API that represents some setbacks compared to previous solutions.
Here’s an example.
Extracting a List of Service Plans per Licensing Plan
Let’s look at extracting a list of Service Plans enabled in a particular user-assigned License Plan.
First, we use the MSOnline PowerShell API.
We grab a user, have a look at the assigned License Plans, and then list the Service Plans in the first License Plan:
PS C:\> $User = Get-MsolUser -UserPrincipalName hans.c.orsted@azure.skrubbeltrang.com
PS C:\> $User.Licenses
ExtensionData : System.Runtime.Serialization.ExtensionDataObject
AccountSku : Microsoft.Online.Administration.AccountSkuIdentifier
AccountSkuId : skrubbeltrang:ENTERPRISEPREMIUM
GroupsAssigningLicense : {064dcb19-52f9-4779-bdfd-ce7c12f856f6}
ServiceStatus : {Microsoft.Online.Administration.ServiceStatus, Microsoft.Online.Administration.ServiceStatus, Microsoft.Online.Administration.ServiceStatus, Microsoft.Online.Administration.ServiceStatus...}
PS C:\> $User.Licenses[0].ServiceStatus
ServicePlan ProvisioningStatus
----------- ------------------
VIVA_LEARNING_SEEDED Success
Nucleus Success
ContentExplorer_Standard Success
MIP_S_Exchange Success
MICROSOFT_COMMUNICATION_COMPLIANCE Success
GRAPH_CONNECTORS_SEARCH_INDEX Success
Content_Explorer Success
POWER_VIRTUAL_AGENTS_O365_P3 Success
CDS_O365_P3 Success
PROJECT_O365_P3 Success
EXCEL_PREMIUM Disabled
MTP Success
DYN365_CDS_O365_P3 Success
MICROSOFTBOOKINGS Disabled
RECORDS_MANAGEMENT Success
INFO_GOVERNANCE Disabled
DATA_INVESTIGATIONS Disabled
CUSTOMER_KEY Disabled
COMMUNICATIONS_DLP Success
COMMUNICATIONS_COMPLIANCE Success
M365_ADVANCED_AUDITING Success
INFORMATION_BARRIERS Success
KAIZALA_STANDALONE Disabled
MICROSOFT_SEARCH Success
PREMIUM_ENCRYPTION Success
WHITEBOARD_PLAN3 Success
MIP_S_CLP2 Success
MIP_S_CLP1 Success
MYANALYTICS_P2 Success
PAM_ENTERPRISE Success
BPOS_S_TODO_3 Success
FORMS_PLAN_E5 Disabled
STREAM_O365_E5 Success
THREAT_INTELLIGENCE Success
Deskless Success
FLOW_O365_P3 Success
POWERAPPS_O365_P3 Success
TEAMS1 Success
ADALLOM_S_O365 Success
EQUIVIO_ANALYTICS Success
LOCKBOX_ENTERPRISE Success
EXCHANGE_ANALYTICS Success
SWAY Success
ATP_ENTERPRISE Success
MCOEV Success
MCOMEETADV Success
BI_AZURE_P2 Success
INTUNE_O365 PendingActivation
PROJECTWORKMANAGEMENT Success
RMS_S_ENTERPRISE Success
YAMMER_ENTERPRISE Success
OFFICESUBSCRIPTION Success
MCOSTANDARD Success
EXCHANGE_S_ENTERPRISE Success
SHAREPOINTENTERPRISE Success
SHAREPOINTWAC Success Consider how easy and logical this is.
License Plans are available as a list.
Service Plans are available as a sub-list on each of the License Plans they are part of. This makes complete sense.
Now let’s have a look at the new and nifty Microsoft Graph API:
PS C:\> $User = Get-MgUser -UserId hans.c.orsted@azure.skrubbeltrang.com -Property AssignedLicenses,AssignedPlans
PS C:\> $User.AssignedLicenses
DisabledPlans SkuId
------------- -----
{531ee2f8-b1cb-453b-9c21-d2180d014ca5, 199a5c09-e0ca-4e37-8f7c-b05d533e1ea2, e26c2fcc-ab91-4a61-b35c-03cdc8dddf66, 46129a58-a698-46f0-aa5b-17f6586297d9...} c7df2760-2c81-4ef7-b578-5b5392b571df
PS C:\> $User.AssignedPlans
AssignedDateTime CapabilityStatus Service ServicePlanId
---------------- ---------------- ------- -------------
6/18/2022 3:42:49 PM Enabled exchange 33c4f319-9bdd-48d6-9c4d-410b750a4a5a
6/18/2022 3:42:49 PM Enabled Adallom 8c098270-9dd4-4350-9b30-ba4703f3b36b
6/18/2022 3:42:49 PM Enabled exchange 2f442157-a11c-46b9-ae5b-6e39ff4e5849
6/18/2022 3:42:49 PM Enabled CRM 28b0fa46-c39a-4188-89e2-58e979a6b014
6/18/2022 3:42:49 PM Enabled MicrosoftStream 6c6042f5-6f01-4d67-b8c1-eb99d36eed3e
6/18/2022 3:42:49 PM Enabled exchange b1188c4c-1b36-4018-b48b-ee07604f6feb
6/18/2022 3:42:49 PM Enabled YammerEnterprise 7547a3fe-08ee-4ccb-b430-5077c5041653
6/18/2022 3:42:49 PM Enabled exchange 617b097b-4b93-4ede-83de-5f075bb5fb2f
6/18/2022 3:42:49 PM Enabled CRM afa73018-811e-46e9-988f-f75d2b1b8430
6/18/2022 3:42:49 PM Enabled exchange 41fcdd7d-4733-4863-9cf4-c65b83ce2df4
6/18/2022 3:42:49 PM Enabled Deskless 8c7d2df8-86f0-4902-b2ed-a0458298f3b3
6/18/2022 3:42:49 PM Enabled ProcessSimple 07699545-9485-468e-95b6-2fca3738be01
6/18/2022 3:42:49 PM Enabled MicrosoftCommunicationsOnline 3e26ee1f-8a5f-4d52-aee2-b81ce45c8f40
6/18/2022 3:42:49 PM Enabled SharePoint 5dbe027f-2339-4123-9542-606e4d348a72
6/18/2022 3:42:49 PM Enabled MicrosoftCommunicationsOnline 0feaeb32-d00e-4d66-bd5a-43b5b83db82c
6/18/2022 3:42:49 PM Enabled MIPExchangeSolutions cd31b152-6326-4d1b-ae1b-997b625182e6
6/18/2022 3:42:49 PM Enabled exchange 65cc641f-cccd-4643-97e0-a17e3045e541
6/18/2022 3:42:49 PM Enabled To-Do 3fb82609-8c27-4f7b-bd51-30634711ee67
6/18/2022 3:42:49 PM Enabled exchange c4801e8a-cb58-4c35-aca6-f2dcc106f287
6/18/2022 3:42:49 PM Enabled exchange 9f431833-0334-42de-a7dc-70aa40db46db
6/18/2022 3:42:49 PM Enabled MicrosoftOffice 43de0ff5-c92c-492b-9116-175376d08c38
6/18/2022 3:42:49 PM Enabled exchange efb87545-963c-4e0d-99df-69c6916d9eb0
6/18/2022 3:42:49 PM Enabled exchange 34c0d7a0-a70f-4668-9238-47f9fc208882
6/18/2022 3:42:49 PM Enabled ccibotsprod ded3d325-1bdc-453e-8432-5bac26d7a014
6/18/2022 3:42:49 PM Enabled exchange 6dc145d6-95dd-4191-b9c3-185575ee6f6b
6/18/2022 3:42:49 PM Enabled exchange efb0351d-3b08-4503-993d-383af8de41e3
6/18/2022 3:42:49 PM Enabled PowerAppsService 9c0dab89-a30c-4117-86e7-97bda240acd2
6/18/2022 3:42:49 PM Enabled SharePoint e95bec33-7c88-4a70-8e19-b10bd9d0c014
6/18/2022 3:42:49 PM Enabled M365CommunicationCompliance a413a9ff-720c-4822-98ef-2f37c2a21f4c
6/18/2022 3:42:49 PM Enabled exchange 5136a095-5cf0-4aff-bec3-e84448b38ea5
6/18/2022 3:42:49 PM Enabled ProjectWorkManagement b737dad2-2f6c-4c65-90e3-ca563267e8b9
6/18/2022 3:42:49 PM Enabled Sway a23b959c-7ce8-4e57-9140-b90eb88a9e97
6/18/2022 3:42:49 PM Enabled WhiteboardServices 4a51bca5-1eff-43f5-878c-177680f191af
6/18/2022 3:42:49 PM Enabled exchange 8e0c0a52-6a6c-4d40-8370-dd62790dcd70
6/18/2022 3:42:49 PM Enabled TeamspaceAPI 57ff2da0-773e-42df-b2af-ffb7a2317929
6/18/2022 3:42:49 PM Enabled PowerBI 70d33638-9c74-4d01-bfd3-562de28bd4ba
6/18/2022 3:42:49 PM Enabled MicrosoftCommunicationsOnline 4828c8ec-dc2e-4779-b502-87ac9ce28ab7
6/18/2022 3:42:49 PM Enabled MicrosoftThreatProtection bf28f719-7844-4079-9c78-c1307898e192
6/18/2022 3:42:49 PM Enabled exchange a6520331-d7d4-4276-95f5-15c0933bc757
6/18/2022 3:42:49 PM Enabled ProjectProgramsAndPortfolios b21a6b06-1988-436e-a07b-51ec6d9f52ad
6/18/2022 3:42:49 PM Enabled RMSOnline bea4c11e-220a-4e6d-8eb8-8ea15d019f90
6/18/2022 3:42:49 PM Enabled LearningAppServiceInTeams b76fb638-6ba6-402a-b9f9-83d28acb3d86
6/18/2022 3:42:49 PM Enabled exchange 4de31727-a228-4ec3-a5bf-8e45b5ca48cc
6/18/2022 3:41:30 PM Deleted exchange 46129a58-a698-46f0-aa5b-17f6586297d9
6/18/2022 3:41:30 PM Deleted OfficeForms e212cbc7-0961-4c40-9825-01117710dcb1
6/18/2022 3:41:30 PM Deleted MicrosoftOffice 531ee2f8-b1cb-453b-9c21-d2180d014ca5
6/18/2022 3:41:30 PM Deleted exchange 6db1f1db-2b46-403f-be40-e39395f08dbb
6/18/2022 3:41:30 PM Deleted exchange e26c2fcc-ab91-4a61-b35c-03cdc8dddf66
6/18/2022 3:41:30 PM Deleted MicrosoftKaizala 0898bdbb-73b0-471a-81e5-20f1fe4dd66e
6/18/2022 3:41:30 PM Deleted exchange 199a5c09-e0ca-4e37-8f7c-b05d533e1ea2
11/24/2021 10:16:46 AM Deleted To-Do 5e62787c-c316-451f-b873-1d05acd4d12c
11/22/2021 9:39:06 AM Deleted MicrosoftCommunicationsOnline 505e180f-f7e0-4b65-91d4-00d670bbd18c
11/22/2021 9:39:06 AM Deleted exchange 176a09a6-7ec5-4039-ac02-b2791c6ba793
11/21/2021 7:49:21 PM Deleted SharePoint 13696edf-5a08-49f6-8134-03083ed8ba30
11/21/2021 7:49:21 PM Deleted OfficeForms 159f4cd6-e380-449f-a816-af1a9ef76344
11/21/2021 7:48:29 PM Deleted WhiteboardServices 94a54592-cd8b-425e-87c6-97868b000b91
11/9/2021 5:33:08 PM Deleted exchange 9aaf7827-d63c-4b61-89c3-182f06f82e5c On the positive side, we now see information on the assigned date, which may be helpful for historical tracking.
But good luck with understanding which License Plan was used to assign the various Service Plans.
The Service Plan information is bulked together with no indication of the License Plan through which it was assigned.
Compared to the way the MSOnline API is designed, this seems like a step back.
If you have any logic in your existing scripts that need to know Service Plan to License Plan relationships per user, you’ll need a second command, the Get-MgUserLicenseDetail:
PS C:\WINDOWS\system32> Get-MgUserLicenseDetail -UserId hans.c.orsted@azure.skrubbeltrang.com | fl
Id : YTlJwaYrrkG0YuPn5NrmMNA7J8L33xVCnvUse8-wZCU
ServicePlans : {MICROSOFT_SEARCH, WHITEBOARD_PLAN2, FORMS_PLAN_E1, EXCHANGE_S_FOUNDATION...}
SkuId : c2273bd0-dff7-4215-9ef5-2c7bcfb06425
SkuPartNumber : OFFICESUBSCRIPTION
AdditionalProperties : {}
Id : YTlJwaYrrkG0YuPn5NrmMGAn38eBLPdOtXhbU5K1cd8
ServicePlans : {VIVA_LEARNING_SEEDED, Nucleus, ContentExplorer_Standard, MIP_S_Exchange...}
SkuId : c7df2760-2c81-4ef7-b578-5b5392b571df
SkuPartNumber : ENTERPRISEPREMIUM
AdditionalProperties : {}
PS C:\WINDOWS\system32> (Get-MgUserLicenseDetail -UserId hans.c.orsted@azure.skrubbeltrang.com)[1].ServicePlans
AppliesTo ProvisioningStatus ServicePlanId ServicePlanName
--------- ------------------ ------------- ---------------
User Success b76fb638-6ba6-402a-b9f9-83d28acb3d86 VIVA_LEARNING_SEEDED
Company Success db4d623d-b514-490b-b7ef-8885eee514de Nucleus
Company Success 2b815d45-56e4-4e3a-b65c-66cb9175b560 ContentExplorer_Standard
User Success cd31b152-6326-4d1b-ae1b-997b625182e6 MIP_S_Exchange
User Success a413a9ff-720c-4822-98ef-2f37c2a21f4c MICROSOFT_COMMUNICATION_COMPLIANCE
User Success a6520331-d7d4-4276-95f5-15c0933bc757 GRAPH_CONNECTORS_SEARCH_INDEX
Company Success d9fa6af4-e046-4c89-9226-729a0786685d Content_Explorer
User Success ded3d325-1bdc-453e-8432-5bac26d7a014 POWER_VIRTUAL_AGENTS_O365_P3
User Success afa73018-811e-46e9-988f-f75d2b1b8430 CDS_O365_P3
User Success b21a6b06-1988-436e-a07b-51ec6d9f52ad PROJECT_O365_P3
User Disabled 531ee2f8-b1cb-453b-9c21-d2180d014ca5 EXCEL_PREMIUM
User Success bf28f719-7844-4079-9c78-c1307898e192 MTP
User Success 28b0fa46-c39a-4188-89e2-58e979a6b014 DYN365_CDS_O365_P3
User Disabled 199a5c09-e0ca-4e37-8f7c-b05d533e1ea2 MICROSOFTBOOKINGS
User Success 65cc641f-cccd-4643-97e0-a17e3045e541 RECORDS_MANAGEMENT
User Disabled e26c2fcc-ab91-4a61-b35c-03cdc8dddf66 INFO_GOVERNANCE
User Disabled 46129a58-a698-46f0-aa5b-17f6586297d9 DATA_INVESTIGATIONS
User Disabled 6db1f1db-2b46-403f-be40-e39395f08dbb CUSTOMER_KEY
User Success 6dc145d6-95dd-4191-b9c3-185575ee6f6b COMMUNICATIONS_DLP
User Success 41fcdd7d-4733-4863-9cf4-c65b83ce2df4 COMMUNICATIONS_COMPLIANCE
User Success 2f442157-a11c-46b9-ae5b-6e39ff4e5849 M365_ADVANCED_AUDITING
User Success c4801e8a-cb58-4c35-aca6-f2dcc106f287 INFORMATION_BARRIERS
User Disabled 0898bdbb-73b0-471a-81e5-20f1fe4dd66e KAIZALA_STANDALONE
Company Success 94065c59-bc8e-4e8b-89e5-5138d471eaff MICROSOFT_SEARCH
User Success 617b097b-4b93-4ede-83de-5f075bb5fb2f PREMIUM_ENCRYPTION
User Success 4a51bca5-1eff-43f5-878c-177680f191af WHITEBOARD_PLAN3
User Success efb0351d-3b08-4503-993d-383af8de41e3 MIP_S_CLP2
User Success 5136a095-5cf0-4aff-bec3-e84448b38ea5 MIP_S_CLP1
User Success 33c4f319-9bdd-48d6-9c4d-410b750a4a5a MYANALYTICS_P2
User Success b1188c4c-1b36-4018-b48b-ee07604f6feb PAM_ENTERPRISE
User Success 3fb82609-8c27-4f7b-bd51-30634711ee67 BPOS_S_TODO_3
User Disabled e212cbc7-0961-4c40-9825-01117710dcb1 FORMS_PLAN_E5
User Success 6c6042f5-6f01-4d67-b8c1-eb99d36eed3e STREAM_O365_E5
User Success 8e0c0a52-6a6c-4d40-8370-dd62790dcd70 THREAT_INTELLIGENCE
User Success 8c7d2df8-86f0-4902-b2ed-a0458298f3b3 Deskless
User Success 07699545-9485-468e-95b6-2fca3738be01 FLOW_O365_P3
User Success 9c0dab89-a30c-4117-86e7-97bda240acd2 POWERAPPS_O365_P3
User Success 57ff2da0-773e-42df-b2af-ffb7a2317929 TEAMS1
User Success 8c098270-9dd4-4350-9b30-ba4703f3b36b ADALLOM_S_O365
User Success 4de31727-a228-4ec3-a5bf-8e45b5ca48cc EQUIVIO_ANALYTICS
User Success 9f431833-0334-42de-a7dc-70aa40db46db LOCKBOX_ENTERPRISE
User Success 34c0d7a0-a70f-4668-9238-47f9fc208882 EXCHANGE_ANALYTICS
User Success a23b959c-7ce8-4e57-9140-b90eb88a9e97 SWAY
Company Success f20fedf3-f3c3-43c3-8267-2bfdd51c0939 ATP_ENTERPRISE
User Success 4828c8ec-dc2e-4779-b502-87ac9ce28ab7 MCOEV
User Success 3e26ee1f-8a5f-4d52-aee2-b81ce45c8f40 MCOMEETADV
User Success 70d33638-9c74-4d01-bfd3-562de28bd4ba BI_AZURE_P2
Company PendingActivation 882e1d05-acd1-4ccb-8708-6ee03664b117 INTUNE_O365
User Success b737dad2-2f6c-4c65-90e3-ca563267e8b9 PROJECTWORKMANAGEMENT
User Success bea4c11e-220a-4e6d-8eb8-8ea15d019f90 RMS_S_ENTERPRISE
User Success 7547a3fe-08ee-4ccb-b430-5077c5041653 YAMMER_ENTERPRISE
User Success 43de0ff5-c92c-492b-9116-175376d08c38 OFFICESUBSCRIPTION
User Success 0feaeb32-d00e-4d66-bd5a-43b5b83db82c MCOSTANDARD
User Success efb87545-963c-4e0d-99df-69c6916d9eb0 EXCHANGE_S_ENTERPRISE
User Success 5dbe027f-2339-4123-9542-606e4d348a72 SHAREPOINTENTERPRISE
User Success e95bec33-7c88-4a70-8e19-b10bd9d0c014 SHAREPOINTWAC It’s not a big deal, but it will require some tweaking to get existing MSOnline scripts converted to reflect this new data structure.
Frustration is Growing
At this moment, there are just over two months left before the MSOnline PowerShell licensing API will die.
The frustration is reaching a boiling point concerning the many scripting changes coming up (as seen on the MS Tech Community):
As mentioned before, it's quite frustrating that the automation interfaces for Azure and Microsoft 365 are in a constant state of flux
announcing the deprecation of the MSOL and Azure modules in December 2022 when there are still known limitations and key functionality still in beta, and you haven't even written the guidance and tools for migrating existing scripts to the product intended to replace them, is just disrespectful to your customer's patience and time
Sometimes I'm not sure if Microsoft's idea is to drive regular administrators into madness
You’ll see similar types of feedback for the announced change in Exchange Online mailbox name attribute.
This is another fundamental change with short notice that has triggered some very negative feedback from the admin community:
There are going to be lots of random admin scripts that break because of this. Even if we update everything, there are years of online examples and documentation that will be out of date.
Please get a Principal Engineer review on this from someone outside the team implementing this approach. And take into consideration the long term confusion this will create for customers.
This doesn't make any sense. I've had 3 or 4 sync conflicts in 8+ years, all easily fixed. This 'solution' will cost me at least a week of reviews.
Easy365Manager With MS Graph Support
If you’re using Easy365Manager you are already saving a lot of time on daily Office 365 administration.
You’ll also be happy to hear that Easy365Manager will support the new Graph API in the next major update.
Among the many benefits, Easy365Manager lets you manage Office 365 licenses with ease: