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

时间:2015-06-06 18:55:49

标签: c# wix windows-installer wix3.9 dtf

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

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

ARP中只有自定义BA条目以及安装盾牌引导程序条目,两者都具有相同的名称。

经过一些研究后,我了解到Windows Installer XML(WiX)将Microsoft.Deployment.WindowsInstaller互操作库作为部署工具基础(DTF)的一部分提供,可以用来卸载MSI。

我使用以下代码卸载MSI。

base_sales <- df[df$Year==2000, c("Product","Sales")]
base_sales <- plyr::rename(base_sales, c("Sales" = "Sales_2000"))

print(base_sales)
#   Product Sales_2000
# 1       A          1
# 4       B          4
# 7       C          7

df2 <- merge(df,base_sales,by="Product")
df2$adj_Sales <- df2$Sales / df2$Sales_2000

print(df2)
#   Product Year Sales Sales_2000 adj_Sales
# 1       A 2000     1          1    1.0000
# 2       A 2001     2          1    2.0000
# 3       A 2002     3          1    3.0000
# 4       B 2000     4          4    1.0000
# 5       B 2001     5          4    1.2500
# 6       B 2002     6          4    1.5000
# 7       C 2000     7          7    1.0000
# 8       C 2001     8          7    1.1429
# 9       C 2002     9          7    1.2857

我面临的问题如下所述

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

    1. 在卸载时(当我以管理员身份运行customBA时),上面提到的代码也会删除带有它的链包,我不希望它这样做。

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

  2. 我找到了这些链接,但我不知道它是否相关: https://stackoverflow.com/questions/17523974/how-to-uninstall-msi-using-its-product-code-in-c-sharp Checking for successful uninstall

1 个答案:

答案 0 :(得分:1)

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

  2. 您使用了“chain”这个词,因此看起来InstallShield设置是多MSI安装,可能是嵌入式UI被抑制。因此,以前的MSI似乎作为单一产品视图安装,看起来它们都被卸载,也作为单个产品视图 - 它们都卸载了。这可能是首先意图 - 使多个MSI显示为单个产品,全部安装并全部卸载。此外,如果IS安装是一系列MSI,那么你肯定会将它们全部替换掉​​(或升级它们),是吗?这就是Burn和BA也会做的事情。

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