After having to do that a few times recently, I decided to put down a short summary on how msi upgrades work. It’s may not be 100% accurate and doesn’t go into much details, but if you want to explain it to colleagues or managers who know very little of msi, it should satisfy them.
So here it goes:
The error in the title can happen during MSI installations, if the msiexec global mutex is not available.
I encountered it while developing a small script that would uninstall all existing JRE versions on the machine and install the latest one (using the msi package).
Apparently the JRE uninstall command spawns the Java Automatic Update (AU) uninstaller, but returns control immediately to the caller. Hence, if I perform a JRE uninstall and immediately start another installation, it would sometime fail with MSI error 258 since Windows Installer is still busy with the AU uninstall.
The best solution I found so far is as mentioned in this Stack Overflow thread. I wrote a small program based on that code, that waits until the mutex is available (or until a certain timeout). So my script now runs the JRE uninstall, then the ‘wait for mutex’ program, and only then it launches the JRE installer, and everyone’s happy 🙂
When running msiexec to install, update or remove a certain product, you may want to prevent it from rebooting the system, or even prompt the user to reboot the system (e.g. if it’s a part of a larger installation or some other scripted operation).
Before Windows Installer 3.0, the only way to do it was setting the Windows Installer REBOOT property like this:
msiexec /i MyPackage.msi REBOOT=ReallySuppress
In Windows Installer 3.0, Microsoft added several command line switches which makes it more readable. So now the command looks like this:
msiexec /i MyPackage.msi /norestart
Much clearer, isn’t it?