Thursday, March 24, 2011

Enterprise Voice and Communicator for Mac 2011

I've never been a Mac fan (probably due to that chip I'm POSITIVE Microsoft installed in my skull back in the day).  However, since they can be found in the corporate environment from time to time, it was inevitable that I would eventually have to deal with an issue with it.

Communicator for Mac 2011 provides pretty much the same features as the PC Lync client, including Enterprise Voice.  A few Mac in our office have tried to use the Enterprise Voice functionality, but it never seemed to work as advertised.  The documentation kept referring to a phone icon in the client, but all our Mac users had just a microphone icon in its place.  They could only make Communicator-to-Communicator calls.

With me being the Mac non-expert that I am, I dealt with the issue in the best way I knew how:  Google for help.  That turned up nothing (this was a few months ago), so I did the next best thing: I ignored the issue.  However, a client had the exact same issue, and thanks to their help (Yanick from Distributel), we've finally got a solution.

Yanick did some digging and found some references to a requirement for populating the Business phone number for Enterprise Voice users to allow Communicator for Mac to work. I found this excellent post from Keenan Crockett at Pointbridge. I won't rehash what he says there, because it describes exactly what to do, with one small but important omission: The phone number you enter in Active Directory seems to have to be in E.164 format (ie +15552221111).

Our phone numbers were entered as 15552221111, and even though we do have a valid, functional Company_Phone_Number_Normalization_Rules.txt file that successfully normalizes numbers to E.164 for Lync, it wasn't enough for the Mac client.  Once Yanick and I added the + sign in front of all our numbers, and followed the directions in Keenan's blog (Update-CSAddressBook, delete client address book files etc), the Mac client's screen switched from this:

To this:

Our Mac users are now able to dial phone numbers from within Communicator for Mac 2011.  We're almost completely out of the woods, however we are experiencing one odd issue. Whenever we type a number in the dialpad, Communicator crashes with exception EXC_BAD_ACCESS after entering anything more than 6 digits. We can dial successfully if we select the user's phone number from our contact list.  We've got the latest updates installed. Has anyone else seen this behaviour?

Thursday, March 10, 2011

Internal Extension Dialing in Lync

If you've created normalization rules in Lync, you've likely noticed a checkbox at the bottom of the page that says "Internal Extension".

If you clicked on the question mark icon, you'd see this helpful bit of text:
"Select this check box if the normalization rule results in a phone number that is internal to the organization."
If your normalization rule did in fact deal with internal extensions, you might have checked this box and moved on. Chances are, the normalization rule wouldn't behave any different than your other rules and you probably shrugged your shoulders and didn't give it a second thought.  Well, that's the way I typically rolled until I experienced an issue with a client that made me dig deeper into the whole internal extension thing.

Thursday, February 10, 2011

Lync Conversation Translator

I'm currently doing consulting for a multi-national company with offices where the primary language spoken is not English. The entire company are big users of Communicator/Lync, so I often find myself IM'ing with people who don't speak English. For the longest time, I would type my conversation into Google Translate, hit Translate, copy the results into my conversation window and press Enter. I would have to do the same for incoming IMs as well.  Conversations were slow and inefficient.  I would often think there HAS to be a better way to do this.

Thankfully, there is a basically FREE way to incorporate a conversation translator directly into Lync.  The Lync SDK includes a number of samples you can compile so you can learn the ins-and-outs of programming in Lync.  One of those samples just happens to be a Conversation Translator.  Even though I'm not a programmer (although I did somehow manage to pull off the Lync Dialing Rule Optimizer), I figured I'd try my hand at some Lync programming.

Monday, January 24, 2011

Lync External Web Services without Reverse Proxy

PLEASE NOTE:  While the procedures below has worked in a Lync 2010 environment, it may not work in Lync 2013 or Skype for Business.  It is HIGHLY recommended to employ a reverse-proxy solution.  Opening up an internal domain-joined computer to the Internet can be a recipe for disaster. I myself, have only done this procedure once, and have since made a reverse-proxy mandatory for customers looking for help from me. Not only that, but I've heard from some that the mobility features do not work using the alternate IP method.  If you find yourself in that situation, please be aware that Microsoft (and any consulting company worth their salt) WILL NOT support this method.  Also, this is not a substitute for deploying an edge server.  If you want external connectivity to work, you MUST deploy an edge server.  There is no other way, supported or not.  Caveat emptor.

And now on with the show....

While working on a Lync deployment for a small customer, it came up during the planning stages that they didn't have a reverse proxy server (like ISA/TMG) to publish the Meet/Dialin simple URLs and web components URL, nor were they planning to. In the past, I had tried to make OCS work without a reverse proxy, but some things just didn't work right. After advising them about the risks involved with opening up an internal domain-joined computer to the Internet, I told them I would try to make Lync work without a reverse proxy, but cautioned that it may not work.

Friday, January 21, 2011

Lync Enterprise Voice Best Practices - Usages and Routes

Over the past while, I've typed some lengthy posts about the importance of E.164 phone number formatting and my take on normalization best practices. Now to pull it all together for the final act, I'll be talking about Lync PSTN usages and routes.

When you look at the Voice Routing section of the Lync Control Panel, you'll see the following "tabs": Dial Plan, Voice Policy, Route, PSTN Usage, Trunk Configuration and Test Voice Routing:

From this section, you can manage most aspects of your Enterprise Voice deployment.


Dial Plans were briefly discussed in my previous post.  A dial plan is a collection of normalization rules that are assigned to sites, pools or users.  Dial plans are designed to allow users to dial phone numbers as they are accustomed to, but still outputs properly formatted E.164 phone numbers, no matter what they type. When you create a dial plan at the site or pool level, all users within that site or pool whose Dial Plan Policy is set to Automatic will be assigned that policy.  There can only be one Dial Plan per site/pool.  If one dial plan is assigned to a site and another one to a pool, the pool-level policy will take precedence.  If you want more granular control, you can create user-level dial plans.  You have to assign users to the user-level Dial Plan policy either through the control panel or via Powershell.

Voice Policies define the capabilities of the users assigned to it. Capabilities can include call transfer and call forward, among others. Capabilities also include the types of calls (local, long distance, international etc) members are allowed to make via PSTN Usages.  Voice policies are assigned to users or sites. Site policies will automatically be named the same as the site, while user policies can be given whatever name suits you.

When you create a voice policy, you have the option to associate PSTN Usages to the policy. If you're just starting out, this list will be blank.

PSTN Usages
PSTN usages are the link between a voice policy and a route. The combination of the three determines the calls a user can make and what route the calls will take.  PSTN usages can contain multiple routes, and can be assigned to multiple voice policies.

You can only create PSTN usages through the Voice Policy interface. When you create PSTN usages within a specific voice policy, it will automatically link to that policy.  You can also create routes from within the PSTN Usage creation dialog box, which makes the whole creation process efficient.

PSTN usage names should relate to calls of the same type: like Local, Long Distance/National, or International. If you've got more than one site where PSTN calls will be made and has a defined PSTN gateway, its best to qualify the usages with site information (you'll see why later). I prefer (and this is the same format used for the Dialing Rule Optimizer):  country-state/prov-city-callclass or country-city-callclass.

Some examples:
NA-ON-Toronto-Local
NA-BC-Vancouver-National
NA-TX-Dallas-International
GB-London-National
IT-Rome-Local
JP-Tokyo-International

I tend to use NA (North America) instead of US and CA, because both countries share the same country code (1). Again, if you have a better scheme, go ahead and use it.  There is no right or wrong way to do this.

Routes
Once the PSTN usages are created, I then create routes. If you've followed best practices and ensured that every phone number that enters the system is formatted for E.164, this is where your diligence pays off. A route defines the actual path a call takes on its way out to the PSTN via a defined PSTN gateway. When a user makes a call, a route is selected based on two things: a matching rule (ie. 11-digit numbers starting with +1) and whether that route is part of a PSTN usage assigned to the user.

Don't make the mistake of assigning multiple gateways from different sites in the hopes of achieving failover routing. Lync doesn't use any sort of ordering when determining which gateway to use within a given route.  Its very likely that calls will route equally between the two, which would make for a nasty surprise when the bills come in. For example, don't put gateways from your Toronto and Rome deployments in the same route.  Some calls will route through Toronto, and others will route through Rome.  To properly achieve failover routing, use PSTN usage ordering, as discussed later.

Create routes according to the calls you want to send out that particular gateway.  You can be as generic or as specific as you want.  For instance, you could create a single route called All Calls, and have a matching pattern of ^\+\d+$ (which means accept any call starting with + and at least one digit.).

I prefer to get more granular, even if I won't be imposing limits on the calls users can make. Increased granularity allows you to impose great control over call paths. For instance, you can easily setup least cost routing and backup routes by using properly formatted routes.

I like to setup at least 5 different routes for each gateway: Local, National (long distance), International, Toll-Free, and Service Codes.  As with usages and normalization rules, I like to follow the same naming convention: country-state/prov-city-routeclass or country-city-routeclass.  I assign the routes to the respective PSTN usage.  National and International routes go into the National and International PSTN usages respectively.  Local, Toll-Free and Service Codes all go into the Local PSTN usage.

Each site should look something like this, using Ottawa as an example:
PSTN UsageRouteRule
NA-ON-Ottawa-LocalNA-ON-Ottawa-Local
NA-ON-Ottawa-TollFree
NA-ON-Ottawa-Service
^\+1613\d{7}$
^\+1(800|888|877|866|855)\d{7}$
^\+[2-9]11$
NA-ON-Ottawa-NationalNA-ON-Ottawa-National^\+1[2-9]\d{9}$
NA-ON-Ottawa-InternationalNA-ON-Ottawa-International^\+[2-9]\d{6,}$
 
Trunk Translation
With your voice policy/PSTN usages/routes all setup, calls should be routed to the proper gateway for sending out to the PSTN. However, the local PSTN provider likely has their own formatting rules for calls that may not be compatible with E.164.

To accomodate these requirements, you create trunk translation rules to add or remove digits from your E.164 formatted phone numbers before sending the call out to the PSTN.  For instance, a Toronto gateway to the PSTN might need to strip the +1 from local calls, strip the + from long distance calls and add 011 to international calls.  Again, the Dialing Rule Optimizer can help create the local ruleset for your deployment.  An example for Toronto would look something like this:
Trunk Translation Rule NamePatternTranslationSent to GW Example
NA-ON-Toronto-Local^\+1((416|647)\d{7})$14165551111
NA-ON-Toronto-National^\+(1\d{10})$$112125551111
NA-ON-Toronto-International^\+([2-9]\d{6,})$011$1011525551111
NA-ON-Toronto-Service^\+([2-9]11)$$1411

If your calls have to route through a PBX before going to the PSTN, you can add the necessary external access prefix here as well. For example (using 9 as the external access prefix):
Trunk Translation Rule NamePatternTranslationSent to GW Example
NA-ON-Toronto-Local^\+1((416|647)\d{7})9$194165551111
NA-ON-Toronto-National^\+(1\d{10})$9$1912125551111
NA-ON-Toronto-International^\+([2-9]\d{6,})$9011$19011525551111
NA-ON-Toronto-Service^\+([2-9]11)$9$19411

PSTN Usages Ordering
When you have all your usages and routes defined, it is very important to put your PSTN usages in the correct order in your Voice Policies.  When searching for a route, Lync will start at the top of the PSTN usage list and work its way down until it finds a functional route that matches the dialed number.  If the selected route is not available because the gateway is down or can't accept any more calls, then Lync will keep searching for a matching, working route.  Order your PSTN usages so that calls will use the cheapest toll options and also provide failover capabilities. 

Imagine you have a 3 site deployment, with offices in Vancouver, Toronto and Budapest, Hungary.  You've setup your usages and routes according to my guide.  Your PSTN usage for the Vancouver site Voice Policy would look something like this:
NA-BC-Vancouver-Local
NA-ON-Toronto-Local

NA-BC-Vancouver-National
NA-ON-Toronto-National

HU-Budapest-Local
HU-Budapest-National
NA-BC-Vancouver-International
NA-ON-Toronto-International
HU-Budapest-International

In this manner, calls will use the least-cost route for any given call, and should the preferred route not be available, the call will use the next cheapest available option.  The most used usages are positioned at the top to reduce call connection time.  Because every phone number is normalized to E.164, it can be easily routed to any gateway, which will then add any necessary routing codes (like 011) before sending it out.  This may take a fair bit of work to setup, especially with a large deployment with several sites, but I think the benefits outweigh the time involved in setting it up.

Of course, with the flexibility provided by Lync, this is just one method of setting up your Enterprise Voice deployment.  If you've got other ideas or methods, I'd love to hear them.

Tuesday, January 4, 2011

Lync Enterprise Voice Best Practices - Normalization

In my last post, I talked about the importance of using E.164 in your internal Active Directory phone list. Assuming you've got that all straightened out, what's next?  Since users won't always be dialing the wonderfully consistent numbers you've provided them in Active Directory, how do you handle all the different methods used for making calls?  You have to normalize them using normalization rules in Lync.

The end-goal for normalization rules is to ensure you pass a properly formatted E.164 phone number to the appropriate gateway, no matter what the user tries to enter. Call routing and additional number manipulation is much easier when you know you're going to be getting a standard format.

You need to think about the ways users typically dial their numbers. Are they used to excluding the 1 for local calls?  Do they dial 7-digit local numbers without the area code for their specific location?  Do they dial internal extensions?  What do they have to dial to make an international call?

You also have to think about how any PBX you might have in your environment sends numbers to Lync?  Is it capable of sending full E.164 formatted phone numbers, or can it only send extensions?

When you have all the answers to those questions, you can start building normalization rules. Normalization rules are built using regular expressions. If you're not familiar with regular expressions, a good place to learn about them is from regular-expressions.info. Thankfully, the Lync Control Panel has a wizard that handles most typical scenarios. You'll only need to understand regular expressions for more advanced needs.


Dial Plans
Normalization rules are assigned to dial plans in Lync. A dial plan is a collection of normalization rules that are assigned to sites, pools or users. You can even assign a dial plan to an individual gateway, which can be handy for inbound number normalization (as described by VOIPNorm here).  You can re-use the same normalization rules in multiple dial plans, so its best to name the rules so they're descriptive, like NorthAmerica-International, CA-ON-Toronto-Local or Italy-National.

Normalization Basics
Let's start with a very basic normalization rule that normalizes a North American 10-digit number to a properly formatted E.164 number:
^(\d{10})$  --> +1$1
A regular expression should start with a ^ which signifies the beginning of the string, and end with a $ which signifies the end. The \d represents a single number, but since its followed by 10 in curly brackets, it means 10 numbers. A matched number within the round brackets is accessible as a variable: $1.  If you have more than one set of brackets, then each bracket set is represented by $1, $2$3 etc.  You don't have to do anything special to make sure things like dashes, brackets and periods are excluded from the regular expression.  Lync handles that internally.

The right side of the arrow shows the normalized form. Start with +1 and insert the digits represented by the variable $1.  The normalized form does not follow regular expression rules (for instance, to represent a + sign, you'd normally have to precede it with a backslash \).

So, if someone dials 4163334444, the rule ^(\d{10})$ is matched, since its a 10-digit number.  The normalization rule simply sticks a +1 in front, so we get the E.164 formatted number +14163334444.

Advanced Normalization
In my deployments, I've taken that rule and expanded it somewhat to catch a wide variety of scenarios. Have a look at this:
^1?([2-9]\d\d[2-9]\d{6})(\s*\S*)*$ --> +1$1
A bit more complicated, but I'll explain. Since some users will actually enter the 1 when typing a phone number, I want to make sure it falls under this rule, so the 1? is added to the front.  The ? means the preceding number can be either present or not for a match. The [2-9] means "match any single digit between 2-9".  Then there are two single digits, represented by \d\d. Together, this indicates the area code, which can be any number from 200-999. The [2-9]\d{6} represents the local number which is 7 digits long but has to start with 2-9.  The (\s*\S*)* simply means "anything".  This is handy for accepting phone numbers from users' Outlook contacts which could have some phone numbers with oddly formatted extensions at the end of the number, like "ext 443 or "x443". The expression will drop the extension from the number.

The end result is a nicely formatted E.164 phone number. If the user enters "14165551111" or "4165551111" or "4165551111 extension number 42" (from Outlook for instance), it will be normalized as +14165551111.

Incidentally, my post on Normalizing Outlook Contact Phone Numbers includes a very handy script that will clean up users' personal Outlook contacts and ensure that every number is formatted for E.164.

International Normalization
For international numbers, you want to ensure users have to dial their usual international routing code (like 00 or 011) to make sure they really want to dial an international number.  If you stick with pure E.164 dialling, you could dial internationally when you meant to dial locally.  If you were to try to dial a Vancouver number by dialing 6046901111, you wouldn't want it to be routed to Penang, Malaysia by accident (60 is Malaysia's country code, and 46 is the city code for Penang).  In this case, you want your users to dial 011 (or whatever) before they enter an international number.  This rule takes care of that:
^011(\d{7,})$ --> +$1
So, with the first rule described earlier, when a user dials 6046901111, the number is normalized to +16046901111.  If they meant to dial Penang, Malaysia, they'd have to dial 0116046901111, which would normalize to +6046901111.

7-Digit Normalization
If your users are used to dialing 7-digit numbers for local calls AND your 7-digit dialing area includes only a single area code, you can create a normalization rule that goes something like this:
^([2-9]\d{6})$ --> +1613$1
So, if a user dials 2224444, the number will be normalized to +16132224444.

The preceding example works great for smaller sites that can only do 7-digit local dialing to a single area code. However, there are numerous sites that allow 7-digit dialling that encompass multiple area codes, such as Kansas City, MO (816 and 913). Using Kansas City as an example, you can’t simply do a blanket 7-digit to 11-digit normalization for the entire area code, because you won’t know if the 7-digit number is supposed to be expanded to 816 or 913. For instance, if a user dials 204-1111, it should be normalized to +18162041111, but if they dial 205-1111 it should be normalized to +19132051111.

Once again, the Dialing Rule Optimizer gallops in for the rescue! A new option will create the necessary normalization rules for special cases such as Kansas City, MO, so that you can dial 7-digit numbers with confidence.
A very special thanks to Henry Creagh who brought the multi-area code 7-digit dialing issue to my attention and helped test the solution.

Internal Extensions
For internal extensions, things get a bit more interesting. Your users may expect to be able to dial internal extensions directly.  If all your company's internal extensions map directly and consistently to external phone numbers (DIDs), then you'll be laughing.  For example, if your 4-digit extensions that start with 7 all map to DIDs that are in the +14162227xxx range, then your rule will look like this:
^(7\d{3}) --> +1416222$1
If your internal extensions don't have a corresponding DID, then you'll need to do something like this (pretend the main office number is 1 (416) 222-1111):
^(5\d{3}) --> +14162221111;ext=$1
If this is your situation, your users assigned Lync phone numbers will have to be in the same format, of course.  You shouldn't use the user's 4-digit extension as their Lync number.  You should use +14162221111;ext=5000 (for example).

If you're unlucky, your internal extensions and corresponding DIDs might not have anything in common for you to develop a simple set of normalization rules. In that case, you're going to have to either go through the tedious process of developing a large number of normalization rules, or you'll need to tell your users they simply can't use extension dialing anymore. There might be a temporary uprising until they realize they don't need to memorize extensions any more because their frequently called contacts appear in Lync.

If you are routing calls to a PBX that only accepts extensions, it's best to first normalize the extensions to E.164 format (with the ;ext=) and then use a trunk translation rule to revert back to the extension format before sending to the PBX. I will talk about trunk translation rules in a later post.

As a momentary aside, I've been thinking about developing a program that accepts a CSV file with DIDs and corresponding extensions and outputs the Powershell commands to create the appropriate normalization rules. I imagine it would be very helpful in the previous paragraph's scenario. If you think something like that would be useful, please leave a comment in the Comments section.

Putting it all Together
Lastly, you'll need some normalization rules to accept emergency and other non-standard numbers like 411, 611 or 911 (which incidentally is routed automatically if you've defined Location Services properly). If you're not in North America, your rule will be different.
^([2-9]11)$ --> +$1
Once you've got your normalization rules defined, you can assign them to a dial plan.  Since Lync starts at the top of the normalization rule list and works its way down till it finds a match, its best to place your most used rules up top. If a phone number can be matched by more than one rule, put the more restrictive rule first. Your final normalization rules for a simple dial plan might look like this:
NamePatternTranslation
NA-National^1?([2-9]\d\d[2-9]\d{6})(\D+\d+)?$+1$1
NA-International^011(\d{7,})$+$1
7xxx Extensions^(7\d{3})+1416222$1
5xxx Extensions^(5\d{3})+14162221111;ext=$1
NA-ServiceCodes^([2-9]11)$+$1
 
Since everything is normalized to a unique and standardized E.164 phone number, its much easier to modify at the gateway level to comply with local PSTN or PBX requirements. This is accomplished with trunk translation rules, which I will talk about in a later post. 

One last thing to remember is that any number that starts with a + sign is assumed to be already formatted for E.164, and no normalization rules will apply.  It will be dialled as is.  Keep this in mind when formatting phone numbers in Active Directory.

Now that you've got normalization sorted out, its time to handle routing.  My next post will discuss what I think is the best way to route your calls in Lync.

If you've got questions or issues about my methods, please drop me a line in the Comments section.

Monday, December 20, 2010

Lync Enterprise Voice Best Practices - E.164 Formatting

For all the strengths of Lync in the Enterprise Voice department, there doesn't seem to be a lot of practical advice is how to properly design voice routing. Everytime I have to design voice routing for a client, I constantly end up second-guessing myself on the best way to go about it.  Microsoft's assistance in this area has improved since the OCS R2 days, but administrators are still left to their own devices when it comes down to the nitty-gritty details like:
  • Internal phone number formatting and normalization
  • How to best configure routes and PSTN usages
For the first bullet point, administrators can struggle with questions like "What format should I store numbers in Active Directory?", and "How should I normalize phone numbers inputted by users"


For storing numbers in Active Directory, you should save every number in E.164 format.  E.164 is an internationally recognized standard for phone numbers.  The standard is:
+<CountryCode><City/AreaCode><LocalNumber>;ext=<ext>
The country code is 1-3 digits long, while the city/area code and local number length can vary. The ext= portion is usually only used for companies with internal extensions. Public phone numbers in E.164 format look something like this:
+14162223333 for Toronto, Canada
+60321345678 for Kuala Lumpur, Malaysia
The Canada country code (and also for US and a good portion of the Caribbean) is 1, while Malaysia's country code is 60.  The area code for Toronto is 416 (and 905, 647, 289), while Kuala Lumpur's city code is 3.  Local numbers in Canada are 7 digits long, while KL's are 8 digits long (but are 6 or 7 digits long in other parts of Malaysia).

When inputting phone numbers in Active Directory, you can add separators as you see fit for readability. So, +1 (416) 222-3333 is OK, as is +60.3.2134.5678.

Users with internal extensions, and no direct number (DID) should use the ;ext= component. Start with the central number for the office and add the extension, like +19052223333;ext=555.  Don't store the number as just the extension.

Do not add country-specific routing codes for international calls in your Active Directory, like 011 or 00. These routing codes are not part of the E.164 standard. Also, do not exclude the country code from your numbers using the rationale that all your users are in the same city.

If you don't use E.164, you're likely going to have issues.  One real-world example is a Canadian company that stored their international numbers with 011 at the start (the international routing code for Canada). While it made clicking-to-dial from Communicator/Lync easier, it meant that users from other countries that used different international routing codes couldn't dial the number without throwing an error.

Another North American company had a PSTN carrier that required that local calls not include the long distance code 1. Since all their Enterprise Voice users were located in one city, they felt it was easiest to just not include the 1 in all their Active Directory users phone properties.  Once they expanded Enterprise Voice to other locations in another province, they found that the new users couldn't dial the original users due to the lack of a leading 1 (which is required for long distance calls in North America).

Even if you never plan on expanding to a different city or country, it's important to stick with E.164 formatting. If you federate with another company and publish your phone numbers, its entirely likely they won't be able to click-to-dial if you don't use E.164 phone numbers, simply because the other company can't anticipate whatever internal numbering scheme you came up with.

When you can assume that every incoming phone number will be formatted consistently, its relatively trivial to create trunk translation rules to add any required routing digits such as 011 for international calls, or removing the 1 for local calls before passing the call to the PSTN or next gateway.

"But wait!" you say.  "I have to remove the 1 for local calls and the list of local numbers is way too long to work with. How do I go about getting over that hurdle?" Simple! Use the Lync Dialing Rule Optimizer as discussed in Dialing Rule Optimizer for E.164 Phone Numbers and Least Cost Routing in Lync.

If you don't want to go through the hassle of fixing your internal phone numbers in Active Directory, I suggest using the Company_Phone_Number_Normalization_Rules.txt.  This file is filled with regular expressions that will convert any invalid phone numbers found in Active Directory to properly formatted E.164 numbers during the address book generation phase. You have to create the rules yourself based on your requirements, but there is lots of help out there to get you started (plus there are samples in the Sample_Company_Phone_Number_Normalization_Rules.txt).  You can find it in C:\Program Files\Microsoft Lync Server 2010\Web Components\Address Book Files\Files.  For a good overview of the Company_Phone_Number_Normalization_Rules.txt, see Jeff Schertz's blog entry on the topic.

At pretty much every deployment I ever do, I start with these basic normalization rules in the Company_Phone_Number_Normalization_Rules.txt file, which tends to capture many styles of AD phone numbers:
\+?1(\d{10})+1$1
\+?1(\d{10})\D+(\d+)+1$1;ext=$2
\+?(\d{6,14})+$1 
\+?(\d{6,14})\D+(\d+)+$1;ext=$2


If you stick with E.164 from the start, you will avoid the potential for dialing issues down the road.

My next post will discuss how to handle phone number normalization in Lync.  After that, I'll discuss route building.

For another great post on this topic (relating to OCS, but still very applicable to Lync), see this post on Doug's DTMF blog.

Tuesday, December 14, 2010

Finally! Exchange 2010 OWA Redirect Bug Fixed!

Ever since the release of Exchange 2010 SP1, there have been numerous reports of users being prompted that they have to be redirected to another server, instead of the silent redirect that had worked like a charm until SP1.  I blogged about this in September after I experienced the issue for myself.  Since then, it's been one of the most-read pages on my blog.

I've just received word that the issue has finally been fixed in Exchange 2010 SP1 Rollup 2.  This KB article describes the issue and the confirmation that it's been fixed by RU2.

You can get Rollup 2 here.

Thursday, November 25, 2010

"Optimized for Lync" Devices

Over the years, I've used any number of devices to connect to Communicator/Lync.  I've used everything from cheap-o $20 headsets to some high-end OCS-specific phones. For the most part, these devices have worked out OK.  Some required a bit of fiddling to make work right, while others just worked with no fuss or bother. I've had headsets that make themselves the primary communications device without asking and not relinquish this to the previous primary device after unplugging it, which was a headache in Communicator. Others just worked and didn't bring much attention to itself, which is really the ultimate goal, isn't it?

My absolute go-to office audio device for the past few years has been the Plantronics Savi Office Convertible headset. It connects to both my PC and my PSTN desk phone and works like a charm.  It's a very good desktop headset solution.  With DECT 6.0 wireless, I can wander a good distance from my house and still maintain a good connection. The sound quality is excellent.  I do have a few gripes with it, though.  I can't use the over-the-ear earpiece because of my apparently oddly-shaped ears (earbuds NEVER fit me). I have to resort to the over-the-head headset. Plus, the earpiece bothers my ear after wearing it for an extended period.  Another minor issue is the lack of wind cancellation technology. In the summertime, I like to work outside on my patio in the "office hammock".  The slightest breeze gets picked up by the headset and annoys the person on the other end (maybe they were upset because I was working from a hammock and they weren't). Granted, the Savi Office isn't meant for use outdoors, so I can't really knock it for that.  Overall, its been the one thing I keep using out of my pile of headsets.
My summer office. Beer fridge well out of reach.
For my cell phone, I've been using the BlueAnt Z9i. It's a Bluetooth headset that works with both mobile phones and PCs. I've got it paired with both my laptop and mobile phone. It's extraordinarily tiny and unobtrusive. For mobile use, it's excellent.  Great volume and voice isolation. However, I found it lacking when I used it with Communicator/Lync on my laptop. It sounded fine for use with PSTN or mobile communications, but the sound quality just didn't match up to the higher fidelity of Communicator/Lync's wideband audio. Sure, it was primarily designed for mobile use, but I never used it much for Communicator/Lync because of the lack of wideband audio.

I recently became fortunate enough to gain possession of a good variety of Plantronics devices to showcase at a presentation I'll be doing on Lync.  I have the Calisto 540 desk phone, the Calisto 420 speakerphone, the Voyager PRO UC, the Savi 430 and the Blackwire 420. The one thing all these devices have in common is they are all optimized for Communicator/Lync.
Installing and using all these devices is as simple as plugging it into an available USB port. To have a little fun, I decided to see what it would be like to install all the devices and see how Lync handles it. Windows 7 x64 picked up and installed the required drivers for all without asking for input. Lync detected each of them and named them appropriately. Selecting which device to use was very simple.  I could easily select a default device for all my calls and switch between them seamlessly while on a call.  Lync even gave a specific speakerphone-like icon to the Calisto 420 speakerphone.

A few quick notes on each device:
  • The Blackwire 420 is a very comfortable, nice-sounding binaural USB-corded headset with integrated volume, mute and call pickup/hangup buttons. It folds flat into a little carrying case, making it ideal for travel. This replaces my old Plantronics one-ear headset, which didn't really travel all that well.
  • the Calisto 420 speakerphone really just a speaker with 360-degree microphone that will fit in your hand. Its perfect for ad-hoc conference calls and is fairly portable.
  • The Voyager PRO UC is replacing my BlueAnt. It fits over-the-ear, connects to my mobile phone and my PC at the same time, has great wideband audio quality for Lync calls and is super-comfortable to wear (and doesn't fall out of my good-for-nothing ears). As for how it deals with extraneous noise, like wind on the hammock, I can't tell yet. It's November, and definitely not hammock weather in these parts. My only wish is that it were DECT 6.0 so I could wander far away from my PC, as I tend to do while on long conference calls. It charges via a USB cable only, so while its not great if you're in the office, its fine if you're on the road....which this is meant for.
  • The Savi 430 has the same form-factor as the Voyager PRO UC, but it doesn't do Bluetooth. It does have DECT 6.0 for my wanderings and a nice desk charger, just like the Savi Office. Now if I could take the DECT 6.0 and the desk charger option of this headset and the Bluetooth capabilities of the Voyager PRO UC and mash them together, then that product would be the absolute perfect headset for all my needs.
  • Last but definitely not least is the Calisto 540 desk phone. It's a perfect, inexpensive deskphone for people who still want a standard phone experience. It connects via USB to your computer and is driven by Lync (it won't work on its own like other more expensive phones). You can use it like a regular deskphone, or you can use Lync to dial, answer, hang up etc. This phone has the capability to really make a strong showing in the corporate world. It's simple, inexpensive, doesn't require its own power supply or network connection, and still provides users with a rich Lync experience.
My troublefree experience with all these devices has shown me what the whole "Optimized for Lync" thing means when it comes to devices.  I used to think it merely meant it would do wideband audio. I now realize it also means trouble-free installation and use, which is more than I can say for some of the non-Lync optimized headsets I've tried.

Plantronics really has done a great job with their Optimized for Lync line of products. In my opinion, they are the ones to beat in this segment of the market. Whether or not you choose Plantronics devices for your company or yourself, I believe that any device you pick should have the Optimized for Lync logo on it. Doing so might cost you more than your typical $20 POS, but in the long run it will pay for itself in ease-of-use, better performance, reduced helpdesk calls, and lower frustration levels.


In case of lawyers, please note that the opinions presented here are mine alone and are not representative of my employer or any other vendor, Plantronics included.

Friday, November 19, 2010

Response Group Changes in Lync

The Response Group Service (RGS) is a basic hunt group/interactive voice response system included with OCS/Lync.  While it doesn't have the features of a full-fledged call center application, it is still extremely handy for a lot of companies that don't require (or want to pay for) a separate solution. 

Response Groups in Lync haven't changed significantly since the OCS R2 days. You still have to create and manage the hunt group/IVR workflow via a web-based console that is separate from the main Lync Control Panel.  There is a Workflow tab within the Response Groups section of the Control Panel, but clicking on the Create or edit a workflow button will open up a separate IE window where you manage workflows. The interface is very similar to the OCS R2 version. Why they couldn't port the webpage into the Silverlight Control Panel is beyond me. It couldn't be that difficult to translate.