Reminder: Quarterly Skype for Business User’s Groups

This is your quarterly reminder that the US Skype for Business Users Groups are coming up.

Going forward, you need to register at skypeusersgroup.com.  The Meetup site will no longer be used.

These are always a great time and a great place to network with your peers and make those relationships.  I’ll be there as well as many experts, there will a Cloud PBX discussion and Polycom reps on site to show off interoperability and some cool devices.

 

  • January 21 – Chicago, IL
  • January 26 – Cincinnati, OH
  • January 19 – Philadelphia, PA
  • January 19  – Los Angeles, CA
  • January 26  – Nashville, TN
  • January 21 – Silicon Valley, CA
  • January 28 – Kansas City, MO
  • February 16 – Detroit, MI
  • February 4 – Boise, ID
  • January 27 – Milwaukee, WI
  • February 11 – Seattle, WA
  • February 10 – Portland, OR
  • February 3 – New York, NY
  • February 18 – Charlotte, NC
  • February 10 – Atlanta, GA
  • January 28- Baltimore, MD

Call Forwarding Added Back to Skype for Business for iOS

In my previous article: http://www.skypeadmin.com/2015/10/14/skype-for-business-ios-is-available-calm-down/ I noted that many features were removed from the Lync iOS application for iPhone and iPad when it was upgraded to the Skype for Business application.  One of my most used features, call forwarding, was pulled.  This feature has now been officially put back in place.

SkypeUpdate

As you can see, it’s where you would expect it to be below.  This is a very welcome re-addition to the application, but I feel, and Microsoft I believe understands, that there’s still a long way to go.  In the new “mobile first” world, I also feel we’re a bit behind in this department.

 

IMG_3421

I’m still patiently waiting for my second most used feature, PowerPoint sharing, to be added back in.  At the moment, we can use desktop sharing instead.  However, if the presenter isn’t one who works with your firm, asking for them to switch to desktop sharing for their slide deck can be embarrassing.

IMG_3420

Once we’re back on par with some of the features we had in the past, I’m excited to see some added new functionality.  I’m hoping to see seamless transfers of audio between the smartphone and other clients and more feature parity with the full client (including e911).

Let me know your thoughts as well, but remember, real feedback should go to Microsoft at http://www.skypefeedback.com.

Lync and Skype Response Groups; Alert Time vs Queue Time-out

Overview

I realize that there are other blogs that discuss this, and my apologies to the owners, but TechNet itself isn’t so clear and this comes up in the forums regularly.  I wanted to clarify just what is Lync and Skype for Business Response Group (RGS) group alert time vs queue time-out as well as discuss their relationship.   I feel it is best to do so through the use of scenarios. Please feel free to comment below if you feel I missed something.

Group Alert Time

This setting is simply how long the entire group will be tried in seconds before it gives up.  It does not mean how long each group member’s phone will ring.  This setting becomes more clear when we look at it in relationship to the queue.

Queue Time-out

This setting is the total amount of time all groups in the queue will be tried.  There are scenarios where the time in the queue is actually longer than the queue time-out is set, and this can be observed in scenario B below.

Scenarios and Examples

It’s easier to explain this through the use of individual scenarios, so I will attempt to outline this below.

Scenario A – Single group in a queue with queue time-out set to be longer than group alert time

In this scenario, the group will ring for the alert time seconds defined in the group and stop.  Since the queue time-out has not been reached, the group will ring again.  This will repeat until the time-out has been reached.  This scenario is handy for when you want the call to fail to another member of the group after a set time-frame.  For example, if you have a four-member group set as round robin, with an alert time of 10 seconds, and your queue time-out is forty seconds, each available member of the group will hear the phone ring assuming nobody picks up.

Scenario B – Single group in a queue with queue time-out set to be shorter than group alert time

In this scenario, even though the time-out is reached the ringing will continue until the group’s alert time has been reached.  For example, if the queue time-out is 10 seconds, but the group’s alert time is 30 seconds, the phone will ring for 30 seconds before the queue acts on the time-out.  This is typically due to a misconfiguration rather than a planned scenario.

Scenario C – Multiple groups in a queue with queue time-out set to be longer than the sum of the group alert times

In this scenario, multiple groups are set up and ordered within the queue.  The first group will be tried until it’s alert time is reached, and since the queue time-out has not been reached, the next group will then be tried.  After each group is tried, a check to see if we’re past the time-out is made.  Since we are not, the first group will be tried again and so-on.

Scenario D – Multiple groups in a queue with queue time-out set to be shorter than the sum of the group alert times

In this scenario, multiple groups are again set up and ordered within the queue.  The first group will be tried until it’s alert time is reached (similar to scenario B, this can extend the queue time-out), and a check is made to see if we’re past the time-out.  If so, we perform our time-out call action.  If not, we move to the next group and try it for it’s full alert time.  At the end, we check to see if we’ve passed the time out and move forward.

SFBLogo

Hopefully that cleared a few things up for a few searchers out there, if so or if not leave a comment below.

 

 

Yes, Analog Is Still a Big Deal, Enter the AudioCodes MediaPack 1288

It’s a new world, it’s a new model, SIP is king and Unified Communications has supplanted standalone telephony.  We are always connected, we have endless choice for effective communication,  we can start large video conferences from a disposable device in our pockets, we live in the future.  So why am I so excited about this new high density analog gateway from AudioCodes?

In a perfect world, analog would be dead, but we live in the real world with legacy processes EmergencyLight
and systems that need to be brought forward.  Large enterprises, higher education, healthcare, and other organizations still have analog needs that need to be filled in a UC world.  Imagine a university campus filled with emergency blue light call boxes, press a button and you’re on the line with police.  That’s analog. Imagine rooms upon rooms filled with hospitality phones that are extremely costly to replace or have no good SIP equivalent.  More analog.  Until now, the high density analog options for Skype for Business or Lync were rough.  The biggest supported gateway had a mere 24 ports.  Sure, you could maintain many gateways but the complexity multiplies.  It sadly came up that maintaining a trunk to a legacy TDM system was often a reasonable answer.

But finally we have a new option, the AudioCodes MediaPack 1288.  This 3U device can start with 144 analog FXS ports and scale to 216 or 288 depending on the number of line-cards (up to 4) added.  Each of those line cards has three 50-pin champ connectors which can connect to a punch down block or an RJ11 adaptor.  For those emergency phones, it supports long haul connections over 4 and a half miles (your ethernet cable won’t make it).   When you’re used to stacking gateways and maintaining multiple routes, this unit means the world.

For fun, here’s a sneak peek at the unit below with a single line-card. I have to make this clear, this picture is unofficial and the look may change by GA, meaning yours might look a bit different.

20150917_193427_resized

If you’re looking for more info, AudioCodes’ site has the specs: http://www.audiocodes.com/products/mediapack-1288

QuickTip: Old Tracing Files and OCSLogger

I’ve run across this in a few implementations now. You go to run the OCSLogger on an older Lync server and there seems to be way too much data in there, old data in fact.  You can see in the below image, I ran the logger for literally 2 seconds, but somehow have 9 SIPStack files. This can happen when trace files refuse to be deleted or overwritten.

9sipstackfiles

The quick answer is to close your logger, find your tracing folder (often C:\Windows\Tracing) and move the old ETL files, or all the files in the directory somewhere else.

somanyfiles

You should now be able to start the logger fresh.

Move Your Lync/Skype Users Faster

Hypothesis and Assumption

The other night during an upgrade, I had to move 35,000 Lync users from one pool to another Skype for Business pool.  Because it was an upgrade, this wasn’t a simple Invoke-CSPoolFailover situation.  Running a Get-CSUser  | Move-CSUser command suggested the move time was going to be just short of 8 hours, well outside of our maintenance window and well into the morning where users would arrive and potentially notice.

I’ve long suspected that multi-threading the move would help, and I typically run the move across many servers out of hope and superstition, but I could never say for sure if it was real or my imagination that users seemed to move faster.  Since the back end is mirrored, all of these threads on all of these servers are really ultimately beating on the same back end server, was that the bottleneck?  This night was a good night to find out if it was faster for sure.

Testing

I have six servers in the new Skype for Business pool, breaking the users equally across all of these servers, running 4 threads per server I was able to complete all moves within 2 hours.  A HUGE 4x improvement.

I was still curious, was it because I split it across six servers, or was splitting it across multiple threads enough?  I set up a lab with a similar number of users and ran the moves there.   There were four groups of users with names starting with A, B, C, or D respectively.

Running the following command would take about 40 minutes in each direction:

Download Measure1.txt
1
measure-command {Get-CsUser -Filter {Registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com}

However splitting the command up on the same server into four threads sped the move time up so the moves completed on an average of 14 minutes total, nearly 3x faster.

Download Measure2.txt
1
2
3
4
measure-command {Get-CsUser -Filter {FirstName -like 'a*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com}
measure-command {Get-CsUser -Filter {FirstName -like 'b*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com}
measure-command {Get-CsUser -Filter {FirstName -like 'c*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com}
measure-command {Get-CsUser -Filter {FirstName -like 'd*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com}

Splitting the move across four servers didn’t seem to improve the performance much over the existing tests, though in fairness my lab is limited and runs on a single virtual host.  I’d love someone to test further with a real environment, and I will myself, but these large moves don’t happen every night so I’ll need some time before another very large test can occur.

Conclusion

  • Is it worth splitting user moves into multiple processes?  YES!
  • Is it worth splitting across multiple servers?  I strongly suspect so.
  • Is it worth trying to find the point of diminishing returns?  Probably not, we’re talking about hours of time and not days, every system is different so while it’s a fun exercise, it’s somewhat fruitless and therefore not published here.
  • Is it worth creating a script that can programmaticly divide the users to be moved into perfectly equal parts for each thread because you’re a PowerShell nerd?  Not likely, I fought this with myself… we’re again talking about hours of time here, not days.  That said, here’s a sample that splits it up by first name and opens threads in new PowerShell windows, just cut and paste a chunk into an Administrative Skype for Business Management Shell window and let it do the rest of the work for you.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'a*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'b*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'c*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'd*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'e*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'f*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'g*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'h*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'i*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'j*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'k*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'l*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'm*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'n*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'o*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'p*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'q*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'r*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 's*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 't*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'u*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'v*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'w*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'x*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'y*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'z*' -and registrarpool -eq 'sourcepool.domain.com'}|move-csuser -target destpool.domain.com;pause"

And for fun, here’s an image of me running the measure-command with results in my own lab:

Capture

Reminder: Quarterly Skype for Business Users Groups

This is your quarterly reminder that the US Skype for Business (they’re re-branding!) Users Groups are coming up.

These are always fun and valuable, and a great place to network with your peers and make those relationships.  I’ll be there as well as many experts, there will be a deep dive into monitoring applications and an open forum so please feel free to ask any questions you may have.

Head over to skypeusersgroup.com and find your group on www.meetup.com.

  • October 20th – Chicago, IL
  • October 20th – Cincinnati, OH
  • October 20th – Philadelphia, PA
  • October 21st – Los Angeles, CA
  • October 27th – Nashville, TN
  • October 21st- Silicon Valley, CA
  • October 29th- Kansas City, MO
  • November 3rd- Detroit, MI
  • November 3rd- Boise, ID
  • November 4th- Milwaukee, WI
  • November 4th- Seattle, WA
  • November 5th- Portland, OR
  • November 9th- New York, NY
  • November 10th- Charlotte, NC
  • December 3rd- San Francisco, CA
  • December 3rd – Atlanta, GA
  • December 10th- Baltimore, MD

Skype for Business iOS is Available! Calm Down.

The Skype for Business iOS app was released this morning to much fanfare… I’m as excited as anyone, however I had to calm down a bit as I quickly realized some critical features that I used regularly with the Lync 2013 app using didn’t make it into the RTM version.  This is somewhat of an issue because the Skype version is an update that replaces the Lync 2013 version, there’s no going back and there’s no running them in parallel.

IOSad

Some of the most notable features missing are:

  • There is no option to set call forwarding settings.
  • There is no option to transfer a call.
  • You cannot view PowerPoint presentations unless within a desktop sharing session.
  • No group IMs.

These shortcomings are outlined here and will hopefully be addressed soon:  https://support.microsoft.com/en-us/kb/3102247

Futhermore, other issues have been spotted such as the client automatically adding a +1 (or +whatever your country code) and are mentioned here: https://support.microsoft.com/en-us/kb/3101663

I’ve personally been seeing miscellaneous crashes as well, though to be fair, many of my apps have been crashing since upgrading to iOS9, so I can’t say this is Skype related for certain.  Still, because of the official issues referred to in the article, I’ve been advising helpdesks to notify their users to hold off on the update if any of these features will cause a serious hindrance to their work.  If these features don’t affect you, it’s a pretty cool app and I’m excited to have it finally on my phone.

 

Awarded MVP for Skype for Business 2015

It’s October 1st, and I am honored to (once again) be awarded as a Microsoft MVP for Skype for Business for 2015.  Reflecting on the last year, the biggest benefit of the program really has been the opportunity to meet and chat directly with people involved in the product group as well as the close comradery of the MVP community.  One of the most surprising things is simply how vocal the MVPs are about product issues and improvements that are needed, it’s not all a Microsoft love-fest like you might have imagined.  You should know that the MVPs are in your corner, standing in front of Microsoft, unashamedly pushing and fighting for many of the ideas seen on lync.ideascale.com and skypefeedback.com.  🙂  It’s not so surprising when you consider we’ve dedicated ourselves to the solution, are vendors and implementors, and are extremely passionate about what we do.

Capture

Update: the award hit has been received and unboxed.  New pin, new card, new plaque, more stickers, and the glass disk to fit on the existing award.  If you want to see what the first award looks like, click here.

IMG_2788

Good to Know: Explaining Exchange UM Diversion Header Preference

What’s the Issue?

Here’s another one that I’ve personally fought a few times with clients that use Exchange 2007, 2010, or 2013 Unified Messaging with Avaya, Cisco or other PBX systems.  We’ve also seen it come up a few times on TechNet.  After bouncing around within voicemail, calls don’t end up where we might expect them too.  An example call flow is as follows:

  1. A call comes into an Exchange UM Automated Attendant.
  2. The caller presses a key to be transferred to User A.
  3. User A doesn’t answer.

The question is: when User A doesn’t answer, what do you expect to hear?  Do you expect to go back to the Automated Attendant or do you expect to hear User A’s voicemail?  With Microsoft Exchange, you’ll go back to the Automated Attendant, while many used to other more traditional voicemail systems are expecting to hear User A’s voicemail.   Why is this?   Simply, it’s diversion headers.

What’s a Diversion Header?

If you’re not familiar with diversion headers within your SIP packets, they’re defined a bit in RFC 5806. In a nutshell they’re used to signal a change to the ultimate endpoint that will receive a call.  We see these used heavily in voicemail systems.  When a call is routed to voicemail, the SIP INVITE is sent to the voicemail subscriber access or dial plan number with a diversion header specifying the phone number that corresponds to the mailbox.  To see this, let’s say a call comes in from the phone number 555-555-5555 to a user with phone number 888-888-8888, the Exchange dial plan has the phone number 88895 assigned.   The SIP INVITE would look like the following:

 INVITE sip:88895@10.19.10.21;user=phone SIP/2.0 
 Via: SIP/2.0/TCP 10.19.10.131:5060;branch=z9hG4bKac214495832;alias
 Max-Forwards: 70
 From: <sip:555555555@10.19.10.131>;tag=1c213481216
 To: <sip:88895@10.19.10.21;user=phone>
 Call-ID: 213439323315201145819@10.19.10.131
 CSeq: 1 INVITE
 Contact: <sip:555555555@10.19.10.131:5060;transport=tcp>
 Supported: em,100rel,timer,replaces,path,resource-priority,sdp-anat
 Allow: REGISTER,OPTIONS,INVITE,ACK,CANCEL,BYE,NOTIFY,PRACK,REFER,INFO,SUBSCRIBE,UPDATE
 Diversion: <tel:8888888888>;reason=no-answer;counter=1;screen=no;privacy=off
 User-Agent: Mediant 1000/v.6.60A.030.010
 Content-Type: application/sdp
 Content-Length: 231
 v=0
 o=AudiocodesGW 212414200 212414170 IN IP4 10.19.10.131
 s=Phone-Call
 c=IN IP4 10.19.10.131
 t=0 0
 m=audio 8330 RTP/AVP 0 101
 a=ptime:20
 a=sendrecv
 a=rtpmap:0 PCMU/8000
 a=rtpmap:101 telephone-event/8000
 a=fmtp:101 0-15

The issue comes in when the call bounces around and the diversion headers stack up.  Let’s look at another invite.  This time, a call comes in from the phone number 555-555-5555 to an automated attendant with phone number 666-666-6666, the Exchange automated attendant has the phone number 88895 assigned.  The caller hits a key and the call is transferred to a user with the phone number 777-777-7777.  The 7777 number doesn’t answer and is sent back in toward Unified Messaging.  The INVITE coming back in now looks like this:

INVITE sip:88895@10.19.10.21;user=phone SIP/2.0
Via: SIP/2.0/TCP 10.19.10.131:5060;branch=z9hG4bKac1145709558;alias
Max-Forwards: 70
From: <sip:555555555@10.19.10.131>;tag=1c1145125933
To: <sip:88895@10.19.10.21;user=phone>
Call-ID: 1145084972315201145825@10.19.10.131
CSeq: 1 INVITE
Contact: <sip:555555555@10.19.10.131:5060;transport=tcp>
Supported: em,100rel,timer,replaces,path,resource-priority,sdp-anat
Allow: REGISTER,OPTIONS,INVITE,ACK,CANCEL,BYE,NOTIFY,PRACK,REFER,INFO,SUBSCRIBE,UPDATE
Diversion: <tel:7777777777>;reason=no-answer;counter=1;screen=no;privacy=off
Diversion: <tel:6666666666>;reason=unknown;counter=1;screen=no;privacy=off
User-Agent: Mediant 1000/v.6.60A.030.010
Content-Type: application/sdp
Content-Length: 233
v=0
o=AudiocodesGW 1143825135 1143825105 IN IP4 10.19.10.131
s=Phone-Call
c=IN IP4 10.19.10.131
t=0 0
m=audio 6990 RTP/AVP 0 101
a=ptime:20
a=sendrecv
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15

Exchange sees the last diversion header and sends it right back to the Automated Attendant listening on 666-666-6666 and we’re back in the menu.  The telephony team may have instead preferred that Exchange looks at the first diversion header and transfer to the 777-777-7777 user’s voicemail.

How Do You Change It?

Within Exchange, there is no method to alter this.  With most session border controllers or IP gateways, such as Sonus, AudioCodes, etc, you do have options.  Some of these come in the form of checkboxes, sometimes you’re working with SIP message manipulations.   Armed with this understanding and your own SIP trace files, you should be able to work with your gateway or PBX vendor to find a solution.  I have intentionally left instructions to manipulate the SIP messages in various systems out of the article as a misstep can cause disaster for a production systems, please work with your vendor for more specific help.