Setup

StackOverflow: Removal of Advertised Product Information.

I've been so heads down running FireGiant that my attendance on StackOverflow has decreased signifcantly. However, someone who answers a fair number of MSI related questions on StackOverflow asked me a question to clarify his understanding.

I started to answer but realized that it could be a useful blog post. So let’s try to answer “Remove information about installed product”.

First of all, it isn’t clear why the questioner wants to know when the advertised product information is removed. So for the sake of this discussion I’m going to assume you’re here just because you’d like to understand a little bit more about how the Windows Installer works.

Second, if you don’t know what advertisement is then this isn’t the blog post for you. You might start by digging into the MSI SDK Advertisment documentation.

With the context set, let’s get to the answer.

When you advertise an MSI, like msiexec.exe /jm my.msi, the Windows Installers sets the ACTION property to ADVERTISE. The advertise action causes the Windows Installer to process the AdvtExecuteSequence instead of the sequence you are likely more familar with InstallExecuteSequence.

That fact is probably what leads to the question. If you look at the allowed actions in the AdvtExecuteSequence you’ll notice that there are only “publish” type actions, no “unpublish” type actions. That’s an important hint. The AdvtExecuteSequence is not used for uninstall.

In fact, that makes complete sense because to remove an advertised product you run msiexec /x my.msi. The /x basically sets REMOVE property to ALL then runs the InstallExecuteSequence.

Awesome, so the answer is that there must be an UnpublishProduct action in the InstallExecuteSequence that removes the advertised product. Right?

Uhh, wait. There is no UnpublishProduct. So, uhh, how does the published product information get removed?

I have to admit. I had to go digging to find the actual answer. Can you guess? We know it has to be an action in the InstallExecuteSequence, which admittedly does not narrow down the list terribly much. It also probably should be late in the transaction such that a hard failure doesn’t put the product in a state where where the Windows Installer thinks it is removed but still has stuff from the product is still left on the machine.

That line of thinking is what led me to the answer. Turns out it is actually documented in the MSI SDK. Ladies and gentlemen, I present to you the remover of all product information: InstallFinalize.

Well, that was fun. Now get back to coding. You know I am.