This script has reached the point where it is just as complex to use at the functionality it was ment to replace.  With that in mind I have moved development over to a new PowerShell Module that will allow significantly simpler and more human readable commands to be run. 

https://www.powershellgallery.com/packages/MSOLLicenseManagement 

 

All future development will occur in the module and this script will no longer be updated.

 

DESCRIPTION: - Updated 01/09/2018

Helps automate common license management tasks by providing a simpler set of switches on existing PowerShell Cmdlets.

** As always please test against a small set of users before using any
of the script's modification actions against large user collections  **

OUTPUTS:

Creates a log file that contains a record of all actions taken by the script.
If used with -report also creates a CSV file in the same path as the log files with name License_Report_<date>.csv
Report contains all assigned license and the status of the associated plans.

KNOWN ISSUES:

UPDATES:

All devlopment on this script has stopped.  All new work is being done in the following PowerShell Module:

https://www.powershellgallery.com/packages/MSOLLicenseManagement 

ADDTIONAL INFORMATION:

To get all plan names within all SKUs you can either run the report option of the script or this PowerShell:

 

PowerShell
Edit|Remove
Get-MsolAccountSku | foreach {write-host ("`n" + $_.accountskuid);$_.servicestatus | Foreach {write-host ($_.serviceplan.servicename)}}
To match a PowerShell plan name with the GUI description you can use the following method.
  1. Create a test user
  2. Assign them just the SKU you want to investigate
  3. Use the below PowerShell line to output their plan states
  4. Modify the Plan in the GUI
  5. Repeat setp 3 and note the difference

 

PowerShell
Edit|Remove
(get-msoluser -SearchString TestUser@Company.com).licenses.servicestatus
 

 

RELATED ARTICLES:

Project Online: How to handle the sku changes?
https://blogs.msdn.microsoft.com/brismith/2017/01/20/project-online-how-to-handle-the-sku-changes/

You may encounter issues if you haven't renewed your Office 365 Government E4 plan to a new plan
https://support.microsoft.com/en-us/help/4016101/you-may-encounter-issues-if-you-haven-t-renewed-your-office-365-govern

The following help information in availible in the ps1 file and is accessible by running "get-help .\Manage-MSOLLicense.ps1"

PowerShell
Edit|Remove
<# 
  
.SYNOPSIS 
Helps to manage Licences in Azure AD (MSOL) 
 
.DESCRIPTION 
Eases common license management tasks by providing a more user friendly interface on existing PowerShell Cmdlets. 
Implements logic to help with making changes to plan assignments without impacting existing plans. 
 
* Add a new SKU. 
* Replace one SKU with another. 
* Provides a picker for chosing a SKU if not specified. 
* Disable plans within a SKU when adding or replacing. 
* Update currently assigned plans 
* When making changes only operates on a specified set of users. 
* Comprehensive report of assigned SKUs and enabled plans 
 
.PARAMETER Add 
Adds a new SKU to the Users 
 
.PARAMETER Remove 
Removes an existing SKU assignment 
 
.PARAMETER Replace 
Replaces one SKU assignment with another 
 
.PARAMETER Report 
Generates a license report csv file that include all plan states 
 
.PARAMETER Update 
Enables or Disables plans within an existing SKU assignement 
Will not impact existing plan states 
 
.PARAMETER ConvertToExplict 
Reads in the current setting of the inherited SKU and adds them to the user as an explicit assignment. 
 
.PARAMETER DisablePlans 
A Comma seperated string of plans that will be disabled if they are enabled 
Use with -add and -update 
 
.PARAMETER EnablePlans 
A Comma seperated string of plans that will be enabled if they are disabled 
Use with -add and -update 
 
.PARAMETER MaintainPlanState 
Will attempt to maintain the sate of existing plans when replacing SKUs 
If a plan is NOT in the new SKU it will be enabled 
 
.PARAMETER CurrentSKU 
String indicating the SKU to be replaced, updated, or removed 
Should be in form company:MY_SKU 
If not provided will prompt to select a value. 
 
.PARAMETER NewSKU 
String indicating the SKU to add, or replace 
Should be in form company:MY_SKU 
If not provided you will be prompted to select a value. 
 
.PARAMETER IAgreeToTheDisclaimer 
Switch to verify that you have read and agreeded to the disclaimer at the top of the script file. 
 
.PARAMETER Location 
If specified with -add will set the users usagelocation to the value provided. 
Will overwrite any existing values. 
 
.PARAMETER LogFile 
Path and file name for log file. 
 
.PARAMETER NonInteractive 
If specified will suppress any output to the screen 
 
.PARAMETER Users 
A collection of user objects to modify. 
The collection can come from get-msoluser or any input that contains UserPrincipalName 
 
.OUTPUTS 
Creates the log file specified in -logfile that contains a record of all actions taken by the script. 
When used with -report it will create a CSV file in the same path as the log file with name License_Report_<date>.csv 
 
.EXAMPLE 
PS C:\temp>.\Manage-MSOLLicense.ps1 -IAgreeToTheDisclaimer -Report -LogFile c:\temp\license.log 
 
Generate a License_Report_<date>.csv file in the same path as the -LogFile. 
Since no users were specified it will include all users in the output. 
 
.EXAMPLE 
PS C:\temp>$Users = Get-MSOLUser | where {$_.Department -like "*Sales"} 
PS C:\temp>.\Manage-MSOLLicense.ps1 -IAgreeToTheDisclaimer -Users $Users -LogFile c:\temp\license.log -Add -NewSku "company:POWER_BI_STANDARD" 
 
Gathers all users in the sales department and puts in the $Users. 
Adds the POWER_BI_STANDARD SKU to those users. 
 
.EXAMPLE 
PS C:\temp>$Users = Get-MSOLUser | where { $_.Licenses.accountskuid -like "*EXCHANGE_STANDARD_ALUMNI"} 
PS C:\temp>.\Manage-MSOLLicense.ps1 -IAgreeToTheDisclaimer -Replace -Users $Users -LogFile c:\temp\license.log -NewSku "company:EXCHANGESTANDARD_STUDENT" -CurrentSKU "company:EXCHANGE_STANDARD_ALUMNI" 
 
Gathers all users with the "*EXCHANGE_STANDARD_ALUMNI" license and puts them in $Users. 
Will replace the EXCHANGE_STANDARD_ALUMNI SKU with the EXCHANGESTANDARD_STUDENT SKU on all users in $Users. 
 
.EXAMPLE 
PS C:\temp>$Users = Get-MsolUser | where { ($_.Title -eq "Staff") -and ($_.Licenses.accountskuid -notlike "*ENTERPRISEPACK")} 
PS C:\temp>.\Manage-MSOLLicense.ps1 -IAgreeToTheDisclaimer -Replace -Users $Users -LogFile c:\temp\license.log -NewSKU company:ENTERPRISEPACK -CurrentSKU company:EXCHANGESTANDARD_STUDENT -DisablePlans "SWAY,FLOW_O365_P2" 
 
Gathers all users that have the title Staff and don't have the ENTERPRISEPACK SKU applied. 
Replaces the EXCHANGESTANDARD_STUDENT SKU with the ENTERPRISEPACK SKU while disabling SWAY, and FLOW_O365_P2 
 
.EXAMPLE 
PS C:\temp>$Users = Get-MsolUser | where {$_.Title -eq "Staff"} 
PS C:\temp>.\Manage-MSOLLicense.ps1 -IAgreeToTheDisclaimer -Users $Users -LogFile c:\temp\license.log -Update -CurrentSKU company:ENTERPRISEPACK -DisablePlans "SWAY,FLOW_O365_P2" 
 
Gathers all users that have the title Staff. 
Disables SWAY and FLOW_O365_P2 if they are not already disabled. 
 
.NOTES 
* Special thanks to Luke Barron for identifying and suggesting a fix for an issue with enabling plans with -add 
* Special thanks to Brian Swagger for pointing out some leftover code in -add and suggesting a fat finger check 
 
#>