I recently discovered some rather worrying behavior in SCCM 2012 SP1 regarding how the CM agent handles return codes from msiexec. If you pass the /REALLYSUPPRESS switch to msixec then that means that if msixec determines that the installation needs a reboot (for example, if a required file was in use during the install/upgrade) then msiexec will not initiate a reboot; instead it will suppress the reboot and return an exit code of 3010.
SCCM 2012 Deployment Types define a 3010 as a "Soft Reboot". There does not appear to be any definitive documentation online from MS regarding the meaning of "soft reboot" but it is generally taken to mean to put the machine into a pending reboot state and not actually reboot the machine.
However, I have found that despite exiting with a 3010 code, the CM agent had initiated a system reboot.
This reboot can happen around the time the install finishes or, on some systems, can get deferred for up to an hour depending on how group policy is configured.
I have not managed to verify whether such machines had a pre-exiting pending reboot state or not, but neither case is good.
There are two workarounds:
1. Change the User Experience settings in the Deployment Type to stipulate that SCCM will take no specific action when the program completes, or
2. Go to the Return Codes tab of a Deployment Type, edit the entry for 3010 and remap it from "Soft Reboot" to "Success"
I recommend option 1 since it means that if you decide to do any reporting on those return codes you can get accurate data- after all, you may actually want to know that some machines are now stuck in a pending reboot state