Some PowerShell magic with Office 365 licenses

PowerShell is a great tool when we have to manage a lot of resources, because it enables automation. Most of you may be already aware that we can use PowerShell also with Office 365. So let’s see some PowerShell magic with Office 365 licenses.

These days one of my colleague had to deal with a very interesting scenario. A customer moved to Exchange Online and therefore assigned only Exchange Online licenses to the users that were synchronized from the local Active Directory. After the whole migration process was ended, the customer decided to also use the powerful features of SharepointOnline. So he wanted an automated option to assign to some users also the SharePoint Online licenses, without removing the Exchange Online license first. (Removing an Exchange Online license would disconnect the mailbox and put it into a soft deleted state. Assigning the license back would re-connect the mailbox, but in some cases this process causes some big problems). 

So my colleagues proceeded as per the official documentation: they created an array where they put all the service plans that they didn’t want (like Lync, RMS and so on), they created a variable as License Option and finally they ran the PowerShell cmdlet documented for license assignment:

Set-MsolUserLicense -UserPrincipalName $_.UserPrincipalName -AddLicenses subscription:ENTERPRISEPACK -LicenseOption $AddSPO

Unfortunately, this resulted in a bed error message:


This error is a little bit misleading. The real reason why this cmdlet fails, resides in the fact that the user already has an AccountSKUID assigned. So the problem here is with the -AddLicense parameter.

Now I feel like a magician and would like to perform a PowerShell trick. And the best way to begin a magical trick is by asking a question: do I really need the -AddLicense parameter? (Drumbeat….) The answer is NO.

So in my test environment I ran:

Set-MsolUserLicense -UserPrincipalName -LicenseOptions $LicensePlan4

Please notice: without -AddLicense

I didn’t receive any error. But did this really work? Was the Sharepoint Online license added? Let’s check this out!

(Get-Msoluser -UserPrincipalName[0].ServiceStatus


So, yes, this worked perfectly.

However, for those who would like to have a step by step instruction on how to add specific license plan to a user that already has a license assigned, here are the steps.

1. Check original state

PS C:\Users\danpatr> (Get-Msoluser -UserPrincipalName[0].ServiceStatus


2. Create an array containing the plans that you want to keep disabled (in my case all other plans except Exchange and Sharepoint)

$SPOandEXO = @()
$SPOandEXO += “INTUNE_O365”

3. Create a License plan and specify the array of plans that you want disabled

$LicensePlan3 = New-MsolLicenseOptions -AccountSkuId danpatr10:ENTERPRISEPACK -DisabledPlans $SPOandEXO

4. Assign the license plans without the -AddLicense parameter

Set-MsolUserLicense -UserPrincipalName -LicenseOptions $LicensePlan3

5. Check the result

(Get-Msoluser -UserPrincipalName[0].ServiceStatus

Everything should be fine. Please wait few minutes between step 4 and 5 since provisioning the service could take few seconds.

This is the core scenario. Of course you can add to this also a lot of programming logic and create a script which may extract users from a CSV and perform this action in any way you want based on an if-else logic.

Hope this helps you since I didn’t find any official Microsoft documentation saying that we can run Set-MsolUserLicense also without the -AddLicense parameter.

How useful was this post?

Click on a star to rate it!

Average rating / 5. Vote count:

Dan Patrascu-Baba

Dan Patrascu-Baba

Developer, consultant, trainer at Codewrinkles
,Net Developer.Focusing on both the .Net world and Microsoft Azure. Experienced speaker and trainer.
Dan Patrascu-Baba
Spread the word!

3 thoughts on “Some PowerShell magic with Office 365 licenses

  1. Hey would it be possible to bulk something like this?

    Import-Csv “C:\licensing\license_users.CSV” | ForEach {Set-MsolUserLicense -UserPrincipalName $_.UPN -LicenseOptions $LicensePlan3}”
    I tried the following however it errored out

  2. Thank you for your comment. Just few days back I was working with a partner and created a brief script to read a CSV file and assign to certain users some licenses. And it worked perfectly.

    Can you please share the error message?
    At a first sight, I don’t know what the variable $LicensePlan3 contains, but if the users in the csv are fresh users, you may also need to assign the SKU with -AddLicense contoso:ENTERPRISEPACK.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.