DPM 2016 + SQL 2016 and "An unexpected error occurred during the installation" ID: 4387

Microsoft System Center Data Protection Manager (DPM) officially supports SQL 2016 with UR2.  But, like previous System Center products, the only installer is pre-UR2, so SQL 2016 is not "officially" supported for an initial install, only as an upgrade install.  This is particularly annoying because it means you have to do a SQL 2014 installation, DPM installation, DPM upgrade to UR2, then a SQL upgrade to 2016.

The good news is that despite it not being officially supported, you can install DPM 2016 RTM with SQL 2016 already installed, then apply UR2. 

However, there is a big gotcha.

One I discovered is that if you have SQL 2016 SP1 installed, the DPM installer crashes with the error "An unexpected error occurred during the installation.  For more details, check the DPM Setup error logs. ID: 4387"

The logs aren't helpful at all.  There are numerous errors in the logs, that are actually safe to ignore, which causes a lot of false positives in your investigation.  At the very end there is a line that says "*** Error : CurrentDomain_UnhandledException" followed by an exception that appears after the installer is closed.

[2/8/2017 6:42:16 PM] * Exception : Invoking Watson with Exception:  => System.ArgumentNullException: Value cannot be null.
Parameter name: input
   at System.Version.Parse(String input)
   at System.Version..ctor(String version)
   at Microsoft.Internal.EnterpriseStorage.Dls.Setup.Inspect.InspectPrerequisites.CheckSqlServerTools(InspectContext context)
   at Microsoft.Internal.EnterpriseStorage.Dls.Setup.Inspect.Inspect.InitializeContext(String sqlMachineName, String sqlInstanceName, String reportingMachineName, String reportingInstanceName, ConnectionOptions wmiSqlConnectionOptions, ConnectionOptions wmiReportingConnectionOptions, Boolean isRemoteDb, Boolean isSqlClustered, List`1 sqlClusterNodes, Boolean isRemoteReporting, String oldSqlMachineName, String oldSqlInstanceName, ProductNameEnum productName, InspectModeEnum inspectMode, Boolean remoteTriggerJob)
   at Microsoft.Internal.EnterpriseStorage.Dls.Setup.Inspect.Inspect..ctor(String reportFilePath, String sqlMachineName, String sqlInstanceName, String reportingMachineName, String reportingInstanceName, ConnectionOptions wmiSqlConnectionOptions, ConnectionOptions wmiReportingConnectionOptions, Boolean isRemoteDb, Boolean isSqlClustered, List`1 sqlClusterNodes, Boolean isRemoteReporting, String oldSqlMachineName, String oldSqlInstanceName, InspectModeEnum inspectMode, InspectSkuEnum inspectSku, ProductNameEnum productName, InspectCCModeEnum ccMode, Boolean remoteTriggerJob)
   at Microsoft.Internal.EnterpriseStorage.Dls.Setup.Wizard.BackEnd.InstantiateInspect(String inspectFile, String sqlMachineName, String sqlInstanceName, String reportingMachineName, String reportingInstanceName, ConnectionOptions wmiSqlConnectionOptions, ConnectionOptions wmiReportingConnectionOptions)
   at Microsoft.Internal.EnterpriseStorage.Dls.Setup.Wizard.InspectPage.RunInspect()
   at Microsoft.Internal.EnterpriseStorage.Dls.Setup.Wizard.InspectPage.InspectThreadEntry()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

   at System.Threading.ThreadHelper.ThreadStart()

So I tried a lot of different things like different versions of SSMS (management tools), manually installing the Hyper-V PowerShell components, making sure all the WMI classes are registered (mofcomp all the .mof files manually), and the tips are this link.

What's happening as far as I can tell is that the installer's prerequisite checks fail due to an unexpected response from SP1.  The only way to get around this is to install SQL Server 2016 RTM, then install DPM 2016, then install DPM's UR2, then install SQL's SP1.  Done in that order, it works in my tests.

It's not as bad as having to install SQL 2014 first, then upgrade to 2016, but still a pain.  I wish Microsoft would released System Center products with updated installers for major milestones, like when a new version of SQL is supported.