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

Issue faced during uninstall MSI using its Product Code in c#(DTF)

我正在创建一个 CustomBA,它将取代现有的安装防护 Bootstrapper(我真的不知道它叫什么)。

我们安装的 MSI 数量与安装防护罩使用的数量相同,所以这没问题。 ARP 中的所有 MSI 条目都被删除,因为我们正在使 MSI 的 Visible="no".

ARP 中只有 Custom BA 条目和 Install shield Bootstrapper 条目可用,两者同名。

所以经过一番研究后,我了解到 Windows Installer XML (WiX) 将 Microsoft.Deployment.WindowsInstaller 互操作库作为 Deployment Tools Foundation (DTF) 的一部分发布,它可以是用于卸载 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,否则它会抛出错误 "Error 1730.You must be an Administrator to remove this application."。有没有办法在没有管理员的情况下 运行 CustomBA 并卸载 MSI。

    1. 卸载时(当我 运行 作为管理员的 customBA 时),上面提到的代码也删除了它的链包,我不希望它这样做。

    2. 卸载代码运行后,它不会从 ARP 中删除 MSI 条目。

我找到了这些链接,但我不知道它是否相关: Checking for successful uninstall

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

  2. 您使用了 "chain" 这个词,所以看起来 InstallShield 安装程序是一个多 MSI 安装,可能带有被抑制的嵌入式 UI。因此,以前的 MSI 似乎是作为单一产品视图安装的,看起来它们都已卸载,也作为单一产品视图 - 它们都已卸载。这可能是最初的意图 - 让多个 MSI 显示为一个产品,所有安装和卸载。此外,如果该 IS 安装是 MSI 链,那么您肯定会全部替换它们(或升级它们),是吗? Burn 和 BAs 也会这样做。

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