When running the Exchange Server 2013 Schema Prep step you may find the Exchange pre-requisites test fails, and an incredibly helpful error message is provided for your reading enjoyment:
The On-Premises test failed with the message: Object reference not set to an instance of an object.
For more information, visit: http://technet.microsoft.com/library(EXCHG.150)/ms.exch.setupreadiness.
Well, actually, that was rather unhelpful. And the handy URL provided basically just says the content hasn't been added yet.
Digging in to the ExchangeSetup.log files found in C:\ExchangeSetupLogs is the only way to diagnose what's really going on. This file will list all of the pre-requisite checks the installer is running through, and if you search for the phrase 'HasException:True' you can skip to anything flagged as an issue. This would theoretically identify the exact failure and let you be on your way, right? Nope.
In my case, I ran across this exception:
Evaluated [Setting:IsHybridObjectFoundOnPremises] [HasException:True] [Value: Microsoft.Exchange.Management.Deployment.HybridConfigurationDetection.HybridConfigurationDetectionException: The On-Premises test failed with the message: Object reference not set to an instance of an object.. ---> System.NullReferenceException: Object reference not set to an instance of an object. at Microsoft.Exchange.Management.Deployment.HybridConfigurationDetection.HybridConfigurationDetection.TestOnPremisesOrgRelationshipDomainsCrossWithAcceptedDomain(IOnPremisesHybridDetectionCmdlets onPremCmdlets) at Microsoft.Exchange.Management.Deployment.HybridConfigurationDetection.HybridConfigurationDetection.RunOnPremisesHybridTest() --- End of inner exception stack trace ---
Ok, so we're getting a little bit closer. You still need to do some Exchange team to real-world language translation, but the gist seems to be that the installer has an issue with the Organizational Relationships and/or Accepted Domains.
Nothing seemed obviously wrong with either of these at first glance, but after combing through each listed object in both sections about ten times I discovered a (non-functional) organizational relationship that had been defined without an Application URI value. Seems like someone had staged this object, but never completed configuration. Deleting the problematic organizational relationship allowed the installer to complete the schema prep step without any further complaints.
It sure would be nice if the Exchange installer was a bit more detailed about exactly which object it was checking or had a problem with, but who doesn't love a good Easter egg hunt from time to time?