Partner guidance for Business Voice bulk license updates

This post has been republished via RSS; it originally appeared at: Small and Medium Business Blog articles.

Introduction

 

In November 2021 we announced that Business Voice will retire and be replaced with Microsoft Teams Phone with Calling Plan.

Teams Phone with Calling Plan is a new subscription bundle available through EA, CSP and Web direct for SMB and Enterprise customers.  Teams Phone with Calling Plan is now available in 31 markets.

 

Article Index

Milestones

Fundamentals

Guidance

Acquire new licenses

Update Licenses

Option 1: Single user via Microsoft 365 Admin Center

Option 2: Bulk update via Microsoft 365 Admin Center

Option 3: Bulk update using PowerShell script

Troubleshooting

Full Script

Option 4: Bulk update using Azure group-based licensing

Validate

 

Milestones

 

March 1, 2022

  • Business Voice no longer available for purchase for new customers
  • Customers who purchased Business Voice before this date will continue with their Business Voice subscription until its expiration date.

June 30, 2022

  • Last day to renew existing Business Voice licenses

Starting March 1st, existing Business Voice customers looking to renew their subscription will be directed to the new SKU Teams Phone with Calling Plan. For customers using a third-party calling plan, they will be directed to Teams Phone Standard. This change will not happen automatically and requires an update of the license assignment for end-users.

 

In this blog post, we provide practical guidance on how to update the license setup for users when the existing Business Voice subscription is live and about to expire. 

 

Important: We advise that you fully familiarize yourself with the guidance below before attempting to make any changes to a production environment. We highly recommend testing the approach first before making live changes to a customer’s tenant, to avoid any potential loss of service. 

 

Fundamentals

Microsoft 365 is available in a variety of plans (also referred to as subscriptions or SKU’s) to best meet the needs of your organization. Each Microsoft 365 plan includes one or more individual services, such as Exchange Online and SharePoint Online (also referred to as Service Plans). Business Voice is a subscription (SKU) that bundles up to 3 services (Service Plans): Teams Phone Standard, Audio Conferencing, and an optional Microsoft 365 Calling Plan.  

 

When making updates to a user’s licensing setup in Microsoft 365, a workflow is started to process the license changes and if necessary, enable or disable the appropriate services for the end-user.   

 

Since we want to transition our users from Business Voice plan to a newer license plan without service impact, we must ensure that during this operation we do not change the assigned services (Service Plans) for a user. Therefore, it is important to execute the license changes in a single step. Any license change executed in two steps (or more) may result in deprovisioning of the user including phone number un-assignment.

 

There are multiple options available to update the licensing plan from Business Voice to a newer license plan (per user or in bulk) which will be explained in the following step-by-step process.

 

Guidance

Acquire new licenses

 

Before you can replace your customer’s Business Voice plan, you first need to acquire the appropriate replacement plans which include Teams Phone Standard, Audio-Conferencing and the optional Microsoft 365 Calling Plan. Use the following table to determine which licenses you’d need based on the scenario currently in use:

 

Old License Plan Recommended License Plan Description
Business Voice with Calling Plan Teams Phone with Calling Plan Delivers cloud-based Phone System capabilities with a first-party, Microsoft delivered calling plan service
Business Voice without Calling Plan Teams Phone Standard Delivers cloud-based Phone System capabilities, to be combined with a third-party calling plan using either Direct Routing or Operator Connect
Business Voice (Any Version) Microsoft Teams Audio Conferencing select dial-out Delivers dial-in and dial-out capabilities to meeting attendees organized by a licensed user.

 

To fully replace Business Voice features, you will need to acquire at least two license plans per user as replacement: one for Teams Phone and a second one for Audio Conferencing capabilities.  Before continuing, make sure you have the appropriate licenses available in your Tenant.

 

Update Licenses

 

Option 1: Single user via Microsoft 365 Admin Center

 

To update a single user, you can leverage Microsoft 365 Admin center to easily make the change.

Navigate to admin.microsoft.com and sign-in with Tenant Admin credentials. Navigate to Users, Active Users and select the desired user.  Click on “Manage product licenses

Screenshot of Microsoft 365 Admin Center with a user selected and the "Manage Product Licenses" button highlightedScreenshot of Microsoft 365 Admin Center with a user selected and the "Manage Product Licenses" button highlighted

 

On the “Licenses and apps” screen, deselect the Business Voice license. 

 

Important: Please DO NOT save changes yet. If you save changes without adding the new licenses in the same step, the user account will be deprovisioned and the phone number unassigned

 

After deselecting Business Voice, check the relevant Microsoft Teams Phone and Audio Conferencing licenses.   Now save your changes using “Save changes”.  The user license plans will be updated and should not impact service availability.  

 

Option 2: Bulk update via Microsoft 365 Admin Center

To update multiple users in a bulk operation, you can leverage Microsoft 365 Admin center to make the changes if those users have the same license plan assignment.

 

The steps to perform are identical to updating a single user, with the key difference being that the portal will now request you to specify which bulk operation you want to execute.

 

Screenshot of Microsoft 365 Admin center asking to either Replace, Assign more or Unassign all licenses for the selected users.Screenshot of Microsoft 365 Admin center asking to either Replace, Assign more or Unassign all licenses for the selected users.

 

The Replace option, which removes existing licenses and assigns only the ones you select is the only viable option for our scenario since we need to add and remove licenses in a single step.  

 

IMPORTANT: please note that the "Replace" option will remove all existing licenses for the selected users.  As a result, you’ll have to select the desired licensing state for the user, including any other licenses in use, i.e. Microsoft 365 Business Premium.  Also, if the users that you want to update have different base license configurations, they would be overwritten with your selected licenses which may impact other areas of Microsoft 365. For tenants with users that have a mixed license setup, we recommend using the bulk update option with a PowerShell script (see further below).

 

Option 3: Bulk update using a PowerShell script

 

Replacing the Business Voice license plan via a PowerShell script is an efficient solution for most  scenarios.  By leveraging a script, you will execute the following steps:

  1. Get the tenant-specific license plan identifiers of your current Business Voice licenses
  2. Get the tenant-specific identifiers of your new Teams Phone and Audio-Conferencing license plans
  3. Validate if the new license plans have the same service plans as with the current Business Voice. If not, stop the script to avoid service impact.
  4. Find tenant users who are licensed for Business Voice (or modify the script to include a filter to select a subset of the users)
  5. Loop through the users and update their license configuration with Teams Phone and Audio Conferencing plans

IMPORTANT: the script provided should be considered as a code sample. The script should not be copied as-is and run in a production tenant without testing, validation, and customization for your specific environment. 

 

As a first step, Install and Import the AzureAD module.

 

#Install the AzureAD module when required Install-Module AzureAD #Import the AzureAD module Import-Module AzureAD

 

Then, connect to your Microsoft 365 Tenant and provide Tenant Admin credentials.

 

#Connect to your tenant Connect-AzureAD

 

Use the following commandlet to list all license packages in the Tenant

 

#List Available License packages Get-AzureADSubscribedSku

 

Use the following table to identify the (to be replaced) Business Voice add-on license plan for your tenant

 

SKU Code License Type
BUSINESS_VOICE_MED  Business Voice with Calling Plan - Canada
BUSINESS_VOICE Business Voice with Calling Plan - UK
BUSINESS_VOICE_MED2_TELCO Business Voice with Calling Plan - US
BUSINESS_VOICE_DIRECTROUTING Business Voice without Calling Plan
BUSINESS_VOICE_DIRECTROUTING_MED Business Voice without Calling Plan - US

 

Take a note of the identified Business Voice available in your tenant.

 

Note: the script provided in this document assumes a single Part Number type for your tenant.  If you have multiple Business Voice license plans (i.e. with and without a Calling Plan), you might need to adjust the script or run it twice, one time for each source part number.

 

Now create a PowerShell variable named $skuSourceBV and store the unique Business Voice identifier for your object.  Make sure you replace the SkuPartNumber label (in bold) with the one available in your tenant

 

##Replace the SKU codes below to match your desired scenario $skuSourceBV = Get-AzureADSubscribedSku | where {$_.SkuPartNumber -eq "BUSINESS_VOICE_MED2_TELCO "}

 

Use the following table to identify the new Teams Phone and Audio-Conferencing license plans for your tenant

 

SKU Code License Type
Microsoft_Teams_Audio_Conferencing_select_dial_out Microsoft Teams Audio Conferencing Select Dial-Out

MCOMEETADV

Audio Conferencing
MCOEV Teams Phone Standard (No Calling Plan)
MCOTEAMS_ESSENTIALS Teams Phone with Calling Plan

 

Create PowerShell variables to store the unique Teams Phone and Audio-Conferencing identifiers for your object.  Make sure you replace the SkuPartNumber label (in bold) with the ones available in your tenant

 

$skuTargetTPCP = Get-AzureADSubscribedSku | where {$_.SkuPartNumber -eq "MCOTEAMS_ESSENTIALS"} $skuTargetAC = Get-AzureADSubscribedSku | where {$_.SkuPartNumber -eq "MCOMEETADV"}

 

We’ll then collect the required Service Plan data from the source SKU into unique objects

 

$servicePlan_Phone = $skuSourceBV.ServicePlans | where {$_.ServicePlanName.ToString() -like "*EV*"} $servicePlan_AC = $skuSourceBV.ServicePlans | where {$_.ServicePlanName.ToString() -like "*MEET*"} $servicePlan_CP = $skuSourceBV.ServicePlans | where {$_.ServicePlanName.ToString() -like "*PSTN*"}

 

Then we’re going to validate if the source SKU (Business Voice) and the target SKU’s (Teams Phone and Audio Conferencing) have the same Service Plans included.  If there is a mismatch, we’ll stop the script as we would trigger a license change that could cause service impact.  In this scenario, please validate your licensing and the service plans included before proceeding.

 

##Create variables to validate if all Service Plans in the source SKU will be replaced with the same target service plan $validated_TP = $false $validated_AC = $false $validated_CP = $false ##If source Business Voice has no Calling Plan included, do not check if($skuSourceBV.ServicePlans.Count -eq 2) { $validated_CP = $true } ##Verify if all service plans in source SKU have a matching service plan in target SKU For ($i=0; $i -le $skuSourceBV.ServicePlans.Count ; $i++) { if($validated_TP -eq $false) { if($skuTargetTP.ServicePlans.Contains($servicePlan_Phone)) { $validated_TP = $true } } if($validated_AC -eq $false) { if($skuTargetAC.ServicePlans.Contains($servicePlan_AC)) { $validated_AC = $true } } if($validated_CP -eq $false) { if($skuTargetTP.ServicePlans.Contains($servicePlan_CP)) { $validated_CP = $true } } } ##If there is a missing service plan in the target sku, we might impact service availability for a user and therefore stop processing if($validated_TP -eq $false ) { Write-Host "Stop updating users because target SKU does not have the same Service Plan for Teams Phone." ; exit } if($validated_AC -eq $false ) { Write-Host "Stop updating users because target SKU does not have the same Service Plan for Audio Conferencing." ; exit } if($validated_CP -eq $false ) { Write-Host "Stop updating users because target SKU does not have the same Service Plan for Calling Plan." ; exit }

 

Now that we verified that we’re not impacting our service plans, we’re going to prepare PowerShell Objects that we can use to perform the update operations on user objects. We’ll use an “AssignedLicenses” object for this.

 

$LicenseAddTPCP = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense $LicenseAddTPCP.SkuId = (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $skuTargetTPCP.SkuPartNumber -EQ).SkuID $LicenseAddAC = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense $LicenseAddAC.SkuId = (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $skuTargetAC.SkuPartNumber -EQ).SkuID $LicensesToUpdate = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses $LicensesToUpdate.AddLicenses += ($LicenseAddTPCP) $LicensesToUpdate.AddLicenses += ($LicenseAddAC) $LicensesToUpdate.RemoveLicenses = (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $skuSourceBV.SkuPartNumber -EQ).SkuID

 

To perform the update, we will first get a list of users that has the Business Voice license assigned and store it in a list named $usersLicensedOldSKU.

 

$usersLicensedOldSKU = New-Object System.Collections.Generic.List[Microsoft.Open.AzureAD.Model.User] Get-AzureAdUser | ForEach { $BVlicensed=$False ; For ($i=0; $i -le ($_.AssignedLicenses | Measure).Count ; $i++) { If($_.AssignedLicenses[$i].SkuId -eq $skuSourceBV.SkuId) { $BVlicensed=$true } } ; If( $BVlicensed -eq $true) { $usersLicensedOldSKU.Add($_)} }

 

Now we’ll loop through the list of users and perform an update activity to remove the Business Voice licenses and add the Teams Phone and Audio-Conferencing licenses by using the $LicensesToUpdate object we prepared earlier.  

 

Important: please note that executing this commandlet will make the changes effective for the selected user accounts.

 

$usersLicensedOldSKU | ForEach { Set-AzureADUserLicense -ObjectId $_.ObjectId -AssignedLicenses $LicensesToUpdate; Write-Host "Completed Update of user " $_.UserPrincipalName; }

 

 

Troubleshooting

If you do not have sufficient available Teams Phone and/or Audio Conferencing licenses to replace Business Voice, you’ll get the error “Subscription with SKU guid does not have any available licenses” during user assignment as soon as the pool of licenses is depleted.

 

Screenshot of a PowerShell window showing a script execution error because not enough licenses are available.Screenshot of a PowerShell window showing a script execution error because not enough licenses are available.

 

Full Script

For your convenience, please find the full script ready to copy when you click on "Spoiler".

#Install the AzureAD module when required Install-Module AzureAD #Import the AzureAD module so you can use the commandlets Import-Module AzureAD #Connect to your tenant Connect-AzureAD #When necessary, uncomment and use this commandlet to list all the licenses in the tenant and identify which license packages are required #Get-AzureADSubscribedSku ##Replace the SKU codes below to match your desired scenario $skuSourceBV = Get-AzureADSubscribedSku | where {$_.SkuPartNumber -eq "BUSINESS_VOICE_MED2_TELCO"} $skuTargetTP = Get-AzureADSubscribedSku | where {$_.SkuPartNumber -eq "MCOTEAMS_ESSENTIALS"} $skuTargetAC = Get-AzureADSubscribedSku | where {$_.SkuPartNumber -eq "MCOMEETADV"} ##Replace the SKU codes below to match your desired scenario $servicePlan_Phone = $skuSourceBV.ServicePlans | where {$_.ServicePlanName.ToString() -like "*EV*"} $servicePlan_AC = $skuSourceBV.ServicePlans | where {$_.ServicePlanName.ToString() -like "*MEET*"} $servicePlan_CP = $skuSourceBV.ServicePlans | where {$_.ServicePlanName.ToString() -like "*PSTN*"} ##Create variables to validate if all Service Plans in the source SKU will be replaced with the same target service plan $validated_TP = $false $validated_AC = $false $validated_CP = $false ##If source Business Voice has no Calling Plan included, do not check if($skuSourceBV.ServicePlans.Count -eq 2) { $validated_CP = $true } ##Verify if all service plans in source SKU have a matching service plan in target SKU For ($i=0; $i -le $skuSourceBV.ServicePlans.Count ; $i++) { if($validated_TP -eq $false) { if($skuTargetTP.ServicePlans.Contains($servicePlan_Phone)) { $validated_TP = $true } } if($validated_AC -eq $false) { if($skuTargetAC.ServicePlans.Contains($servicePlan_AC)) { $validated_AC = $true } } if($validated_CP -eq $false) { if($skuTargetTP.ServicePlans.Contains($servicePlan_CP)) { $validated_CP = $true } } } ##If there is a missing service plan in the target sku, we might impact service availability for a user and therefore stop processing if($validated_TP -eq $false ) { Write-Host "Stop updating users because target SKU does not have the same Service Plan for Teams Phone." ; exit } if($validated_AC -eq $false ) { Write-Host "Stop updating users because target SKU does not have the same Service Plan for Audio Conferencing." ; exit } if($validated_CP -eq $false ) { Write-Host "Stop updating users because target SKU does not have the same Service Plan for Calling Plan." ; exit } ##Prepare variables and update $LicenseAddTP = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense $LicenseAddTP.SkuId = (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $skuTargetTP.SkuPartNumber -EQ).SkuID $LicenseAddAC = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicense $LicenseAddAC.SkuId = (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $skuTargetAC.SkuPartNumber -EQ).SkuID $LicensesToUpdate = New-Object -TypeName Microsoft.Open.AzureAD.Model.AssignedLicenses $LicensesToUpdate.AddLicenses += ($LicenseAddTP) $LicensesToUpdate.AddLicenses += ($LicenseAddAC) $LicensesToUpdate.RemoveLicenses = (Get-AzureADSubscribedSku | Where-Object -Property SkuPartNumber -Value $skuSourceBV.SkuPartNumber -EQ).SkuID $usersLicensedOldSKU = New-Object System.Collections.Generic.List[Microsoft.Open.AzureAD.Model.User] Get-AzureAdUser | ForEach { $BVlicensed=$False ; For ($i=0; $i -le ($_.AssignedLicenses | Measure).Count ; $i++) { If($_.AssignedLicenses[$i].SkuId -eq $skuSourceBV.SkuId) { $BVlicensed=$true } } ; If( $BVlicensed -eq $true) { $usersLicensedOldSKU.Add($_)} } $usersLicensedOldSKU | ForEach { Set-AzureADUserLicense -ObjectId $_.ObjectId -AssignedLicenses $LicensesToUpdate; Write-Host "Completed Update of user " $_.UserPrincipalName; }

Option 4: Bulk update using Azure group-based licensing

Azure group-based license management allows you to assign subscriptions and service plans to a group. Azure AD ensures that the licenses are assigned to all members of the group. Any new members who join the group are assigned the appropriate licenses. When they leave the group, those licenses are removed. This licensing management eliminates the need for automating license management via PowerShell to reflect changes in the organization and departmental structure on a per-user basis.  Please note that you’ll have to validate license requirements for group-based licensing.

 

To update your current group-based licensing assignment to make the change from Business Voice plans to Teams Phone with Calling Plan and Audio Conferencing select dial-out, we must make sure that the license updates are processed in a single step.

 

Therefore, our recommendation is that you get a list of existing groups that have Business Voice licenses assigned and replace the license plan assignment with the preferred new license plans.

 

Update group-based licensing

 

Navigate to portal.azure.com and sign-in with Admin credentials.  Then navigate to Azure Active Directory and on the left menu click Licenses.

 

To verify which groups have Business Voice licenses assigned, click on “All Products” and click on the target license plan name. In our example the Business Voice license bundle is “Microsoft 365 Business Voice (US)”.

 

Screenshot of the "Licenses - All Products" page in Azure Portal and the Business Voice license highlightedScreenshot of the "Licenses - All Products" page in Azure Portal and the Business Voice license highlighted

 

Then click on Licensed Groups or Licensed users.  You’ll find the list of licensed groups in the right-hand pane. In our example, the group “License_BV” is the only group which has Business Voice licenses assigned. Click on the group name (for us “License_BV”) to open the group assignment details.

 

Screenshot of Azure Portal showing the list of groups that have a Business Voice license assigned and the group highlightedScreenshot of Azure Portal showing the list of groups that have a Business Voice license assigned and the group highlighted

 

Now click on Assignments to modify the licenses assigned to this group

 

Screenshot of Azure Portal listing licenses applied to an example group and the Assignments button highlightedScreenshot of Azure Portal listing licenses applied to an example group and the Assignments button highlighted

Check the checkboxes in front of the license plans you acquired as replacement for Business Voice. Uncheck the checkbox in front of the Microsoft 365 Business Voice license plan and at the bottom click save.

 

Screenshot of Azure Portal showing the license assignment for a selected groupScreenshot of Azure Portal showing the license assignment for a selected group

Return to the group by clicking on the group name. You’ll now notice a banner mentioning “License changes are pending”.  Click on Reprocess to force the license assignment to update

Screenshot of Azure Portal showing pending license assignment changes for a group with the Reprocess button highlighted.Screenshot of Azure Portal showing pending license assignment changes for a group with the Reprocess button highlighted.

 

 

 

 

Validation

In this step, you’ll validate if the user licenses were properly updated by consulting the Microsoft 365 Admin Center and perform validation steps with test users.

 

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.