Archive for September, 2018

Set-CsFeatures.ps1 – Now With Support for Skype for Business Server 2019 and Windows Server 2019!

September 17th, 2018 7 comments


I’m happy to reach another major milestone for the Set-CsFeatures.ps1 script today, after many weeks of work. This PowerShell script, which installs prerequisites and post installation configuration and tools for Lync Server and Skype for Business Server, now adds support for a few new things. This includes a new version of Skype for Business Server, as well as another operating system. The major changes are listed below. See the full list of changes in the changelog (link at the bottom of this article). Having said all of that, let’s look at all the exciting stuff…

Support for Skype for Business 2019

The script will now install the prerequisites for Skype for Business Server 2019 roles, including front-end, mediation, and edge. “But Pat”, you say – “Skype for Business 2019 isn’t even out yet”. This is true. This script adds the support so that you can hit the ground running when the RTM version is released. If you’re already playing with the Preview version in your lab, this will work there as well. Since Skype for Business Server 2019 has more features related to Office 365, including Skype for Business hybrid and online, and Microsoft Teams, rest assured that I’ll be adding more options and features to support and utilize those.

Support for Windows Server 2019

Now supported by this script are the prerequisites for Windows Server 2019 when installing Skype for Business Server 2019. What what what? That’s right, I support a not-yet released version of Skype for Business on a not-yet released operating system. Crazy? Yep. But some individuals and organizations are already working with this combination, and I wanted to provide a solution that makes life easier for them. Rest assured that as the SfB 2019 and WS2019 solutions evolve, so will this script. Version 5.0 of this script was tested against build 17744.r5 of Windows Server 2019.

Optimized code

As I’ve said before, I don’t consider myself a developer. I’m merely a coder that manages to make things work. As my skills increase, I always try to revisit existing scripts and enhance them with better ways of accomplishing tasks. Some of that is from methods available in newer versions of PowerShell, and some are just in the discovery of better avenues of approach to tasks. There are a LOT of changes in the script to reflect that. If I had to guess, I’d say at least 1000 lines of code have been touched just in the past few weeks.

Skype for Business 2019 Control Panel. Click to view full size.

Enhanced logging

While I realize most people probably never look at the resulting log files generated from this script, they can be key in knowing what’s happened on a server as well as being able to review for troubleshooting in the event of an issue. I think I’ve built and provisioned more servers in my lab to test changes in logging than anything else. There is also the built-in ‘tail’ function that allows you to watch the log file in real-time to see what’s going on ‘under the hood’.

Set-CsFeatures.ps1 log file. Click to view full size.

Latest updates for key components

There are updates for some components that have been released recently. This includes the latest cumulative update for Office Online Server, and an update for Windows Server 2012 R2 that replaces a previously required hotfix for Skype for Business Server 2015.

Feature requests

Sometimes, someone suggests a feature or alternative option to something. This version is no different, incorporating some ideas presented by the community. A few are “why didn’t I think of that” type features. An example is popping up a folder browse dialog box if the script can’t find the Windows source files, instead of just throwing an error. Please continue to send feature requests!


Yeah, bugs happen. As much as I test, some people still find things, although most are just minor things like typos, or features that work differently than what someone expected or wanted. And some are ones I notice that haven’t been reported by anyone else. These pop up either in my lab testing or when I’m working on an unrelated part of the code and just notice it.

More than 8500 lines of PowerShell code mean that the script is fairly complex. Perfect? Hell no. As I mentioned above, I’m a coder. I will say that I ferociously attack known/reported issues and feature requests, and strive to make this tool as best as it can be. While I can’t test every possible combination of environments, I think I’ve accounted for a lot of possibilities.

I sincerely appreciate when people notify me of issues. Seriously. There is an option, 96, in the script that shows you how to report a bug, including what log file to send me. That really helps me address problems quicker.


Future additions currently under consideration include at least the following:

  1. Automatically add Windows Defender exceptions (auto discovery). This feature will discover an existing Skype for Business Server 2015/2019 installation, and automatically add the required anti-virus exceptions required for Windows Defender for a healthy operating Skype for Business deployment. Since both Windows Server 2016 and 2019 include Defender components, it makes sense to include this. These exceptions are based on the official exclusion list provided by Microsoft.
  2. Debugging tools, resource kit, etc. If/when these are added for Skype for Business Server 2019, the script will be updated to support the automated installation of them.
  3. Visual C++ 2017

So, with all of this newfound goodness baked into the script, where can one download this pot of gold? Head over to the home page for the script to grab this, or any version of it. The script fully supports using Get-Help for related information. All versions including this new v5.0, are signed with my Digicert code-signing certificate to verify authenticity. Digicert really makes it easy to use certificates, and they have stellar support, too. Also, any recent version of this script will notify you of an updated version when you run it (assuming it’s run on an Internet connected machine).

The changelog for the script shows all of the changes for each new version. Any bug fixes, feature additions & updates are reflected here.


I’ve never been one to really solicit donations for my work. My offerings are created because *I* need to solve a problem, and once I do, it makes sense to offer the results of my work to the public. I mean, let’s face it: I can’t be the only one with that particular issue, right? Quite often, to my surprise, I’m asked why I don’t have a “donate” button so people can donate a few bucks. I’ve never really put much thought into it. But those inquiries are coming more often now, so I’m yielding to them. If you’d like to donate, you can send a few bucks via PayPal at Money collected from that will go to the costs of my website (hosting and domain names), as well as to my home lab.