Thursday, April 30, 2015

Unable to download content from Microsoft download sites using Mozilla Firefox and Google Chrome

For quite some time now, I have noticed that I am no longer able to download any content from a wide variety of Microsoft download sites such as this one for SQL Server 2014 Express when I used Mozilla Firefox or Google Chrome:

This issue eluded me for a very long time until I recently encountered a problem with rendering a website that had mixed SSL and Http content.  Of course, the Firefox Developer Tools pointed me to this article:

Of course, as you can probably guess, all of these Microsoft download sites are presenting Mixed Content!

This completely prevents me from downloading any of the executables from Microsoft's website until they fix/resolve this issue with all of their websites.

That means, for now, I am forced to download whatever I can through MSDN, or fortunately, a browser like Opera provides me with a prompt regarding the Mixed Content and provides me with an option to Unblock the content to be able to download it!

Wednesday, April 29, 2015

Visual Studio 2015 Release Candidate milestone reached!

Visual Studio 2015 has reached the Release Candidate milestone!

You can download the Release Candidate version of Visual Studio 2015 from here:

You can also download the ISO images from MSDN Subscriptions here:

Getting started with Microsoft Deployment Toolkit

If you want to deploy system images to multiple computers, then you will definitely want to familiarize yourself with the Microsoft Deployment Toolkit.

To get started, you will need to install the Microsoft Deployment Toolkit as well as the Windows ADK:

Once you have these tools installed, the next thing you have to do is run the Deployment Workbench.

Before you can do anything else in Deployment Workbench, you will have to start off by creating a Deployment Share.

 Once you have the Deployment Share created, the next thing you need to do is Import an Operating System. 

Once you have the Operating System imported, you can proceed with adding your various applications:

Finally, you have to go ahead and create a Task Sequence.

Once you have completely configured your Task Sequence, you need to Update your Deployment Share:

Now, you will get a Boot image created in the Boot folder of your Deployment Share.

Using this Boot image, you can now boot your target system to begin loading the OS and then prepping the system for an image capture!

Tuesday, April 28, 2015

End of Life for Sitefinity Community Edition

I have been using Sitefinity Community Edition for several years for several of the non-profit organization websites I have been working on, however, when I recently attempted to upgrade one of the websites to Sitefinity v. 8.0, I got an invalid license error message.

Well, after talking to the Sitefinity Sales team, it seems that the Sitefinity Community Edition has been discontinued/abolished!

These are the available editions of Sitefinity now:

  • Small Business Edition
  • Standard Edition
  • Professional Edition
  • Online Marketing Edition
  • Enterprise Edition
Small Business Edition still carries a $499 price tag so I can see many non-profit organizations turning elsewhere for free CMS systems such as Kentico ( or Orchard CMS (

This turn of events is very unfortunate for many non-profit organizations that were previously using Sitefinity as their CMS, but hopefully they will find better free alternatives out there.

As for many of the current non-profit websites I work on today, I am planning on moving/migrating them to Orchard CMS due to their rich theme gallery and Orchard's native support for ASP.NET MVC and Bootstrap.

If you find some great free ASP.NET CMS alternatives to Sitefinity Community Edition, feel free to leave your comments below!

Monday, April 27, 2015

How to determine what TCP/UDP Ports are being used in Windows?

When debugging and troubleshooting Windows applications, one of the common issues that arise is the usage of Network Ports on the machine.

When running multiple applications on a server/computer, you may encounter port conflicts or need to determine if the application is truly listening on a particular port or not.

Fortunately, there are numerous tools to accomplish this:

  1. You can always resort to the command line netstat command (ex: netstat -aon) to determine the processes and their listening pors.
  2. You can use the SysInternals tool TcpView to view the individual names of processes (
  3. You can use the built-in Windows tool ResMon (resmon.exe) and click on the Network tab to view the list of Listening Ports.
  4. You can use a standalone utility such as CurrPorts (

Personally, my favorite amongst all of these methods is by far CurrPorts.  CurrPorts provides an easy way to view Processes and dig into the details of individual processes.  In addition, it offers a filtering capability for processes not offered by any other tool!

Therefore, if you are trying to troubleshoot the network ports your Windows system is operating on, I would highly recommend using CurrPorts!

Saturday, April 25, 2015

Changing the Url for Remote Desktop Services Web Access

I had recently set up an installation of Remote Desktop Services with an RD Session Host as well as RD Web Access with RemoteApps.

However, while RD Web Access worked just fine for internal users, when I went to access RD Web Access externally, it failed miserably because the internal DNS name did not resolve externally!

Well, what was I to do?

According to common recommendations, I would have to set up an RD Gateway in order for me to correctly route the traffic on the external network to the internal network so that RD Web Access would work correctly.

I wanted to avoid doing this if at all possible since I really did not want to install an RD Gateway on the same server nor did I want to set up a secondary server just to host the RD Gateway, so I began searching for alternative solutions.

Fortunately, just such a solution existed in the form of a PowerShell script!!

This TechNet article addresses just this issue!!

It provides a PowerShell script called Set-RDPublishedName.ps1 that allows you to change the published FQDN for an RD Web Access deployment.

Based on the article's outlined recommendations, I ran it directly on my RD Connection Broker server (the same as my RD Session Host server) and set the Url that I wanted to be my externally available FQDN.

As you can probably already guess, the script worked like a charm!  After running the script, I accessed my RemoteApps through RD Web Access and I was successfully able to open them by their externally available Url!  All without having to set up a special server to act as an RD Gateway!!

How cool is that??

Where are the ADLDS/ADAM .LDF files?

If you are looking for the .LDF files that ADLDS/ADAM uses to import the various schemas while initially setting up an instance of ADLDS, you can find the various .LDF files (such as MS-User.LDF) in the following directory:


These .LDF files can give you an idea on how to compose your very own custom .LDF files as well as provide you with a better understanding of how the .LDF files work.

Configuring Active Directory Lightweight Directory Services (ADLDS) with SSL

I was recently attempting to set up an instance of ADLDS with SSL using a Self-Signed Certificate when I got this error message in my Windows System Event Logs:

The SSL server credential's certificate does not have a private key information property attached to it. This most often occurs when a certificate is backed up incorrectly and then later restored. This message can also indicate a certificate enrollment failure.

I attempted to follow this article on how to set up LDAP over SSL: 

I even took a look at this article to see if it would provide additional insight:

Of course, this article looked the most comprehensive in terms of guidance:

However, none of these articles got me any further than I was before!

As it turned out, my ADLDS instance was using a non-standard port of 5001, therefore, I found this article about required ports for ADLDS with SSL:

Based on the above MSDN Article, I could only use SSL with ADLDS on port 636!!  No other port would work!!

Well, I decided to reinstall my ADLDS instance to use the standard ports of 389 and 636 and once again re-applied my SSL certificate.

As you can probably already guess, this resolved my problem!! I was using a port number that did not support SSL (LDAPS) all along!!

Friday, April 24, 2015

Setting up and installing Web Deploy for IIS

If you want to simplify your deployments to your IIS Web Servers, you probably want to set them up for Web Deploy.

Unfortunately, by default, Web Deploy is not available with a brand new installation of Windows Server 2012 or Windows Server 2012 R2.

Instead, you have to go ahead and install Web Deploy using the Microsoft Web Platform Installer:

Alternatively, you can download Web Deploy directly from here:

Once you have installed Web Deploy (v. 3.5 as of this writing), your Internet Information Services Management Console will look something like this:

You will notice that in the right hand navigation pane, you now have 2 options under the heading Deploy:
  • Export Application
  • Import Application
These operations are pretty much self explanatory.  When you click on Export Application, you get the option to export an existing IIS Application:

Once you have gone through the wizard to export the Application from IIS, you will end up with a deployment package as a .zip file.  You can then consequently import the application on another target IIS Web Server by selecting Import Application:

Using Web Deploy on your IIS Servers greatly simplifies the traditional method of using XCOPY to copy and paste files from one web server to another and manually creating IIS Applications or Virtual Directories.

Now that you know how to use Web Deploy for IIS, this is one more tool you can add to your toolbelt to save you time in your development and deployment operations and processes!

Updating a Web.config or App.config file using MSBuild

Normally, if you want to update your Web.config file or App.config file with specific settings, you will normally use a Config Transformation.

However, the problem with Config Transformations is that they require a separate file for EACH environment you want to deploy.  Therefore, you can easily see the number of Config Transformation files growing as you add more environments for development and testing.

So, what is the solution?

Well, in the past, you could update these files using an XmlTask such as the one found in MSBuild Extension Pack.

However, with the release of MSBuild v. 4.0, this is no longer needed with the inclusion of the XmlPoke Task.

In order to update your target Config file with the appropriate values, you simply provide the following:
  1. The path to your Config file
  2. The XPath that you want to update
  3. The new value for the specified element or attribute

Therefore, you can update an appSetting in your Web.config file using MSBuild in the following manner:

<Project ToolsVersion="12.0" DefaultTargets="UpdateWebConfig" InitialTargets="UpdateWebConfig" xmlns="">

    <Target Name="UpdateWebConfig">






        <XmlPoke XmlInputPath="$(WebConfigFile)" Query="$(AppSettingPath)" Value="$(AppSettingNewValue)" />



If you are interested in updating multiple AppSettings in batch, you can do something like the following:

<Target Name="UpdateWebConfigAppSettings">
    <AppSettingKey Include="Key1">
    <AppSettingKey Include="Key2">
    <AppSettingKey Include="Key3">
    <AppSettingKey Include="Key4">
    <AppSettingKey Include="Key5">
  <XmlPoke XmlInputPath="C:\Code\Web.config" Query="/configuration/appSettings/add[@key='@(AppSettingKey)']/@value" Value="%(AppSettingKey.Value)" />

If you want to integrate with a Continuous Integration Build Server such as Jetbrains TeamCity, you simply have to ensure that you pass these properties into your MSBuild script by using System Properties (ex: system.Value1)


That is all there is to it!! Easy as pie!!

Free alternative to LINQPad

If you like or love LINQPad as a code scratchpad, but cannot afford to buy a license of LINQPad for all of your development machines, then you might be looking for a free alternative that offers Intellisense.

Well, a developer produces a tool called Snippet Compiler that works and acts very much like LINQPad:

It basically is a wrapper for a .NET Console Application that lets you easily test out your .NET code for quick testing and prototyping.

Unfortunately, as you can tell from the website, the product is very outdated and has not been updated in a number of years since it still only supports .NET v. 3.5.

Therefore, if you are using .NET v. 4.0 or later, you will still probably have to rely on LINQPad as your code scratchpad for the time being, but if you are working with an older release version of the .NET Framework, Snippet Compiler might just be the tool you need!

Managing .config files across distributed development teams and different environments

If you work with a distributed global development team (like most people nowadays), one of the major development frustrations is that settings in configuration files such as App.config or Web.config will differ from development team to development team across the globe (or even from developer to developer)! 

So what does this mean?

This means that inevitably when you go into your Source Control repository (such as Team Foundation Server), you will see nearly every person on the team has a pending edit or check-out on the Web.config file or App.config file for every project that leverages one of these configuration files.

Of course, you can use Configuration Transforms/Configuration Transformations to somewhat alleviate this issue, but how many Configuration Transforms are you going to create and manage in your Source Control Repository?  In addition, Configuration Transforms were originally meant for deployment and release management scenarios rather than specific developer environment configurations.

As you can probably guess, this scenario makes the process of managing .config files extremely burdensome for most globally distributed development teams.

Unfortunately, Microsoft has not yet offered a good solution to resolve this issue with handling configuration files and it continues to remain a problem for developers and development teams worldwide.  Even with extensions like SlowCheetah to simplify the managing of Configuration Transformations (, this problem is not yet resolved. 

Well, with the upcoming release of Visual Studio 2015, this is a good opportunity to let Microsoft know about your frustrations with this entire Configuration File Management process and let your voice be heard!

If you agree that this is a major development problem and roadblock, then please vote for this UserVoice item here:

Like LINQPad? Consider LINQ Insight!

If you like or LOVE LINQPad, you should definitely consider LINQ Insight by Devart:

One of the nice things about LINQ Insight is that it is offered as a plugin for Visual Studio which significantly improves the overall debugging and development experience for LINQ in your development applications.

With LINQ Pad, for example, when you are writing LINQ to Entity Framework queries, the syntax of writing the queries makes some assumptions about your underlying references to your Entity Framework references etc.  Therefore, when you go in and need to actually paste your code into your Visual Studio application, you have to make some minor changes to your application in order to get them to function within the context of your Entity Framework connection.

In addition, as many people know, when you download the free version of LINQ Pad, it is essentially crippled from providing any Intellisense/autocompletion capabilities, thereby, requiring you to purchase an edition of LINQPad with those Intellisense capabilities.

However, LINQ Insight offers a free version that retains the Intellisense features that we so know and love!  Of course, you can also purchase a Standard Edition license which has more features for profiling your LINQ queries and a few other handy features as well:

For a more complete comparison of the feature differences between LINQPad and LINQ Insight, you can check out this page:

A better way to view and debug ASP.NET Cookies

If you have to write Cookies to the browser using ASP.NET, you may be searching for a better way to debug your ASP.NET Cookies to make sure they are written out correctly and work as expected.

Well, fortunately, all of the major browsers offer an excellent way to easily debug and view these Cookies.

When you install an add-on such as Firebug for Mozilla Firefox and you click on the Network tab, you can view the individual cookies for a particular request:

Similarly, when you click on the Resources tab in Google Chrome's Developer Tools and then navigate to the menu item for Cookies, you can see the individual Cookies for a particular website:

While Internet Explorer's Developer Tools functionality is not nearly as intuitive, it can also be used to view your Cookies by ensuring that you are currently capturing Network traffic and then clicking on Network-->Details:

Now you can easily troubleshoot any issues you encounter with ASP.NET Cookies!!

ASP.NET Forms Authentication with Active Directory Lightweight Directory Services (ADLDS)

Setting up ASP.NET Forms Authentication with Active Directory is relatively easy, however, I had a recent requirement to support Active Directory Lightweight Directory Services (ADLDS).

Unfortunately, it is very difficult to find information about how to provide connection string information for ADLDS.

After searching far and wide on the Internet, I finally found a reference on how to do this through Google Books:

Though it references the older name of ADAM, the connection string information remains the same for ADLDS:


   <add name="adamConnection" connectionString="LDAP://localhost:389/OU=ApplicationUsers,O=MyOrganization,DC=corsair,DC=com"/>


<membership defaultProvider="adamprovider">





        connectionStringName="adamConnection" connectionProtection="None" attributeMapUsername="userPrincipalName"


        connectionPassword="pass!word1" />



If you want to use an instance of ADLDS that is secured with SSL, then the information remains largely the same:

   <add name="adamConnection" connectionString="LDAP://localhost:636/OU=ApplicationUsers,O=MyOrganization,DC=corsair,DC=com"/>

<membership defaultProvider="adamprovider">
        connectionStringName="adamConnection" connectionProtection="Secure" attributeMapUsername="userPrincipalName"
        connectionPassword="pass!word1" />

Notice that the LDAP connection changes only by the port number to 636, but still does not support LDAPS.


For the Membership Provder, the only attribute that changes is connectionProtection from “None” to “Secure”

Of course, the ApplicationUsersAdministrator account has to be a member of the Administrators group in ADLS in order for this to work (You can do this using ADSI Edit), however, once you have that set up you should be able to use ASP.NET Forms Authentication with ADLDS in much the same way as a normal Active Directory installation!

Setting up SSL for Apache Tomcat


Normally if you are using all Microsoft technologies, you will probably only be dealing with applications that deploy to IIS, but there are numerous technologies which target Windows platforms but are still built on Java and therefore deploy to the Apache Tomcat web server.

Common examples of such tools are SAP Business Objects as well as Jetbrains TeamCity.

Therefore, you may encounter a time in your career when you have to apply an SSL certificate to Apache Tomcat.

If you consult the Apache Tomcat documentation, the installation of an SSL certificate for Apache Tomcat seems extremely complex and convoluted:

However, fortunately for many of us Windows Administrators, there is a simpler way!

If you are familiar with installing SSL certificates for IIS, you probably are already well aware of how to use .pfx files to install Server Certificates.

Well, this same server certificate can be installed on your Apache Tomcat web server to secure it with SSL!

This article actually does a great job of describing how to set up Apache Tomcat with SSL support:

Basically, it just involves modifying your server.xml file (located in the conf directory) to something like the following:

<Connector port="443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/your_domain.pfx" keystorePass="your_keystore_password" keystoreType="PKCS12"/>

That is really all there is to it!!

Wednesday, April 22, 2015

Troubleshooting Sitefinity Upgrades

If you have ever tried to upgrade from one release of Sitefinity to any later release, you probably already know that very few upgrades are seamless.

If your Sitefinity installation is a bit older and you want to upgrade to the latest release, then here are some troubleshooting steps to keep in mind while performing your upgrade.

As an example upgrade, I attempted to upgrade one of my Sitefinity v. 6.2 projects over to Sitefinity v. 8.0:

First of all, make sure you do the following before attempting to upgrade your project:

  1. Make a backup of your current database
  2. Make a backup of your entire site
  3. Specifically look over the configuration changes in the App_Data\Sitefinity\Configuration folder as well as any Web.config changes and customizations.
Then using Sitefinity Project Manager, go ahead and perform the upgrade.  If asked to perform the Web.config upgrade, go ahead and do so.

Now, in many cases, the Sitefinity upgrade will not work flawlessly and will require several manual merges.  The best starting point is to create a brand new Sitefinity v. 8.0 Sample Project and use that as a comparison point using a comparison and merging tool such as Beyond Compare or any other comparison and merge tool of your choice.

Nearly all of the .config files in the App_Data\Sitefinity\Configuration folder will change from release to release, but these files in particular will probably remain much the same:

  • DataConfig.config
  • PagesConfig.config
  • ProjectConfig.config
  • SecurityConfig.config

In my case, there were minor changes to even the DataConfig.config file and the SecurityConfig.config file.  In the SecurityConfig.config file, I had to retain the main security information and just add the section to support Dynamic Field permissions.

All other files will probably need to be merged manually through a comparison of the latest .config files with your current versions.

One of the major problem causing .config file in nearly every Sitefinity upgrade is the SystemConfig.config file.

If this file does not get upgraded correctly (which is roughly 99.99% of the time), then you are guaranteed to encounter problems with running your upgraded Sitefnity application.  This file actually determines all of the modules that will be available in your application as well as how the database is to be upgraded.  Therefore, if the upgrade fails, you may end up with a database in an inconsistent state with the release version of Sitefinity on your file system.

Well, fortunately, there is a relatively simple workaround for this problem to re-upgrade your database.

After you upgrade your project, you may end up with a SystemConfig.config file like the following:

<systemConfig xmlns:config="urn:telerik:sitefinity:configuration" xmlns:type="urn:telerik:sitefinity:configuration:type" config:version="8.0.5700.0" build="5700" previousBuild="4910">

Therefore, if your Sitefinity upgrade failed, then your database mismatches what your Sitefinity installation is expecting.  In order to rectify this, you can revert the version information of your SystemConfig.config file to force the upgrade once again like so:

<systemConfig xmlns:config="urn:telerik:sitefinity:configuration" xmlns:type="urn:telerik:sitefinity:configuration:type" config:version="6.2.4910.0" build="4910" previousBuild="3450">

The next time you run your application, it should attempt to upgrade the database as well as update the SystemConfig.config file to match the latest version of your Sitefinity installation.

In addition, you may have numerous modules in your SystemConfig.config file such as the following:

        <add startupType="Disabled" name="Multisite" />
        <add version="6.2.4910.0" name="Scheduling" />
        <add version="6.2.4910.0" name="Search" />
        <add startupType="Disabled" version="5.1.3450.0" name="News" />
        <add startupType="Disabled" version="5.1.3450.0" name="Blogs" />
        <add startupType="Disabled" version="5.1.3450.0" name="Events" />
        <add version="6.2.4910.0" name="Libraries" />
        <add startupType="Disabled" name="Forms" />
        <add version="6.2.4910.0" name="Lists" />
        <add startupType="Disabled" name="Analytics" />
        <add startupType="Disabled" version="5.1.3450.0" name="Newsletters" />
        <add version="6.2.4910.0" name="GenericContent" />
        <add version="6.2.4910.0" name="ControlTemplates" />
        <add startupType="Disabled" version="5.1.3450.0" name="Migration" />
        <add startupType="Disabled" name="Ecommerce" />
        <add startupType="Disabled" version="5.1.3450.0" name="ModuleBuilder" />
        <add startupType="Disabled" name="ResponsiveDesign" />
        <add startupType="Disabled" version="5.1.3450.0" name="Publishing" />
        <add startupType="Disabled" version="5.1.3450.0" name="Forums" />
        <add version="6.2.4910.0" name="Thunder" />
        <add startupType="Disabled" name="Personalization" />
        <add version="6.2.4910.0" name="SitefinityDAM" />
        <add startupType="Disabled" name="MobileAppBuilder" />
        <add startupType="Disabled" name="SharepointConnector" />
        <add startupType="Disabled" name="EverliveConnector" />
        <add startupType="Disabled" name="MarketoConnector" />
        <add startupType="Disabled" name="SalesForceConnector" />
        <add version="6.2.4910.0" name="Comments" />

These will all have to be updated to match the correct release versions for your Sitefinity installation:

        <add startupType="Disabled" name="Multisite" />
        <add version="8.0.5700.0" name="Scheduling" />
        <add version="8.0.5700.0" name="Search" />
        <add version="8.0.5700.0" name="News" />
        <add version="8.0.5700.0" name="Blogs" />
        <add version="8.0.5700.0" name="Events" />
        <add version="8.0.5700.0" name="Libraries" />
        <add startupType="Disabled" name="Forms" />
        <add version="8.0.5700.0" name="Lists" />
        <add startupType="Disabled" name="Analytics" />
        <add version="8.0.5700.0" name="Dashboard" />
        <add version="8.0.5700.0" name="Newsletters" />
        <add version="8.0.5700.0" name="GenericContent" />
        <add version="8.0.5700.0" name="ControlTemplates" />
        <add startupType="Disabled" name="Ecommerce" />
        <add version="8.0.5700.0" name="ModuleBuilder" />
        <add startupType="Disabled" name="ResponsiveDesign" />
        <add version="8.0.5700.0" name="Publishing" />
        <add version="8.0.5700.0" name="Forums" />
        <add version="8.0.5700.0" name="Thunder" />
        <add startupType="Disabled" name="Personalization" />
        <add version="8.0.5700.0" name="SitemapGenerator" />
        <add version="8.0.5700.0" name="SitefinityDAM" />
        <add startupType="Disabled" name="MobileAppBuilder" />
        <add startupType="Disabled" name="SharepointConnector" />
        <add version="8.0.5700.0" name="EverliveConnector" />
        <add startupType="Disabled" name="MarketoConnector" />
        <add startupType="Disabled" name="SalesForceConnector" />
        <add version="8.0.5700.0" name="DataIntelligenceConnector" />
        <add version="8.0.5700.0" name="Comments" />
        <add version="8.0.5700.0" name="RecycleBin" />
        <add startupType="OnApplicationStart" version="" name="Feather" />
        <add title="Audit Trail - Elasticsearch" description="Logs audit events to an Elasticsearch instance." moduleId="00000000-0000-0000-0000-000000000000" type="Telerik.Sitefinity.Audit.Elasticsearch.ElasticsearchAuditModule, Telerik.Sitefinity.Audit.Elasticsearch, Version=8.0.5700.0, Culture=neutral, PublicKeyToken=4d437ae15f42fd43" startupType="Disabled" name="ElasticsearchAudit" />

Next, you may have to merge your Web.config file to match any of the latest changes.

Finally, since your Visual Studio project references are no longer valid, you will probably have to merge your Visual Studio project changes with the latest project changes and re-compile your solution.

If you have done all of the above, you can now try re-running your application.  If all went well and your application runs without throwing exceptions, you have successfully upgraded your Sitefinity application to the latest release!

Tuesday, April 21, 2015

Custom CyberPowerPCs from Costco

If you order a CyberPowerPC from Costco directly, you only get the limited cases and configurations that are provided through Costco.

However, if you want to choose from a wider variety of options for cases and hardware choices, your best bet is to use the Costco CyberPowerPC Configurator here:

Here, you have the option to choose from a wide variety of models and cases including features such as Toolless bays or even Hot Swap Bays for your hard drives!  With the Magnus Intel X99 Configurator model, you can ramp up your memory up to 64 GB and choose cases that even support Liquid Cooling.  Very, very cool!!

Monday, April 20, 2015

Setting up Remote Desktop Services on Windows Server 2012 R2

If you need to set up Remote Desktop Services (formerly Terminal Services) for Windows Server 2012 R2, you need to add the Remote Desktop Services Server Role as follows:

If you attempt to set this up on a computer which is a member of a Workgroup and not a Domain, you will get the following error message:

Next, you have to install the Remote Desktop Services Licensing Manager:

Of course, you also have to set up an RD Connection Broker before you can manage all of the servers in your deployment, so you have to Add that Role/Feature as well:

You then have to connect your RD Session Host and associate it with the RD Connection Broker by running through the Remote Desktop Services Installation:

Finally, you have to add the RD License Server to associate it with the RD Session Host:

Finally, you can click on your Session Collection to manage the Published Remote Apps as well as your RD Connections: