仅为当前用户安装MSI时,不会卸载旧版本的应用程序(在“添加/删除程序”中显示两次)

时间:2014-04-01 15:23:49

标签: wix windows-installer msiexec

我有一个带有WiX安装程序的应用程序,其标准的Just Me / All用户选项设置了ALLUSERS属性。

当我安装" Just Me"选项,然后使用相同的" Just Me"安装更高版本的应用程序。选项,它显然不会检测旧版本的应用程序,并复制添加/删除程序中的条目(并且每个后续版本将在添加/删除程序中创建自己的条目)。

当我为所有用户选择"安装时,这种情况永远不会发生。选项 - 在这种情况下,旧版本将被删除。

这是InstallExecuteSequence:

    <InstallExecuteSequence>

      <!-- Only schedule this custom action for the 32-bit MSI.  -->
      <?if $(var.DependenciesPlatform)=x86 ?>
      <Custom Action="CA_Err32BitMsiOn64BitOS" After="LaunchConditions">
        <![CDATA[MsiAMD64 OR Intel64]]>
      </Custom>
      <?endif ?>

      <Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>

      <RemoveExistingProducts Sequence="1" />

      <Custom Action="LaunchApp" After="InstallFinalize" />

      <InstallInitialize></InstallInitialize>
      <RemoveShortcuts></RemoveShortcuts>
      <InstallFiles></InstallFiles>
      <CreateShortcuts></CreateShortcuts>
      <InstallFinalize></InstallFinalize>

      <ScheduleReboot After="InstallFinalize"/>
    </InstallExecuteSequence>

我也有这个升级元素:

    <Upgrade Id="$(var.UpgradeCode)">
      <!-- Detect any newer version of this product -->
      <UpgradeVersion Minimum="$(var.Version)" IncludeMinimum="no" OnlyDetect="yes" Property="NEWPRODUCTFOUND"/>
      <!-- Detect and remove any older version of this product -->
      <UpgradeVersion Maximum="$(var.Version)" IncludeMaximum="yes" OnlyDetect="no" Property="OLDPRODUCTFOUND"/>
    </Upgrade>

包和产品ID设置为????-...??

<Package Id="????????-????-????-????-????????????"
        InstallerVersion="200"
        Compressed="$(var.Compressed)"
        InstallPrivileges="elevated"
         /> 

 <Product Id="????????-????-????-????-????????????"
         Name="$(var.ProductFullName)"
         Language="$(loc.LANG)"
         Codepage="1250"
         Version="$(var.Version)"
         Manufacturer="Company"
         UpgradeCode="$(var.UpgradeCode)"
       >

UpgradeCode是常量。

这是指定ALLUSERS属性的方式:

<Publish Property="ALLUSERS" Value="{}"><![CDATA[FolderForm_AllUsers="ME" AND VersionNT>=400 AND Privileged=1 AND FolderForm_AllUsersVisible=1]]></Publish>

我使用/ i / l * vx选项运行了msiexec,但是我没有在日志中找到任何相关内容。

删除ALLUSERS属性 - 这可能是原因吗?我认为这是因为Publish元素,因为当我将Value更改为例如1,它不会删除属性。

MSI (c) (5C:E4) [10:15:14:807]: PROPERTY CHANGE: Deleting ALLUSERS property. Its current value is '1'.

执行RemoveExistingProducts,但不报告任何内容:

    MSI (s) (54:E4) [17:01:22:095]: Running ExecuteSequence
    MSI (s) (54:E4) [17:01:22:095]: Doing action: RemoveExistingProducts
    MSI (s) (54:E4) [17:01:22:095]: Note: 1: 2205 2:  3: ActionText 
    Action 17:01:22: RemoveExistingProducts. Removing applications
    Action start 17:01:22: RemoveExistingProducts.
    Action ended 17:01:22: RemoveExistingProducts. Return value 1.

为什么在&#34; Only Me&#34;选择了选项?

WiX 2.0.5805,遗憾的是我此时无法升级到更新版本的WiX

3 个答案:

答案 0 :(得分:1)

你应该发布日志,以防更多的眼睛检测到相关的东西。 FindRelatedProducts通常是查看它是否检测到先前版本的地方。

一般来说,这是有效的,你需要像WiX中的majorupgrade元素一样提供框架 - 默认情况下不会发生这种情况。 UpgradeCode必须与原始设置相同,ProductCode不同,ProductVersion在前3位数中递增。

答案 1 :(得分:0)

从Installshield检查此KDB条目:http://helpnet.installshield.com/installshield17helplib/IHelpISSetAllUsers.htm

Extraxt: &#34; ...新安装的ALLUSERS属性必须与已安装版本的属性匹配,才能使 FindRelatedProducts 操作成功进行升级安装。此外,如果仅为一个特定用户安装了以前的版本并且为所有用户安装了升级,则生成的安装已损坏,可能无法正确卸载。 ISSetAllUsers 通过重置ALLUSERS属性消除了这些问题。&#34;

我不知道Wix中有一个等效的内置功能,但你应该能够自己做一个自定义动作来检查它,而不会有太多麻烦。

答案 2 :(得分:0)

进一步的调试显示了问题的根源:FindRelatedProducts报告当前安装是每台机器。

MSI(c)(60:B8)[14:53:00:996]:FindRelatedProducts:当前安装是每台机器。产品'&lt;&gt;'的相关安装是按用户。跳过...

ALLUSERS属性仅在FindRelatedProducts之后修改(来自同一安装,请注意时间戳)。

MSI(c)(60:14)[14:53:05:885]:物业变更:删除ALLUSERS属性。它的当前值是'1'。

问题在于,ALLUSERS是在剧本中预先设定的。

<Property Id="ALLUSERS" Secure="yes">1</Property>

当其他人试图强制每台机器安装时,它可能留在WiX脚本中。

删除该行修复了问题。