I work for a university system with several campuses, all of which use an old custom backend application that has not been updated in about 10 years. The software works immediately on Windows Server 2016, but every campus that has tried running it on Server 2019 or newer reports that it does not work. We do not yet have a detailed error message or a clear explanation of whether this is a clean installation, migration, or in-place upgrade. Are there known changes between Server 2016 and Server 2019 that commonly break older applications?
5 Answers
TLS protocol changes are another obvious thing to check. Older systems may depend on TLS 1.0 or 1.1, which are disabled or discouraged in newer configurations. Re-enabling them temporarily could help confirm whether that is the issue, but it would only be a diagnostic or short-term workaround because those protocols are insecure.
Before guessing, reproduce the problem in an isolated test environment. Make a copy of the 2016 VM or backup, record the working configuration, and test an in-place upgrade to 2019. Collect application, System, and security logs and identify whether the software fails to launch, loses a dependency, or simply cannot reach a service or network share. Without the exact symptom, the list of possible causes is huge.
That is probably the most useful next step. The reports from other campuses are vague, so I need to see the failure directly and compare the working and failing systems.
There are several possibilities. Server 2019 does not install SMBv1 by default, restricts some anonymous SMB2/3 guest access, and no longer supports older SMB-based network discovery in the same way. Legacy applications that access shares or discover servers using those mechanisms can fail. Changes in the bundled .NET Framework, printing components, RemoteFX, and certain RDS roles may also matter, depending on what the application uses.
TLS and SMB are already configured through our existing security policies, so those probably are not the cause. I will investigate the .NET, printing, and other legacy dependencies.
Compatibility mode may help with an old executable, but it usually will not fix missing protocols, disabled authentication methods, unavailable services, or framework dependencies. Also confirm whether a clean Server 2016 installation still works and document the upgrade method. If the software is business-critical, avoid leaving it permanently in an unsupported, insecure configuration; involve the vendor or plan a replacement.
Capture the application's network traffic while it runs on 2016 and compare it with a 2019 attempt. A packet capture can reveal failed TLS negotiation, SMB version differences, authentication failures, or connections to obsolete services. Checking Event Viewer and the application's own logs should narrow the problem much faster than trying random compatibility settings.

That was one of my first thoughts too, but our 2016 installations already have the relevant TLS settings controlled by security policies. I will still verify the actual effective settings rather than assuming they match.