I work for a university system with several campuses, all of which rely on an old custom backend application that has not been updated in roughly 10 years. It runs normally on Windows Server 2016, but everyone who has tried deploying it on Server 2019 or newer reports that it does not work. I do not yet have complete details about the exact failure or whether the newer systems were upgraded in place or built as fresh installations. Are there known changes between Server 2016 and Server 2019—such as security defaults, removed components, networking protocols, or framework changes—that commonly break older applications?
5 Answers
There is no single Server 2019 change that universally breaks all older software. Differences in how the server was deployed can matter just as much as the operating system version. A clean installation may be missing legacy features, permissions, runtimes, drivers, or application dependencies that existed on the old server. Compare a clean Server 2016 installation with the working system, identify exactly what the application needs, and review the event logs when it fails. Compatibility mode may help with a user-interface component, but it usually will not fix missing services or network protocols.
Before guessing, reproduce the problem in an isolated test environment. Make a copy or snapshot of the working Server 2016 virtual machine, perform the upgrade there, and compare the results. Check the application logs, Windows event logs, services, installed roles, permissions, and network traffic. The exact failure—whether the program will not launch, cannot connect, or fails during a particular operation—will narrow the list of possible causes considerably.
TLS protocol changes are one of the first things I would check. Older systems may still require TLS 1.0 or 1.1, while newer configurations commonly disable them. Re-enabling those protocols can help confirm whether they are involved, but it should only be considered a diagnostic step because relying on obsolete TLS versions is insecure.
That was one of my first suspicions too, but the existing Server 2016 systems already use hardened security policies that cover TLS and SMB. I will still verify the effective settings rather than assuming the group policies applied as expected.
If the application is business-critical, avoid immediately putting it into an unsupported configuration just to make it run. First determine the failure and whether the vendor has a supported version or documented requirements. A temporary isolated test on a copied Server 2016 system can establish a baseline, while packet capture and service logs can reveal whether the problem is TLS, SMB, authentication, or something application-specific.
There are several likely compatibility points. SMBv1 is no longer installed by default, and older software may depend on SMBv1 shares or legacy network discovery. Anonymous SMB2/3 guest access is also restricted by default. Older .NET applications can encounter behavior changes with the newer framework versions, and applications that depend on printing components, RemoteFX, or other legacy roles may also be affected. Some of these settings can be restored temporarily, but doing so may leave the server in an unsupported or insecure configuration.
TLS and SMB are already configured through our existing security policies on the Server 2016 installations, so I do not think those are the cause. I will investigate the other possibilities and compare the actual installed roles and components.

That is probably the best next step. I have not tested the upgrade myself yet because other campuses advised against it, but an isolated copy should let me investigate without risking production.