主要升级期间卸载的组件

时间:2014-05-18 16:02:59

标签: iis wix installer windows-installer

我有一个支持主要升级的WiX安装程序。我发现在某些特定的测试环境中,升级时的安装程序会删除现有的未更改的组件。

这些(IIS Web应用程序池,IIS网站等)组件以这种方式安装在TARGETDIR下:

<Directory Id="TARGETDIR" Name="SourceDir">
      <Component Id="myComponent" Guid="MY-GUID">
        <iis:WebAppPool Id="ID" Name="MyWebAppPool" Identity="networkService" ManagedPipelineMode="classic" ManagedRuntimeVersion="v4.0"/>
      </Component>
</Directory>

对于问题环境,升级时会删除应用程序池。 升级是以这种方式编写的:

<MajorUpgrade Schedule="afterInstallExecute" DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit."  AllowDowngrades ="no" />

在升级日志中,我看到以下条目:

  

MSI(s)(58:20)[11:22:58:433]:允许卸载共享   组件:{MY-GUID}。其他客户   存在,但安装到不同的位置

在没有看到问题的环境中(即升级时未卸载组件),我看到这些日志条目:

  

MSI12cb8.LOG:9594:MSI(s)(10:EC)[09:36:37:068]:不允许   卸载组件:{MY-GUID}   因为另一个客户存在

我能够提出的唯一解释是,对于问题环境,TARGETDIR在初始安装和升级之间发生了变化。 According to RobTARGETDIR设置为最大的驱动器。如果系统上最大的驱动器(可用空间最多的驱动器?)在初始安装和升级之间发生更改,则组件的密钥路径将发生更改,从而导致组件在升级时被卸载。

问题

  • 这个解释听起来不错吗?
  • 如何解决此问题以升级现有产品?有没有办法在升级时将TARGETDIR设置为与初始安装相同的值?

2 个答案:

答案 0 :(得分:2)

发生了什么似乎是这样的:您的升级安装到某些TARGETDIR,您似乎在说您无法控制。在升级结束时,RemoveExistingProducts会卸载旧产品,其中包括删除应用程序池,因为正在卸载组件,可能是使用自定义操作(因为没有对应用程序池的本机支持)。从旧位置删除组件很好,因为那里不再需要它,但看起来删除应用程序池的自定义操作与该组件删除相关联,因此删除了应用程序池。换句话说,您已将应用程序池绑定到现在要求您进行就地升级的组件共享规则。另一种看待它的方式是,在这样的情况下,人们会添加一个&#34;而不是升级的提示&#34;删除应用程序池的CA上的卸载条件,以便它不会在升级时删除应用程序池,因为它可能刚刚在新位置创建,如您的情况。

相当长的啰嗦,对不起,但是通常可以通过在系统上搜索一些内容(例如注册表项)来满足就地升级的要求,并将安装文件夹设置为位置,禁止任何可以更改它的UI。你也应该开始控制你的安装文件夹(你的声音就像你的安装可以在任何地方一样)。这里的关键词是&#34;默认&#34;。如果你不能设置它,TARGETDIR会默认某个地方。

答案 1 :(得分:0)

对于偶然发现类似问题的其他人,我使用自定义操作解决了这个问题。正如@PhilDW指出的那样,NOT UGPRADINGPRODUCTCODE不适用于现有安装。我无法想办法在升级时停止删除应用程序池。相反,我添加了一个针对删除后计划的自定义操作,如果删除了应用程序池,则会将其添加回来。

<CustomAction Id="CreateAppPoolCustomAction.SetProperty" Return="check" Property="CreateAppPoolCustomAction" Value="AppPoolName=$(var.AppPoolName)" />
<CustomAction Id="CreateAppPoolCustomAction" BinaryKey="MyCustomActions.CA.dll" DllEntry="CreateAppPoolCustomAction" Execute="deferred" Return="check" Impersonate="no" />

<InstallExecuteSequence>
  <Custom Action="CreateAppPoolCustomAction.SetProperty" Before="CreateAppPoolCustomAction" />
  <Custom Action="CreateAppPoolCustomAction" After="RemoveExistingProducts">WIX_UPGRADE_DETECTED AND NOT (REMOVE="ALL")</Custom>
</InstallExecuteSequence>

MyCustomActions.dll中的C#自定义操作使用Microsoft.Web.Administration.ServerManager创建应用程序池(如果它已丢失)。