This is the eleventh in a series of notes about UAC in MSI. Per the earlier caveat, these are just my notes and not an official position from the Windows Installer team. The previous entries
Given the pre-Vista operating systems did not enforce the architectural intent to that modifying the system should not occur outside the script of the InstallExecuteSequence, application compatibility testing found a number of packages that had custom actions failing. Here's the "saw tooth" diagram I draw on my whiteboard to illustrate this mistake.
With the permissions changes in the context of UAC, that the server outside the script is always executed as Standard User causes the Application Compatibility problems to show up. The red “no” circle is where this mistake is generally made. This mistake is generally mitigated by moving the custom action into the script (represented by the green circle in the above diagram).
Generally folks make this mistake due to lack of awareness as they followed that they needed to be in the server via InstallExecuteSequence.
If the custom action is logging its errors, the trick is to look for an error code that translates to Access Denied.