top of page
  • Writer's picturesamanthaeasterday

How To Move Users In Bulk From OnPremises Skype To TeamsOnly With Powershell

I've read many blogs on how to move users to TeamsOnly. But I wasn't able to find what I needed. So onto making my own script. I love opportunities like this! A little challenging, a lot of testing and some googling (Bing actually ;).


SfB 2015 onprem

Enterprise voice enabled

Teams deployed

Islands mode

Exchange onprem (till next year)

I started with installing the Teams module. You will need this access to complete the steps. You'll also need Skype for Business PowerShell commands, so I started a new PSSession to our Skype server. I put in my admin credentials directly on the script. Not recommended...well in any scenario. However, I made an exception here since it's on a secure server.

In all the blogs I read, I rarely found anyone mention disabling UM in Exchange. Probably because we are the unicorn with Exchange OnPrem and moving to Teams. But that will soon change. So I imported a PSSession for Exchange as well.

Then set your parameters and variables. Pretty basic here.

The next couple of commands are for communication and pauses. I read the pauses help M365 to move along. Can't hurt!

I put my Import-Csv here. Then I disabled the UM first with a simple Get-UMMailbox and piping to Disable-UMMailbox.

The next line is forcing PowerShell to use tls1.2. In our environment, we have an issue with tls1.0 being blocked, so forcing it to use tls1.2 was easy enough.

Then I went into Move-CSUser. There is a lot of documentation on this command.

One thing to note, I did include -BypassAudioConferencingCheck and -BypassEnterpriseVoiceCheck. These are recommended if all your users don't have AC and/or EV.

Then we move onto validation and alerting. These commands create .txt files to give you failures and successes.

You'll want to close the session, once you're done. Best practice.

Then finally send yourself an email letting you know the batch is complete.

Happy Scripting!

Copy and paste starting here:

Measure-Command {


#To Connect to Teams. Make sure you have the new Teams Module installed.

Install-Module -Name PowerShellGet -Force -AllowClobber

Install-Module -Name MicrosoftTeams -Force -AllowClobber


#To Connect to Skype for Business. Make sure you connect to a New-PSSession


$pwd = "adminpwd";

$securepwd = ConvertTo-SecureString $pwd -AsPlainText -Force;

$cred = New-Object Management.Automation.PSCredential ($admin.Replace('sip:', ''), $securepwd);

$UserCredential = $cred

$Session = New-PSSession -Credential $UserCredential -ConnectionUri -AllowRedirection

Import-PSSession -AllowClobber $Session

#To Connect to OnPremises Exchange to disable UM. Make sure you connect New-PSSession


$pwd = "adminpwd";

$securepwd = ConvertTo-SecureString $pwd -AsPlainText -Force;

$cred = New-Object Management.Automation.PSCredential ($admin.Replace('sip:', ''), $securepwd);

$UserCredential = $cred

$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri -Authentication Kerberos -Credential $UserCredential

Import-PSSession -AllowClobber $Session -DisableNameChecking


#Initialize parameters and variables.

$sip = $users.SipAddress

$user = $sipaddress

$users = $sipaddress

$count = $users.count

write-host "We have found" $count "Users to Migrate" -foregroundcolor Yellow -backgroundcolor Black

$pauseSeconds = 10

$Sleep = 20

Write-Host "Pausing for " $pauseSeconds " seconds to verify your count..." -ForegroundColor Yellow

Start-Sleep -s $pauseSeconds

#To Enable Logging and store them for failed migration and any errors.

$transcriptname = “MoveCSUserStatus” + `

(Get-Date -format s).Replace(“:”,”-“) +”.txt”

Start-Transcript $transcriptname

#Initiate Move-CsUser Operation.

$Users = Import-Csv -Path C:\sipaddress.csv

foreach ($user in $users) {

Get-UMMailbox -Identity $user.sipaddress | Disable-UMMailbox -Confirm:$false


[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

$Users = Import-Csv -Path C:\sipaddress.csv

foreach ($user in $users) {

Move-CsUser -Identity $user.sipaddress -Target -UseOAuth -BypassAudioConferencingCheck -BypassEnterpriseVoiceCheck -Confirm:$false


#Pause for 10 seconds

Start-Sleep -s $sleep

#Validate the Move and complete Successfully Moved and Failed Users.

$loop = foreach ($user in $users) {

Get-CsOnlineUser -Identity $user.sipaddress | Select-object sipaddress,hostingprovider,TeamsUpgradeEffectiveMode,RegistrarPool}

$loop| Out-File TeamsOnlyMigrationStatus.txt -append


Write-Host "Migration Script Completed Please Refer Transcript File for any Errors" -ForegroundColor Green

#Close the sessions.

get-pssession | remove-pssession

#Send Email report to Notify the Migration have completed - Mention your SMTP server

Send-MailMessage -From "" -To ""-subject "TeamsOnlyMigrationTaskCompleted: No File" -body "Teams Only Migration Batch have been completed" -SmtpServer

501 views1 comment

1 Comment

Graham Llewellyn
Graham Llewellyn
Mar 09, 2022

What's the format of your CSV file? Just the users SIP address?

bottom of page