Control how Skype for Business users join meetings

Had an interesting request lately, where a company wanted to control how users join meetings when they click the “Join” on their Skype for Business clients’ calendar tab or when they join Skype for Business meetings from Outlook.

In the client’s options, we have the ability to choose what happens when we join meetings; We can join immediately using the Skype for Business client or choose from four different phone numbers, all of which must be populated in our contact card, and can be seen under Tools -> Options -> Phones.
If your AD is configured right, you should have your Work phone (ideally your Skype for Business line URI), your Mobile phone, your Home phone and maybe even an additional ‘other’ phone.
You can also manually add phone numbers if they’re not automatically updated from AD.

Phones tabNow if you scroll down the tabs to “Skype Meetings”, this is where all the fun begins:

Meetings tab

In the tab above you can choose any of the numbers you have in the ‘Phones’ tab and get to choose whether you’d like to be prompted at the beginning of each meeting which device you’d like to use, or just go with what you chose.

How do you control it?

Like most things, the Registry.
You can make changes to the user’s preferences but not grey-out the options. If the users want to bypass the setting they can, but they’ll be defaulted to your setting at logon.

First, decide if you want the user to be prompted with each call. If yes, we need to tick the “Before I join meetings, ask me which audio device I want to use”.

The registry setting fro this checkbox is located at


The key is


If it’s set to 1 – it means the box is ticked and the user will be prompted to choose which device they’d like to join the meeting from.
If it’s set to 0 – it means the box is unticked, and the user will automatically join via the configured device.

Choosing a device is the next funny setting:
Same registry location as above, look for the following key:


The setting of the last binary bit is as follows, as reflected in the users’ “Phones” tab:

0 – Do not join Audio.
1 – The Skype for Business client.
2 – Work Phone (If different from your Skype for Business line uri).
3 – Mobile.
4 – Home.
5 – Other.

If one of the above is not configured or missing, the client will default to “Do not join Audio”.

For example, if I want to set my users to join from their mobile phones without being prompted, I’ll set the AllowOverridingDeviceAtJoinTime registry key to 0 and the JoinAudioConferenceFrom key to 3.

Registry settings


Skype for Business Online updates

Announced today, Microsoft is expanding some Skype for Business Online services and offering new ones;

PSTN Conferencing preview will now be available to customers in the following countries:

  • Belgium
  • Canada
  • Denmark
  • France
  • Germany
  • Italy
  • Netherlands
  • Spain
  • Sweden
  • Switzerland
  • United Kingdom

Finland, Norway and South Africa will be able to use this feature in November.

Cloud PBX Preview now available worldwide, allowing customers to get rid of separate PBXs globally and still break out locally. This is option still requires an om-premises S4B server installation.

Polycom CX is not dead yet – Skype for Business customers can use Polycom CX600 and CX3000, HP 4120, and Mitel Mivoice 6725 to connect to the cloud directly. Polycom VVX series Can be used as well.

source and more details: Microsoft.

Managing Private Numbers in Skype for Business Server 2015

Private numbers are a great thing. They can be used as various scenarios where a person needs a direct private line that’s not published in the contact card and isn’t displayed when you dial out. This is not to be mistaken for Response Groups Agent Anonymity, where agents can call on behalf of themselves or on behalf of the Response Group’s number.

Incoming Private Call notification

What’s the difference?
Well, first, you can only manage Private Lines via PowerShell. Use the Set-CsUser -PrivateLine cmdlet to assign a user with a private line. When you’ll run the Get-CsUser cmdlet against that user you’ll get everything… Except for the user’s private number. We must use the explicit Get-CsUser | fl -PrivateLine cmdlet to get the user’s private number:

PS C:\Windows\system32> get-csuser yoav.barzilay@y0av.local | fl

Identity : CN=Yoav Barzilay,OU=Users,DC=y0av,DC=local
VoicePolicy : Non Restricted
VoiceRoutingPolicy :
ConferencingPolicy : Allowed
PresencePolicy :
DialPlan :
LocationPolicy :
ClientPolicy :
ClientVersionPolicy :
ArchivingPolicy :
ExchangeArchivingPolicy : Uninitialized
PinPolicy :
ExternalAccessPolicy : Skype Directory enabled
MobilityPolicy :
PersistentChatPolicy : Persistent Chat Enabled
UserServicesPolicy : AllowUnifiedContactStore
CallViaWorkPolicy :
ThirdPartyVideoSystemPolicy :
HostedVoiceMail : True
HostedVoicemailPolicy : ExchOnline365UM
HostingProvider : SRV:
RegistrarPool : S4bPool1.y0av.local
Enabled : True
SipAddress : sip:Yoav.Barzilay@y0av.local
LineURI : tel:+35864117539;ext=7539
EnterpriseVoiceEnabled : True
ExUmEnabled : False
HomeServer : CN=Lc Services,CN=Microsoft,CN=2:6,CN=Pools,CN=RTC
DisplayName : Yoav Barzilay
SamAccountName : yoav.barzilay

Now if I run the | fl (or | ft) switch with the right parameters, I’ll get what I’m looking for:

PS C:\Windows\system32> Get-CsUser yoav.barzilay@y0av.local | fl Name, LineURI, PrivateLine

Name        : Yoav Barzilay
LineURI     : tel:+353864117539;ext=7539
PrivateLine : tel:+353857560598;ext=0598

Additionally, Private Numbers have a different behaviour and rules than Primary Lines:

  • You can assign only one private line to a user.
  • You cannot assign an additional voice mailbox to a private line. However, unanswered calls will be diverted to the voice mailbox if one is configured.
  • Unless you decide to push it to the address book, Private Lines are never published on your contact card.
  • call forwarding, team call, delegation, team ring, Group Call Pickup, and Response Groups don’t work with Private Lines. Call park and call pickup will work normally.
  • When a call arrives to your private line it will display a “Private Number” notification when the call comes in and will have a different ring sound.
  • Are you set to “Do Not Disturb”? calls to your private will ignore this setting and will go through anyway.
  • Simultaneous ring, if enabled, is enabled on both the Primary and the Private lines.
  • Private numbers must be between 3 and 15 numbers in length and must be preceded with the “TEL:” prefix.

So how do you set a number for a user?

Quite simply, to be honest: just run the following:

Set-CsUser -PrivateLine "tel:<user's Private number>"


Set-CsUser -PrivateLine "tel:+353987654321;ext=4321"

To help you identify all the users in your organization that are configured with a private number, I built the following script:
Run it from your PC (Not from the server!), where you have PowerShell 3.0 or higher and Excel 2010 at least.
The script might require you to change your PS execution policy.
To run the script just start it from an elevated PowerShell Window:

Enter Pool DQDN

The script will then ask you for your Skype for Business Admin credentials to connect to the remote PowerShell on the server:


The script will run with Excel in the background and will open the file when it’s ready:



Please note this script only shows users configured with Private Numbers. If you’re looking for a way to display all your existing users and devices, please check this post.

Download the Skype for Business Private Numbers Script here.


List Lync Users – automated Excel file

(Have a look at the newer, smarter, prettier, fancier version of this script here.)

This script isn’t big news, but it’s very handy and easy to use.
It allows you to remotely connect to one of your pools and create an Excel sheet, populated with the following:

Display Name SIP Address Registrar Pool Enterprise Voice Line URI

It’s basically a list you can hand to your customers and colleagues so they can keep track of changes.
Additionally, it helps spot Enterprise Voice enabled users that don’t have a Line URI or it’s misconfigured.

When you run the script it’ll ask your for your Credentials – You must Have appropriate Lync permissions:


It will then ask you for the FQDN of your Lync server or pool and will attempt to connect:

Lync Server

When connected, the script will immediately start creating the Excel file:

Creating Excel2

You can scroll up and down the Excel file but do not click anywhere on the spreadsheet. This causes the automated build to crash, and you’ll have to restart the script.

When completed, the script will notify you and close the remote PowerShell session it initiated.

Script Done

The pace is approx. a second per line, so if you have 5000 users this is the time to go and grab a cup of coffee.

The script can be downloaded here.

Updated October 7, 2014: Version 2.0 checks for your PS version. This script will only run on PS 3.0 or higher.

Microsoft Support releases two KBs for Lync Server

Microsoft released two Lync-Related KBs today:

On-premises Lync Server integration with Exchange Online fails (KB2907651) deals with Exchange Online integration with an on=premises Lync Server 2010 or 2013. The issues described are Lync client Autodiscover process failure and EWS integration failure (EWS Information item is displayed as Not Deployed).
The fix for the above issues is to add the following registry key:
For Lync 2010 clients: Under HKEY_CURRENT_USER\Software\Microsoft\Communicator\, add a DWORD key named “OverrideDirectHttpConnection” with the value “1”.
For Lync 2013 clients: Under HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Lync\, add a DWORD key named “OverrideDirectHttpConnection” with the value “1”.

if you Lync Server 2013 Front-End server services don’t start for a long time (Who didn’t experience this?!), this article (KB2918336) can help.
This can happen after you install updates that require a service or system restart or if the Lync Server pool hosts three or more Lync Server 2013 Front-End servers.
If you see LS User Services Event ID: 32174, you might want to look into this article that suggests you run the command Reset-CsPoolRegistrarState -PoolFqdn “<Servers’ FQDN>” -ResetType QuorumLossRecovery.