Wix/MSI: 无法卸载

14

我为一个内部项目开发了一个Wix安装程序,但意外地发现在我的开发机器上无法卸载该安装程序,因为我收到了以下错误消息:

您正在尝试使用的功能位于不可用的网络资源上

该对话框指向从特性中安装的.msi的路径(该.msi确实存在,但已被重新构建,因此自安装以来已更改)。

我对这个对话框感到担忧,因为我曾经认为Windows Installer会跟踪安装的MSI文件,但这个对话框似乎表明我可以通过删除、移动或更改安装程序来破坏我的卸载程序。

事实是这样吗?

我需要做什么才能确保不会以这种方式破坏我的卸载程序?(我们需要保留在计算机上曾安装过的所有版本的安装程序副本吗?)

4个回答

13

最简单的解决方法是进行 recache/reinstall。构建一个新版本的MSI,该版本不会“损坏”(以任何方式损坏,在这种情况下,实际上可能根本没有损坏,您只需要一个新的源)。然后使用以下命令行:

msiexec /fv path\to\your.msi /l*v i.txt

这将复制你的.msi文件到缓存的MSI上,并执行修复操作。然后你将处于一个更好的状态。


我的问题是 - 我该如何防止这种情况在生产机器上发生,(或者我的MSI“损坏”了)我知道如何修复我的机器! :-) - Justin
查看详细日志文件以找出为什么需要原始源代码。你可能在 MSI 中有一个 bug,在卸载期间强制要求原始源代码。在解决此问题之前,您需要保留 MSI 文件... 这非常烦人。 :) - Rob Mensching

11

写安装程序的第一课是不要在自己的电脑上运行安装程序,除非安装程序已经到达成熟阶段并经过了多次QA测试。这就是为什么我们有集成实验室和虚拟机的原因。(有一句话是关于你不能在自己后院做的事情的。)

话虽如此,通常情况下卸载MSI不需要MSI文件,但也有可能需要。例如,如果在卸载期间调用ResolveSource操作,MSI将寻找.MSI文件。

现在有几种方法可以解决这个问题:

  1. 使用一个可用的MSI文件,并使用ORCA编辑它以匹配被安装的MSI文件的文件名、UpgradeCode、ProductCode和PackageCode。您应该能够从存在于%WINDIR%\Installer中的精简缓存MSI中获取所有这些信息。转到该目录并执行findstr -i -m SOMESTRING *.msi,其中SOMESTRING是某些唯一的内容,如ProductName属性。一旦知道了缓存MSI的名称,请在Orca中打开它以获取所需的属性。然后将这些属性放入可用的MSI的副本中,尝试进行卸载。不,这不是您安装的确切MSI,但通常足够接近。

或者

  1. 使用前端的Windows Installer清理实用程序(如果您仍然拥有它)和/或后端的MSIZAP实用程序,从MSI和添加/删除程序中清除有关该应用程序的所有信息。请注意,这并不实际卸载程序,因此您还需要编写脚本或以其他方式手动卸载程序的所有痕迹。

或者

  1. 重新映像您的工作站

我的问题是,我该如何阻止这种情况在生产机器上发生?我知道如何修复我的机器! :-) - Justin
1
我们需要保留在计算机上安装的所有安装程序版本的副本吗?是的。难道你不已经保存了所有进入生产环境的东西的副本吗?我知道我们有一个配置管理系统,它确保我们做到了,并且将其交付到了每个地方。如果你的问题是为什么会发生这种情况而不是如何摆脱它,那么记录卸载以查看为什么会要求 MSI。 - Christopher Painter

1
如果您确切知道出了什么问题(在开发过程中通常如此),我更喜欢打开Windows将用于卸载的MSI文件,并使用像Orca这样的工具直接编辑它,以修复或删除导致失败的部分。
例如:
  • 定位%WINDIR%\Installer中的MSI文件。该MSI应该是在您执行失败的卸载后,该文件夹中最后编辑的MSI文件。
  • 使用Orca打开msi文件。
  • 删除失败的部分 - 例如InstallExecuteSequence操作失败,这是一个非典型的场景。
  • 保存msi并关闭Orca以释放msi文件上的锁定。

0

1 - 你有在安装时尝试过“从源代码运行”吗?

这是一个选项,能够让你从其安装源运行某些文件。这通常与网络上的管理员镜像结合使用。请参见下面的图片。我没有尝试过,但我认为如果网络无法连接并且您正在尝试卸载,可能会出现“您正在尝试使用的功能位于不可用的网络资源上”。这只是一种理论,还有其他可能发生的情况。

enter image description here

2 - 您是否正在运行自定义脚本操作?如果是,您是将其提取到tmp文件夹中还是从已安装的文件或二进制表中运行?如果是,该自定义操作是否有条件仅在安装时运行?

3 - 您是否可能正在运行指向已安装文件的EXE自定义操作?如果是,则该文件可能无法在网络上访问。

4 - 您的用户个人资料文件夹是否重定向到网络共享?

5 - 您是否直接将任何内容安装到网络文件夹中?

还有很多其他可能性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接