Вам просто нужно установить ARPSYSTEMCOMPONENT = 1 в таблице свойств установщика, используя Orca (не может быть сделано непосредственно в Visual Studio из того, что я знаю)
Это обычно используется, когда программа устанавливает зависимости, и вы не хотите, чтобы пользователь удалял зависимости вручную, ему нужно использовать предоставленный вами скрипт удаления или что-то подобное.
Лично я бы разработал патч как патч и предотвратил бы его удаление.
Также я предлагаю взять копию Подробного руководства по установке Windows , которое даст вам некоторое объяснение того, как, почему и где вы должны использовать такие приемы, как этот. А также дает вам действительно хорошее понимание основ установки Windows и поможет вам разработать лучший установщик в долгосрочной перспективе. Во всех примерах в книге используются бесплатные инструменты Visual Studio + из Windows Installer SDK.
Редактировать: Пользователь по-прежнему имеет полный контроль над удалением через MSIEXEC, с помощью предоставленного вами ярлыка удаления, все, что он делает, это скрывает запись в Установка / удаление программ (ARP)
Edit2: Пример VBS для добавления свойства (если вы хотите сделать это как часть процесса автоматической сборки)
Dim installer, database, view
Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase ("test.msi", 1)
Set view = database.OpenView ("INSERT INTO Property(Property.Property, Property.Value) VALUES('ARPSYSTEMCOMPONENT', '1')")
view.Execute
Set database = Nothing
Set installer = Nothing