使用c#(DTF)中的产品代码卸载MSI时遇到的问题

本文关键字:卸载 代码 MSI 问题 遇到 DTF 使用 | 更新日期: 2023-09-27 17:53:46

我正在创建一个CustomBA,它将取代现有的安装屏蔽引导程序(我真的不知道它叫什么)。

我们正在安装与安装屏蔽相同数量的MSI,所以没有问题。ARP中的所有MSI项都被删除,因为我们正在使MSI的Visible="no"。

ARP中只有Custom BA表项和Install shield Bootstrapper表项可用,它们具有相同的名称。

因此,经过一番研究,我得知WindowsInstaller XML (WiX)作为部署工具基础(DTF)的一部分发布了Microsoft.Deployment.WindowsInstaller互操作库,可用于卸载MSI。

我正在使用下面的代码卸载MSI。

Microsoft.Deployment.WindowsInstaller.Installer.SetInternalUI(InstallUIOptions.Silent);
Microsoft.Deployment.WindowsInstaller.Installer.EnableLog(InstallLogModes.Info, @"C:'Uninstall.log");
Microsoft.Deployment.WindowsInstaller.Installer.ConfigureProduct(productCode, 0, InstallState.Absent, "");

我面临的问题如下所述

  1. 首先,我必须以管理员身份运行CustomBA来卸载现有的MSI,否则它会抛出错误"错误1730"。您必须是管理员才能删除此应用程序。有没有办法在没有管理员的情况下运行CustomBA并卸载MSI ?

  2. 当卸载时(当我以admin身份运行customBA时),上面提到的代码也删除了它的链包,这是我不希望它做的。

  3. 卸载代码运行后,不会从ARP中删除MSI项

我找到了这些链接,但我不知道它是否相关:https://stackoverflow.com/questions/17523974/how-to-uninstall-msi-using-its-product-code-in-c-sharp检查卸载是否成功

使用c#(DTF)中的产品代码卸载MSI时遇到的问题

  1. 如果你需要成为管理员,那么你就需要成为管理员。允许受限制的用户更改受限制的系统区域将是一个安全漏洞。

  2. 你使用了"链"这个词,所以看起来InstallShield安装是一个多msi安装,也许是被抑制的嵌入式UI。所以看起来以前的msi是作为单一产品视图安装的,看起来它们都被卸载了,也是作为单一产品视图-它们都卸载了。这可能是最初的意图——使多个msi作为一个产品出现,所有安装和卸载都是一样的。另外,如果IS的安装是一连串的msi,那么你肯定会替换它们(或升级它们),对吗?这也是Burn和BAs将要做的。

  3. 哪个MSI的ARP表项?从你的帖子中不清楚是哪个MSI,假设你可能指的是IS安装的链接MSI之一。你确定它是一个MSI条目吗?它可能是由InstallShield放置的链接产品条目,而不是MSI条目。当然,如果你卸载了MSI,它的ARP条目将被删除,但可能需要刷新才能看到它真的消失了(但这是Windows的问题)。链式MSI产品(通常也是Burn)将抑制单个MSI ARP项,而支持包含多个MSI的单个条目。