Category Archives: Windows Servers

Anything related to Windows servers

Windows Server 2019 OpenSSH Installation

Sometimes you just know “it will not be that easy”. In this case it is Windows Server 2019 OpenSSH Installation.

Wanting to configure an SFTP server I had reviewed instructions Get Started with OpenSSH at Microsoft a couple of sites and within the Microsoft Tech Community referenced Orin Thomas’ page on this topic.

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Seems so simple !

Add-WindowsCapability failed. Error code = 0x800f0954

So that is broken. Why? Apparently it is related to permissions for downloading updates or software directly from the interwebs.

A quick search reveals a couple of solution pages including this one at thesysadminchannel which suggests a group policy edit:

  • Open gpedit.msc
  • Go to Computer Configuration -> Administrative Templates -> System
  • Open Specify settings for optional component installation and component repair
  • Set to Enabled
  • Check the box for Download Repair Content…. (directly rather than from WSUS)
  • Finally, exit gpedit and back in Power Shell run gpupdate /force

So that made sense, but now I get this error:

Add-WindowsCapability : Add-WindowsCapability failed. Error code = 0x8024500c

Off on another search leads me to a slightly related github discussion and way-down-the-list of comments was this gem from joshuayoerger:

  • Open regedit
  • Navigate to Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU
  • Set UseWUServer = 0x00000000 (0)

Josh also suggested a server restart, which I did not do, and the change in the setting was apparently sufficient as the server would now accept the command and not spit it back at me.

As a final check, before continuing with configuration of the OpenSSH server, I ran this PowerShell command to check if it was installed as expected:

PS C:\windows\system32> Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : Installed

So that now looks better than the red error lines. Now to get on with configuring.

Final thoughts: Why would WSUS be configured for a stand-alone server? and if it is then surely it is just a proxy for getting updates in any case, and should be used auto-magically. Apparently what is happening here is that in the Microsoft ‘user-friendly pretty picture interface’ WSUS works quietly in the background doing the updates, but if we step into the dark-side of command lines, the ‘GetWindowsCapability’ command is not intelligent enough to know that it might want to check-in with WSUS first before doing a dummy-spit.

Related topics are:

Change the Port for OpenSSH on Windows 2019

Configure OpenSSH SFTP on Windows 2019

At least one other site is using the same HTTPS binding

“At least one other site is using the same HTTPS binding …..”  is a prompt that every Windows Server IIS administrator has come across at some point.  It arises when trying to change or update an SSL certificate on Windows server IIS platform where there are multiple websites and potentially multiple certificates.

Multiple Sites Using Same IP and SSL

Multiple sites sharing an IP address use a process of host-header recognition in order to accept the in-bound connection. Where this is on port 80 (http) there is no issue.

However, with port 443, the IP address and port number are also bound to a certificate and changing one site certificate will impact all the other sites on the same IP address and port combination. Hence the following Alert (error) message is displayed.

IIS SSL Multiple Sites Alert
IIS SSL Multiple Sites Alert

Accepting or rejecting really depends on your server and what sites and certificates are actually in use. However, this may impact on the other sites and my past experience has been that other sites can be left in an unstable state either without a binding, a certificate, or a mix-up on which certificate.

Change SSL Certificate for Multiple Sites

Use the following steps to prepare manual change at the command line in order to avoid the above error message and address all sites using the same IP address : port and certificate at the same time.

All the detailed information has been sanitised to use dummy data, you will need to substitute the relevant information for your certificates and server.

First examine the certificates in use opening a command prompt – this is all read activity so Run as Administrator is not required, yet.

certutil -store My

This will display lists of certificates and applications like the following. I selected the 2 that I was looking for as follows:

the old certificate – based on NotBeforeDate – you need the highlighted hash from each certificate

================ Certificate 7 ================
Serial Number: 1234567890abcdef1234567890abcdef1234
Issuer: CN=AlphaSSL CA – G2, O=AlphaSSL
NotBefore: 01/01/2014 11:27 AM
NotAfter: 31/12/2016 11:27 AM
Subject: CN=*.yourdomain.tld, OU=Domain Control Validated
Non-root Certificate
Template:
Cert Hash(sha1): 12 34 56 78 90 ab cd ef 12 34 56 78 90 ab cd ef 12 34 56 78
Key Container = 12345a8277cd156abcd09d20dcba5c31_g3239vv5-8181-1234-b6ba-bbbb
78ccd34
Provider = Microsoft RSA SChannel Cryptographic Provider
Encryption test FAILED
CertUtil: -store command completed successfully.

and the new certificate – based on NotBeforeDate

================ Certificate 4 ================
Serial Number: 67890abcdef12341234567890abcdef12345
Issuer: CN=AlphaSSL CA – SHA256 – G2, O=GlobalSign nv-sa, C=BE
NotBefore: 01/01/2015 9:02 AM
NotAfter: 31/12/2016 11:27 AM
Subject: CN=*.yourdomain.tld, OU=Domain Control Validated
Non-root Certificate
Template:
Cert Hash(sha1): 78 90 ab cd ef 12 34 56 78 90 ab cd ef 12 34 56 78 12 34 56
Key Container = 1234abcd54d7161def4863d4d6b96633_f3239aa5-8080-1234-b6ba-abcd
78ccd34
Provider = Microsoft RSA SChannel Cryptographic Provider
Encryption test FAILED

Next, identify the ip address that is in use and, assuming that standard https is being used, port 443. This could be done by checking within IIS first to check which common IP address is being used.

netsh http show sslcert

Which will show all the ssl certificate bindings, or if you know which ipaddress, then be selective

netsh http show sslcert ipport=223.27.11.71:443

Will show the results like:

SSL Certificate bindings:
————————-IP:port                 : 223.27.11.71:443
Certificate Hash        : 1234567890abcdef1234567890abcdef12345678
Application ID          : {34567812-3456-7890-abcd-ef123456789d}
Certificate Store Name  : MY
Verify Client Certificate Revocation    : Enabled
Verify Revocation Using Cached Client Certificate Only    : Disabled
Usage Check    : Enabled
Revocation Freshness Time : 0
URL Retrieval Timeout   : 0
Ctl Identifier          : (null)
Ctl Store Name          : (null)
DS Mapper Usage    : Disabled
Negotiate Client Certificate    : Disabled

The application ID is what is needed from the above but check that the correct certificate hash (the old one) is associated with this binding.

Now select all the relevant information from the results as shown

Old certificate hash (with spaces removed)

1234567890abcdef1234567890abcdef12345678

New certificate hash (with spaces removed)

7890abcdef1234567890abcdef12345678123456

and the AppID

{34567812-3456-7890-abcd-ef123456789d}

The following two steps will need a new elevated command window selected with ‘Run as Administrator’

Delete old binding

netsh http delete sslcert ipport=223.27.11.71:443

Then add new using hash and appid

netsh http add sslcert ipport=223.27.11.71:443 certhash=7890abcdef1234567890abcdef12345678123456 appid={34567812-3456-7890-abcd-ef123456789d}

which should result in

SSL Certificate successfully added

And finally if you want to check that it has been applied

netsh http show sslcert | findstr /R "7890abcdef1234567890abcdef12345678123456"

or to check that the old certificate hash is not still in use on another ipaddress:port binding use the above with the old certificate hash.

 

Reference: http://serverfault.com/questions/610841/replace-wildcard-certificate-on-multiple-sites-at-once-using-command-line-on-i

Deploy RDS on a stand-alone Windows 2012 Server

Looking to deploy RDS on a stand-alone Windows 2012 Server I found a wealth of information where the authors make the assumption that you will use an Active Directory / Domain connected server.

A Microsoft team blog reference makes what I consider to be a fatal assumption in this reference RD Quick Start on a Domain Connected Server in stating that the instructions are suited to a small office deployment or as a proof of concept deployment. My take on a proof of concept is that a domain configuration is a lot of extra work for little value.

So I searched some more and arrived at Ryan Mangans’ blog and his post on the simple Setup Windows stand-alone RDS server.

Deploy RDS on a stand-alone Windows 2012 Server

Assumption: Using a single server for a small office and limited user environment.  A larger office, more users, more management option would require more than 1 server and separation of server roles.

Two methods depending on the server status of domain connected or stand-alone.

Deploy RDS on a stand-alone Windows 2012 Server using Role Based installation

This installation method assumes that the server is not connected to a domain.

Ref: http://ryanmangansitblog.com/2013/10/30/deploying-a-rdsh-server-in-a-workgroup-rds-2012-r2/

1. Using the Add Roles & Features Wizard

2. Deploy the RDS 2012 Session Host Role and the RDS licencing role

3. This will provide the role of Remote Desktop Services and 2 role services of Session Host and Desktop Licensing.

This method will not provide some features for management that are commonly referenced for ‘best practice’ as the vast majority of documentation assumes a domain based server has been used.

Deploy RDS on Domain connected Windows 2012 Server

As per the heading this installation assumes that the server is domain connected with an Active Directory. These steps are taken from the Microsoft reference and are included here for comparison to the above stand-lone server deployment method.

Ref: http://blogs.technet.com/b/askperf/archive/2015/04/09/remote-desktop-services-rds-2012-session-deployment-scenarios-quick-start.aspx

1. On the server that will become the Connection Broker, logon with a domain account that is an administrator and start Server Manager. From Manage menu item, select Add Roles and Features.

2. Select Remote Desktop Services installation.

3. Select Quick Start.

4. Select Session-based desktop deployment.

5. Add your local server to the Selected list for Specify RD Connection Broker server.

6. On the Confirm Selections dialog, check Restart the destination server automatically if required.

7. The RDS session deployment will now begin the install to all the servers and components selected. A progress dialog will be shown and the server will reboot.

8. After reboot, log in and the progress dialog will be shown again and installation will continue.

9. After installation is complete, in the Server Manager Dashboard, there will be a Remote Desktop Services role listed in the left navigation pane.

10. Selecting Remote Desktop Services will display the Overview of the new deployment. From this page, the next steps would be to add / specify both the license server and RD Gateway if needed.

Mac Windows Remote Desktop connection error licensing problem

Take a Mac PC or notebook and try to connect to a Windows server using the Version 2.1.1 of Microsoft Remote Desktop Connection Client for Mac.

It may (should) connect ok with a server that only has the administrative access remote desktop enabled.

But, it fails to work with a Remote Desktop Server (aka Terminal Services server).

2015-03-24_13-09-22_RDC_Error1

When you exit the application with Cancel rather than Reconnect, you may get a Microsoft Error Reporting prompt:

2015-03-24_13-09-22_RDC_Error2

and checking for More Information shows:

2015-03-24_13-09-22_RDC_Error3

which shows error details as follows:

*****

Microsoft Error Reporting log version: 2.0

Error Signature:
Exception: EXC_BAD_ACCESS
Date/Time: 2015-03-24 02:32:36 +0000
Application Name: Remote Desktop Connection
Application Bundle ID: com.microsoft.rdc
Application Signature: MSRD
Application Version: 2.1.1.110309
Crashed Module Name: libobjc.A.dylib
Crashed Module Version: unknown
Crashed Module Offset: 0x000010a7
Blame Module Name: TSClient
Blame Module Version: 1.0
Blame Module Offset: 0x000dcd5a
Application LCID: 1033
Extra app info: Reg=en Loc=0x0409
Crashed thread: 13

****

A simple resolution that worked for me was to use the Microsoft Remote Desktop v 8.0.14 app from the App store rather than this Microsoft Remote Desktop Connection Client for Mac