top of page
  • Writer's picturesamanthaeasterday

Coming up with solutions is really the best part of my job. Tell me what you currently have, tell me what you want, pain points, wish list, where do you see your business in 3 years, 5, 10…

Wanting to use Microsoft Teams for your voice solution may feel like a complicated endeavor. But it doesn't have to be! I enjoy giving businesses new capabilities to make their work lives easier, less confusing and easy to use. This is where Direct Routing with Microsoft Teams fits in. It allows you to potentially keep an investment you’ve already made (Mitel, Cisco, PRIs, SIP Trunks, AudioCodes, Ribbon) and expand your investment with Microsoft, while giving your employees what they need to be successful; FLEXIBILITY, MOBILITY, basically anything ending with ITY 😉.

First, lets talk about the alternative. Microsoft Calling Plans. Seriously a great offering from Microsoft. But it comes with limitations such as being able to page using Teams, having dynamic E911 routing and it is ideal for businesses with a small number of users (or a big Microsoft Licensing budget). What most customers want is Direct Routing. Direct Routing offers businesses the option to integrate with their existing Legacy PBXs by implementing Session Border Controller(s) (SBC) to use with Teams.

This means all the time, effort, training, money you have put into your Mitel environments, wasn't a waste! You might ask, why would I keep my Mitel environment around at all? That is a great question. In reality you don’t need Mitel in the middle. Teams works directly with a Microsoft Teams certified SBC. The answer is call center, analog devices (telephones, fax machines), maybe you have a large investment in Mitel physical phones, or you just upgraded your Mitel 3300 Cx controller, and it has at least another 10 years of life! Okay, maybe not 10, but you get the point. There is no porting of numbers to a different carrier or users losing their DIDs, inbound and outbound calling would still flow through your Mitel controller, and it decides to send the call to Microsoft Teams. A hybrid model like this allows a business to limit their number of Teams Voice users to save on costs and gives them the time to adapt users to a new system and potentially phase out legacy hardware.

Okay, so what about Cisco folks?? I have amazing news! Did you know the Cisco CUBE is a certified SBC for Microsoft Teams?! This means you can continue to use your CUBE how you do today AND have outbound calling available for your Microsoft Teams users. Seriously NO additional hardware. I love this solution for businesses, it just makes sense!

These are high level solutions, of course. Every single environment is unique and requires the attention, detail, and skills to implement. Marco Technologies is ready to help your business take on the adventure of using Microsoft Teams Voice! Use the investments you have already made in Microsoft and your Legacy PBXs and give your users the tools they need to be as successful as possible!

20 views0 comments
  • Writer's picturesamanthaeasterday

As we start moving users to TeamsOnly (from our onpremises SfB, EV enabled) with direct routing. Microsoft recommends you to do a few extra steps.

Because of this, I needed to find a way to pull user's sip addresses and LineUri's from Skype, by using active directory. This seems simple enough, but believe it or not, I couldn't find a working script from any of the articles I read. So I pulled from the information out there and did it myself.

What this script does is get the members from an AD group. Gets the properties of the user principal name and exports to a file.

I then import that file, set a variable to look for the UPN and run a SfB command Get-CSUser, to pull out the sip address and lineuri. This is important because if you were to simply pull the telephone number from AD, you wouldn't get the full line uri with the tel:+ and if you have any extensions, you need the ;xxxx at the end. The easiest place to pull that information from is Skype.

Then I exported the information to a new clean .csv.

Copy starting here:

Get-ADGroupMember -Identity “Group Name” |

Where-Object{ $_.objectClass -eq 'User' } |

Get-ADUser -Properties userprincipalname | Export-csv -path c:\temp\file1.csv -NoTypeInformation

$csv = Import-Csv -Path c:\temp\file1.csv

$csv | Foreach-object {

$Upn = $_.UserPrincipalName

Get-csuser -identity $upn| select-object sipaddress,LineURI |

Export-csv -path c:\temp\file2.csv -NoTypeInformation -Append}

569 views0 comments

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

491 views1 comment
  • Twitter
bottom of page