My post-migration from Skype to Teams toolbox

When migrating from Skype for Business Server to Microsoft Teams you may find that users are not migrated with the correct features as intended. If the migration also includes moving Enterprise Voice workloads and switching to a Direct Routing or Calling Plan setup, you may find it difficult to get a full overview of what state the user is in and if all settings are correct.

I found that this Skype for Business Online PowerShell oneliner gave me the overview I needed to see if there were configuration issues or wrong settings. Hope this helps you in your post-migration cleanup process

Get-CsOnlineUser | Format-List UserPrincipalName, DisplayName, SipAddress, Enabled, TeamsUpgradeEffectiveMode, EnterpriseVoiceEnabled, HostedVoiceMail, City, UsageLocation, DialPlan, TenantDialPlan, OnlineVoiceRoutingPolicy, LineURI, OnPremLineURI, OnlineDialinConferencingPolicy, TeamsVideoInteropServicePolicy, TeamsCallingPolicy, HostingProvider, InterpretedUserType, VoicePolicy, CountryOrRegionDisplayName

  • TeamsUpgradeEffectiveMode – Should be set to TeamsOnly, if not, try to change it again and look at the error message
  • UsageLocation, DialPlan, and TenantDialPlan – When using enterprise voice together with Microsoft Teams, UsageLocation is important. It decides the number you get as part of AudioConferencing and your DialPlan. The default DialPlan just adds a plus and country code to whatever you type in Teams and is rarely good enough. You should supplement with TenantDialplans, don’t crate them yourself, use by MVP Ken Lasko. UsageLocation is set using the MSol PowerShell module.
  • LineURI, OnPremLineURI, and VoicePolicy – if your VoicePolicy is set to BusinessVoice you have a Calling Plan assigned, if it is set to HybridVoice, you are using Direct Routing. This is good to know if you are troubleshooting why LineURI is not updated by OnPremLineURI for Direct Routing. You should also know that if you are not able to set OnPremLineURI using Set-CsUser using online PowerShell, then you have msRTCSIP-LineURI populated in local Active Directory. If you clear this attribute, you get write access to the OnPremLineURI online.
  • InterpretedUserType – is a great source of information. It tells you the status of the user. If you have any attributes in local Active Directory it will be set to HybridOnpremSfBUser. If for some reason the user is disabled it will show in this attribute as something with disabled such as DirSyncDisabledSfBUser. Read this useful GitHub article that goes into this in more detail

If InterpretedUserType has the value of HybridOnpremSfBUser, then you need to clean up on-premises attributes if you are fully moving to Microsoft Teams and are decommissioning your on-premises deployment. The best way is to use Disable-CsUser to remove all Skype for Business related attributes on a user. More often than not, we see that this command is not run before decommissioning the deployment, so you need to remove the properties manually, here is a routine to detect all msRTCSIP attributes and then to clear them in Active Directory. Based on the type of configuration the user had before servers were removed, the properties with a value may be different per user so using ‘msRTCSIP*’ is a good way to catch the attributes for that specific user.

#Get all msRTCSIP properties for a user that has a value
$Properties = Get-ADUser -Filter {UserPrincipalName -eq "<UPN>"} -Properties * | Select-Object -Property 'msRTCSIP*'
#Clear all properties for a user
Get-ADUser -Filter {UserPrincipalName -eq "<UPN>"} -Properties * | Set-ADUser -clear ($Properties | Get-Member -MemberType "NoteProperty" | % { $_.Name })

Script to find current Cumulative Updates on Lync servers in a deployment

adhesive_bandage-512Recently I posted a blogpost on Finding the correct patch version of a Lync server. After writing the blogpost I realized that it would be very cool to automate this using PowerShell. The result is Get-CsInstalledLyncVersion.ps1 which is available to TechNet Gallery. This is a great tool to do an initial assesment of a Lync deployment where you get a good overview of installed servers and their current patch level.

Get-InstalledLyncVersion.ps1 script to check patch level on all Lync servers in an environment

  • .Notes
    • This script works for Lync Server 2010 and Lync Server 2013
    • Run Lync Management Shell in Administrative mode
    • Use the Function Get-RemoteProgram by Jaap Brasser, modified by MVP Jan Egil Ring
    • If you can not connect to a server make sure Remote Registry Service is running on the machine you are unable to reach
      • Port 139 and 445 needs to be open on the server you are trying to scan
    • Tested OK in 2010 and 2013 environments
    • The script will be updated as new CU’s will arrive, but will also flag unknown CU versions and let you download the latest one
  •  V1.0 May 2014 – Initial Script
    • Scans registry on all servers in a Lync deployment to find current installed version
    • You shall not use WMI to query MSI packets as that will invoke a reconfiguraton
    • Checks against a database in this script to find the correct CU level
    • Will ask if you want to download the current CU if there are servers which is not on the latest patch level
      • Using function New-FileDownload by MVP Pat Richard
      • Will open the download location after the file is downloaded
    • No Parameters are required

Download the script here

Pat Richard beat me to it and released a similar script days before I completed mine. Check it out at


Output of scanned computers in a 2010 environment


Output of CU download dialogue in 2013 environment


Finding the correct patch version of a Lync server

adhesive_bandage-512Recently I have been troubleshooting and doing health checks on a couple of Lync systems. When troubleshooting it is good to know what patch level your servers are on, whether they are on the same patch level or the newest patch level.

I discovered at one client that the Edge servers in DMZ was being patched through Windows Update, but the internal Front End servers where not being patched, they where not part of the patch system the customer where enforcing. The result was that at one point, with the january 2014 cumulative update on the Edge server and the RTM patch level on the Front End servers, the gap became too large and the it ended up with the Front End servers not supporting and working with the Edge AV relay server. We saw the error occur with unsupported realy server in the diagnostics header before the Front End servers even tried setting up the media traffic on the Edge servers.  Quite a strange problem to troubleshoot, but best practice is that all servers should be on the same patch level. Patching the internal Lync servers solved the issue.

Here is some notes on finding what patch level your servers have

You see only a white screen when viewing Lync 2013 desktop sharing

On a couple of Windows 8 computers I have seen the issue where I receive only white screen when someone shares their desktop with me in Lync 2013.

This applies to

  • Fresh installed Windows 8 computer
  • One year old Windows 8 computer
  • Lync Peer to Peer collaboration
    • The issue is consequent so it is not a specific deployment issue
  • Lync conference
    • All other attendees can see the screen fine so it is not an appsharing issue
  • The issue is client related so it will be present for Lync Online as well as Lync on-premises

The experience

Continue reading

Troubleshooting Office Web Apps Server for Lync

Recently I had to troubleshoot Office Web Apps Server deployments at a couple of customer sites. I had to work through the config and sometimes the Office Web Apps server feels disconnected from the rest of the Lync configuration and can be a difficult role to troubleshoot. I have tried to collect my notes and if I have missed something, let me know.

How to check that the Office Web App Server Web farm is deployed correct

How to check that Lync detects the Office Web Apps Server correct

  • Look for Evnet ID 41034
    • Web Conferencing Server has successfully discovered Office Web Apps Server, PowerPoint content is enabled
  • Look for Event ID 41032
    • Will show that it found the URL’s correct
    • Clicking on the internal URL should result is a server error message like in this picture
  • To force rediscovery of the URL’s restart the RTCDATAMCU service
    • Run Get-CsWindowsService RTCDATAMCU to see if there is any active conferences
    • Then stop and start the service
    • Look for Event ID 41032
  • Make sure that the Topology Builder is provisioned with the correct Office Web Apps Farm
    • Event ID 41033 is logged if the Lync server is unable to resolve the Office Web Apps Farm

On a side note, you may want to lock down your Office Web Apps Farm so that others can not use it. Read more in this post by MCM Marjus Sirvinsks:

Lync Server Mobility Troubleshooting Tips

The Lync Mobility service and the Lync Clients was released 13.12.2011. Since then as we get more hands-on with the service there are in some cases trouble getting the it up and running. This post is dedicated to how you can test and troubleshoot the mobility service deployment. I will update this post when I find more information on how to troubleshoot and how to solve certain scenarios.

Last updated: 14.10.2012 Continue reading

Lync Server 2010 Troubleshooting Tips

Last updated: 24.10.2012

When deploying Lync Server 2010 you will most likely come across a lot of strange behaviour and stuff that don’t work as expected due to configuration errors or environmental issues. I will in this post try to collect the solutions and articles I find and update along the way, to have troubleshooting tips in one place. Please let me know if any good blog posts or articles that solve some specific problems is not listed here.

General Troubleshooting
Troubleshooting Lync may be a daunting task since there is a lot of elements that is involved in a deployment. Over the years troubleshooting OCS and Lync I have found a routine for eliminating problems. If you have deployed Lync Server and there is connectivity issues or some features not working I usually go about it in the following order: Continue reading