Posts Tagged ‘Lync Server 2010’

Script: Get-CsFederatedConversationDetails.ps1 – See Stats About Conversations With Specific Federated Domains

May 13, 2014 9 comments

Lync 2013 logo 128x128Description

Richard Schwendiman, PFE at Microsoft, came up with a great SQL query that you could plug into SQL Server Management Studio to see time & date info for conversations with federated or PIC domains. In Richard’s case, he used the PIC domain. Since PIC federation with AOL and Yahoo is ending next month, I thought this was great timing on Richard’s part. But sometimes, Lync admins can’t login to SQL servers to run queries due to security policy. Plus, the query is something you’d have to keep handy and edit accordingly each time you wanted to get data. So I figured – hey, why not whip up a quick script to allow an admin to query SQL for this data, allowing for any domain and time frame to be specified? Poof – out comes my script.

This script will query a specific SQL server for information about a specific federated SIP domain. The domain does NOT need to be in the allowed domains list if you’re open federating. Any SIP domain name works. You can specify a start date/time in the yyyy-MM-dd format, such as 2014-05-13 using the -TimeSpan parameter. Or, you can use some handy ranges I’ve included, including LastWeek (the last 7 days), Last30Days, Last year (last 365 days), FirstOfYear or ThisYear (since Jan. 1), FirstOfMonth or ThisMonth (since the 1st of the month), FirstOfWeek or ThisWeek (since Sunday). Optionally, you can specify an end date/time in the yyyy-MM-dd format. This script will default to FirstOfYear with no end date, and for the domain. As we see below, only the SQL server holding the LcsCDR database is queried.


Now, from this output, we see that there is not a lot of communications with people on AOL since the first of the year. The upcoming change should have very little impact.

If you’re using a named instance in SQL, you can specify it as well.

The script outputs a full object, just like other cmdlets, so you can pipe it to other commands to alter the display, including sorting, or my favorite, Out-GridView, as well as outputting to files such as .csv.

Hopefully, this tool will make life a little easier in digging out data.


Get-CsFederatedConversationDetails.ps1 [[-SqlServer] ] [[-SqlInstance] ] [[-SipDomain] ] [[-TimeSpan] <object>] [[-EndDate] <object>] [-WhatIf ] [-Confirm ] [<commonparameters>]</commonparameters></object>


Execution Policy: Third-party PowerShell scripts may require that the PowerShell Execution Policy be set to either AllSigned, RemoteSigned, or Unrestricted. The default is Restricted, which prevents scripts – even code signed scripts – from running. For more information about setting your Execution Policy, see Using the Set-ExecutionPolicy Cmdlet.




v1.0 – 05-13-2014 –


See the changelog for information on what’s changed/included in each version.


Changelog: Get-CsFederatedConversationDetails.ps1

This is the changelog page for Get-CsFederatedConversationDetails.ps1. You will find a complete list of released versions, their dates, and the features and issues addressed in each. Please refer to the script’s main page for more information including download links, installation details, and more.

v1.0 – 05-13-2014

  1. Initial version

Script: Get-CsUpdateVersion.ps1 – See the Cumulative Update Level Of All Lync Servers

May 2, 2014 14 comments


My work at Modality Systems often has me doing health checks for customer Lync environments. These can be due to customer requests, or as part of our onboarding for new managed support customers. If you’ve ever had an Active Directory Risk Assessment Program (ADRAP) or Exchange Risk Assessment Program (ExRAP), it’s quite similar. Lots of tasks to run, lots of data to sift through. So it’s always beneficial to standardize and automate the steps to get the data. The same is the case when you’re responsible for your own environment and want to ensure good health.

Just like Get-CsDatabaseUpdateStatus.ps1, Dave Howe from the Lync product group and I teamed up to automate something. In this case, it’s looking at what Cumulative Updates are installed on each server throughout a Lync environment. This script queries each pool, then finds what servers are part of that pool, and queries each server to find the CU that’s installed. It then provides an easy to read output of the entire environment (with exceptions) for easy review. As shown below, we see three multi-server pools, the version number and “friendly” Cumulative Update info.


The script works fine with Standard Edition servers as well:


In the first example, you see that the first two servers show “PSRemoting failure”. This is because the script uses PowerShell Remoting to connect to each remote server to query information (see installation notes below). PSRemoting doesn’t really work the same when dealing with non-domain joined machines, such as the first two, which are edge servers. So the script isn’t able to communicate with them via PSRemoting, and flags them. If the script can’t ping a server, it will show as “offline”. The friendly name of the CU shown is coded in the script. So I’ll update it each time a new CU is released.

By default, the script checks all pools. But you can specify a single pool by using the -PoolFqdn parameter.


Get-CsUpdateVersion.ps1 [[-PoolFqdn] ] [-WhatIf] [-Confirm] []


This script uses PowerShell Remoting to query remote servers. PSRemoting is enabled by default on Windows Server 2012 and later, but disabled by default on 2008 R2. To enable PSRemoting on 2008 R2 servers, see Enable-PSRemoting.

Execution Policy: Third-party PowerShell scripts may require that the PowerShell Execution Policy be set to either AllSigned, RemoteSigned, or Unrestricted. The default is Restricted, which prevents scripts – even code signed scripts – from running. For more information about setting your Execution Policy, see Using the Set-ExecutionPolicy Cmdlet.




v1.4 – 09-24-2014 –

v1.3 – 09-02-2014 –

v1.2 – 08-07-2014 – Get-CsUpdateVersion.v1.2,zip

v1.1 – 06-02-2014 –

v1.0 – 05-02-2014 –


See the changelog for information on what’s changed/included in each version.

Changelog: Get-CsUpdateVersion.ps1

This is the changelog page for Get-CsUpdateVersion.ps1. You will find a complete list of released versions, their dates, and the features and issues addressed in each. Please refer to the script’s main page for more information including download links, installation details, and more.

v1.4 – 09-24-2014

  1. Added Lync Server 2013 CU6

v1.3 – 09-02-2014

  1. Added Lync Server 2010 CU12

v1.2 – 08-07-2014

  1. Added script check for updates. This is key because each time a new cumulative update comes out, the script will be updated with version info
  2. Added some preliminary code around getting version info for OWAS servers. Need to find a graceful way of getting the server names in a OWAS farm.
  3. Added Lync Server 2013 CU5

v1.1 – 06-02-2014

  1. Tweaked the PSRemoting code block for retrieving version numbers per Chris Irons. This should resolve unexpected results when querying Lync Server 2010 pools.
  2. Filtered out “Debugging Tools” “Resource Kit Tools” “Best Practices Analyzer” and “Meeting Room Portal” which could have a higher version number and cause incorrect results – thanks to Andy G for pointing that out.
  3. Shortened some of the output text to reduce the likelihood of word wrap.

v1.0 – 05-02-2014

  1. Initial version

Syntax Highlighting File for UltraEdit Includes Exchange 2010/2013, Lync 2010/2013, and ActiveDirectory cmdlets

May 8, 2013 3 comments

In a previous post, Exchange 2010 and Lync 2010 PowerShell syntax highlighting file for UltraEdit, I included the cmdlets for both Exchange 2010 and Lync 2010. In this new file, I’ve included Lync 2010, Lync 2013, Exchange 2010, Exchange 2013, and Active Directory cmdlets for highlighting. If you use UltraEdit, this wordfile may make life a little easier.

Download the file here:

ASP.NET Errors After Installing Lync Cumulative Update

October 24, 2012 2 comments

Here’s a little bit of fun I had while trying to find out who would be playing my beloved Detroit Tigers in the World Series. I needed to update our Lync servers, so installation of the October 2012 Cumulative Update was in order.

As soon as the Cumulative Update was done installing on one of our front end servers, SCOM started throwing alerts every 30 seconds. Essentially, they looked like this:

Oct 20 13:13:56 cltlb01 l4d: VS Lync External HTTPS meetContosoCom) Taken out of service due to failed Real Servers

Looking at the servers, the first front end server wasn’t reporting any issues. But the second was flooded with these in the application log:

Event log entry

Event log entry

Every time the HLB tried to do the health check, another ASP.NET exception would show up in the event log. We checked the HLB config, and it was properly set to connect to https://*/meet/blank.html for its deep health check. This is important because if you have it set to just check /meet or https://*meet/, I’ve seen this identical problem pop up. I verified that the file was at the correct location (C:\Program Files\Microsoft Lync Server 2010\Web Components\Join Launcher\Int), and that I could open it in IE. The file didn’t have a recent modified date. So, we changed the health check just to do a TCP bind to the server, and the problem went away. HLB was happy, and ASP.NET alerts stopped in the event log. Synthetic tests came back fine. Back to the baseball game, I figured.

Fast forward to Monday morning, when two users simultaneously contacted me to say that they were attempting to join a scheduled Lync meeting and getting the below error. Not the same meeting – two separate meetings.

Meeting join error

Meeting join error

They sent me the links, and I was able to successfully join both meetings, but I’m homed on a different server than those two users. The plot thickens.

I looked at the front end servers again, and sure enough, whenever someone would try to join either of those meetings, that trouble server would throw an ASP.NET error again. It wasn’t as fixed as I hoped.

I drained the server using Stop-CsWindowsService -Graceful, then stopped IIS using net stop w3svc. I navigated to C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 and ran aspnet_regiis.exe -i. I restarted the server, and suddenly the problem was gone. Everyone was able to join their meetings, and the server no longer was throwing ASP.NET errors. We changed the health check back to looking at /meet/blank.html, and all was good.

October 2012 Updates Released for Lync Server 2010

October 11, 2012 1 comment

The Lync team has released the October 2012 updates for Lync Server 2010 and related products. Here are some of the details:

2493736 Updates for Lync Server 2010


  1. 2735313 No notification of an incoming file transfer when you minimize a Lync 2010 conversation window
  2. 2735319 A user name that is included in a Lync Online meeting URL is incorrect when delegate is configured
  3. 2735321 “Block all” setting of the global file transfer filter does not work in Lync Server 2010
  4. 2735323 A call to an UCMA 3.0 endpoint is disconnected after 30 minutes


Lync Server 2010

  1. 2670358 Description of the cumulative update for Lync Server 2010, Administrative Tools: February 2012
  2. 2740403 Description of the cumulative update for Lync Server 2010, Core Components: October 2012
  3. 2701659 Description of the cumulative update for Lync Server 2010, Conferencing Attendant: June 2012
  4. 2514978 Description of the cumulative update for Lync Server 2010, Conferencing Server: November 2011
  5. 2737902 Description of the cumulative update for Lync Server 2010, Web Components Server: October 2012
  6. 2737915 Description of the cumulative update for Lync Server 2010: October 2012
  7. 2708616 Description of the cumulative update for Lync Server 2010, Web Conferencing Server: June 2012
  8. 2640253 Description of the cumulative update for Lync Server 2010, Mediation Server: November 2011
  9. 2740406 Description of the cumulative update for Lync Server 2010, Unified Communications Managed API 3.0 Runtime: October 2012
  10. 2650037 Description of the update for Lync Server 2010 Bandwidth Policy Service: December 2011
  11. 2743736 Description of the cumulative update for Lync Server 2010, Mobility Service: October 2012

Use the cumulative update installer, called LyncServerUpdateInstaller.exe to view and install the needed updates. That update can be downloaded here.


  1. 2737155 Cumulative Updates for Lync 2010
  2. 2752160 Cumulative Updates for Lync 2010 Attendee – Administrator level installation
  3. 2752157 Cumulative Updates for Lync 2010 Attendee – User level installation

Phone Edition

No updates listed

For information on updating Lync Phone Edition devices, see Jeff Schertz’s article Updating Lync Phone Edition Devices, as well as my script New-CsFirmware.ps1

Group Chat

No updates listed


Note: Pay close attention to the installation notes listed on the summary page. They include manual tasks that must be followed after installing the updates on Lync servers.

Review: Lync BusyLight by Kuando

September 24, 2012 Leave a comment

I’m sure you’ve had this happen. You’re sitting at your desk, deep in thought on a serious issue, and someone walks into your area and just starts talking. You don’t want to be rude and ignore them, and you really need to restrain from your desire to strangle them for causing that great troubleshooting thought to leave you head. If only they could see your Lync presence and know that you’re in Do Not Disturb. Well, now they can!

Lync BusyLight Introducing the BusyLight for Microsoft Lync from Kuando. This slick little device has a multicolored light on the top, and indicates your Lync presence using one of four colors. It does this via a USB connection and a simple little application that runs in the system tray. Available? The unit glows green. Do Not Disturb? Deep red should keep people away. And, of course, the normal green for available and yellow for away.

Also built into the unit is a call alert feature that blinks blue to indicate an incoming Lync call, and a small speaker with customizable ring tones.

The unit is adjustable for angle and can be attached to a wall or cabinet with the included velcro fastener.

I’ve had mine for several months now, and everyone in my house knows that while my home office door may be open, all hail the BusyLight before interrupting. I’ve taken it to client sites, too. In my current cube farm, my cube is a considerable distance from my team mates. So I placed it on top of my cube partition, and they can see it before making their way towards my cube.

The unit works great, but there is a little issue that it causes. The “what’s that?” issue. People who come up to my cube, point at it, and wonder what it does. So I take my time to explain what it is and what’s it purpose is. I even made a little sign with a little blurb about the device, complete with color coded indicators.



This is a neat little unit that has really helped me stay focused and uninterrupted. The only problem I’ve had with the unit is that over distance, the colors can be a bit washed out. The red for busy and the deep red for Do Not Disturb are a little too close together. And the “available” green fades a little towards the yellow of “away”. The only other suggestion I’d make is that the USB cord be a little longer. But that’s just my personal preference.

The BusyLight works with Windows XP SP3, Vista, and 7. A Windows 8 driver will be available soon. It is available from many resellers for about $49.00 USD.

Categories: Lync Server Tags: ,

Review: Jabra UC 250 MS Headset – Great Lync Travelling Headset

September 17, 2012 Leave a comment

Do you do a lot of travel and need to stay connected via Lync or Skype? The Jabra UC 250 MS headset is a nice addition to the travelling arsenal. The “MS” designation is for Microsoft Lync. It’s a simple mono over-the-ear design with an unobtrusive microphone and USB cable. The cable includes one of the better control units I’ve seen. Many control units have a basic mute switch that just cuts the audio to the computer. The UC 250 MS control unit has a button that mutes the Lync client. So, not only can you unmute from the control unit, but you can unmute from the client as well. Very nice, as I’m sure most people who use the typical mute option on a headset find themselves scrambling to unmute in a hurry. The mute button has a nice bright red LED to indicate the headset is muted. It also has your typical volume controls, and  a handy on/off hook button. The device is supported by the Jabra  PC Suite software. The UC 250 MS comes with a taco shaped zippered case for storage. It’s available online in the $40 range.

Jabra UC Voice 250 headset

Jabra UC Voice 250 headset

DSP Digital Signal Processing yields great sound in applications such as Lync or Skype. Recipients have reported that my voice was clear and accurate, and didn’t have that typical cheap headset sound. The cord is long enough for my use, but was a bit stiff for me. I didn’t need to use the PC Suite software, so I can’t comment on it here. One thing I did notice is it was a tad cumbersome to get it on my ear. But once it was on, it stayed in place, and the gel style insert was comfortable even for longer calls. My laptop quickly found the headset and had the drivers installed without issue. A simple selection change in Lync and I was off and running.

I’ve used the headset for many calls and can say it’s a great headset for its price point. Simple, inexpensive, and it works. It doesn’t hurt that it takes up hardly any room for storage. If you’re looking for something to toss in your backpack or use at your desk, check out the Jabra UC 250 Voice MS.

Categories: Lync Server Tags: ,

Script: Grant-CsPolicyByADGroup.ps1 – Assign Lync Policies to Users According to AD Group

September 10, 2012 11 comments

Lync 2013 logo 128x128This idea is from a LinkedIn post that I responded to. The original poster wanted to know if there was a way to manage Lync external access policies based on AD group membership. Absolutely!

This is a fairly simple script that uses a scheduled task that runs every 4 hours, looks at the members of a given AD security group, including nested groups, and applies a Lync policy to each member. The name of the AD security group and the type and name of the policy are all configurable. The ActiveDirectory and Lync PowerShell modules are used to complete this. The actual moving parts are pretty simple – really just two lines of code. But some extra error catching, installation code, and safeguards make it a tad bigger.

Caveat – users get policies when they launch the Lync client. So even though a policy might be assigned to a user, they won’t see any change until the client is restarted.

Caveat #2 – if you configure this script with several scheduled tasks to handle different policies and different AD groups, make sure users don’t end up in multiple groups, or you could have unintended results. Also removing a user from a group does NOT revert their policy back. The reason I didn’t add that is because moving a user from one group to another could cause problems if the script set them back to a default policy, yet another group needed to change it to a different policy.


Execution Policy: Third-party PowerShell scripts may require that the PowerShell Execution Policy be set to either AllSigned, RemoteSigned, or Unrestricted. The default is Restricted, which prevents scripts – even code signed scripts – from running. For more information about setting your Execution Policy, see Using the Set-ExecutionPolicy Cmdlet.

Download the script from the DOWNLOAD section below. Open it in your favorite text editor.

Find the line that reads

[string]$GroupDN = "",

and put the Distinguished Name of the group in between the quotes. For example

[string]$GroupDN = "CN=Lync Policy Group,DC=contoso,DC=com",

Next, define the policy that will be granted to members of the group. Find the line that reads

[string]$PolicyName = "",

and put the name of the Lync policy in between those quotes, such as

[string]$PolicyName = "Executives External Access Policy",

The last thing we need to do in the script file is define what KIND of policy we’re going to grant.

Find the line that reads

[string]$PolicyType = "ExternalAccess",

And adjust accordingly. The allowed values are Archiving,Client,ClientVersion,Conferencing,ExternalAccess,HostedVoicemail,Location,Mobility,Pin,Presence,Voice to represent the various types of policies you can apply to a user. The default is ExtnerAccess.

Next, ensure that the server where the script will run has both the ActiveDirectory and Lync PowerShell modules installed. Domain controllers typically have the ActiveDirectory module, and Lync servers have the Lync module. Install the appropriate ones using these steps.

To install the ActiveDirectory module, open PowerShell and type the following:

Import-Module ServerManager
Add-WindowsFeature -name AD-Domain-Services –IncludeManagementTools

To install the Lync Server Management Tools, which includes the PowerShell module, install the core components. See Install Lync Server Administrative Tools for details.

This will ensure that both modules are available. The ActiveDirectory module is used to get the members of the AD security group, and the Lync module is used to actually grant the policy.

The script must run as a member of the CsUserAdministrator or CsAdministrator groups, as those have the rights to assign policies.

Next, open PowerShell and run the script with the -install switch. The script will prompt for the password of the currently logged on user, and then create the scheduled task to run the script every 4 hours.

Grant-CsPolicyByADGroup.ps1 -install

The scheduled task will run every 4 hours, with a start time of when you ran the -install option. You can open the scheduled task in Task Manager and adjust as needed.

You can run the script manually as well. Just run


Note that it may take a while before the policy is visible on the user account due to AD replication.


v1.6 – 09-23-2014 –

v1.5 – 02-08-2014 –

v1.4 – 01-27-2014 –

v1.2 – 10-16-2012 –

v1.1 – 09-19-2012 –

v1.0 – 09-10-2012 –


See the changelog for this script for a description of changes with each release.