如何在升级时删除密钥文件属性而不是重写文件

时间:2017-09-08 12:07:33

标签: windows-installer installer

我的MSI安装包含三个带密钥文件的组件。这些组件包括.mdf和.ldf文件。三个组件之一是具有客户数据的mdf和ldf,因此它还具有此组件的never overwritepermanent属性。

我们公司现在希望支持允许客户将数据库“移动”到不同的目录/驱动器。但是,当用户启动应用程序时,文件弹性会因缺少密钥文件而启动,并将新文件添加到原始目标位置。我想阻止这种行为。

我从.mdf文件中删除了密钥文件属性。在重大升级上一切都应该没问题;但是,安装尝试替换mdf和ldf数据库文件,即使使用永久和永不覆盖的属性集也是如此。

我的问题是,有没有一种安全的方法来处理从组件中删除密钥文件属性而没有在主要升级时覆盖文件?

更新

  • 我试图强制卸载,但如果我在主要升级之前强行卸载,这仍然是一个问题。 我怀疑这是因为即使在卸载时组件仍然存在。 never overwrite标志需要密钥文件或注册表键路径来确定是否应该安装它。

  • 我的期望是组件应该处理删除密钥文件属性并仍然遵守never overwrite和永久属性。根据测试,我的期望是错误的。

感谢。

2 个答案:

答案 0 :(得分:1)

MSI是一种部署技术 - 它的工作是将指定的文件安装到正确的位置,并确保它们是正确的版本。自修复功能(或弹性)是实现此目的的机制。你无法以任何合理的方式禁用它,但有几种方法可以解决这个问题。

移动已安装的文件后,Windows Installer将不再跟踪它们,Windows Installer会将基本文件版本放回到跟踪已安装状态(最初安装它们的位置)的位置。

1:空白组件GUID :可以为MSI组件设置空白guid。这将允许组件在首次安装时安装,从那时起,Windows Installer根本不会跟踪组件。据我所知,该组件永远不会被卸载,即使文件丢失,也不应该进行自我修复。我将在一秒钟内对此进行测试以验证。此外,在移动文件后,新的升级安装可能会将新的数据库文件放回默认的安装位置。

2:将已安装的数据库文件视为只读:我认为这是一个更好的选择。您可以像以前一样安装数据库文件,并将它们视为"只读"基本版本在其默认安装位置。然后,您更新应用程序,将这些已安装的数据库文件的副本复制到客户希望存储它们的位置 - 或您指定的默认位置。

Windows Installer永远不会跟踪新位置的文件,因此不会遭受任何意外覆盖,卸载或还原。您甚至可以向应用程序添加一项功能,以重新复制只读基本数据库文件以覆盖正在使用的文件,但为什么要这样做呢?这显然会删除所有用户创建的数据库内容。

关于将数据库文件复制到的位置。这可能是任何地方,甚至是我的文件"如果您希望每个用户拥有数据库的私有副本,则文件夹可以工作。但是,如果所有Windows用户都应共享一个实时数据库,我建议将这些文件放在Windows共享位置(URL)上。您甚至可以在设置中创建此类共享。

答案 1 :(得分:1)

我怀疑你实际上从未真正需要“永不覆盖”或“永久”,因为文件是否保留在系统上是使用ComponentID引用计数来管理,“延迟”(在InstallExecute之后)进行主要升级并设置启动条件(例如)禁止不属于升级的卸载。此外,Windows Installer也不会覆盖更改的用户数据文件:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa370531(v=vs.85).aspx

现在太晚了,但不清楚为什么这不是一个选择。

您的问题的一般问题是您对MSI文件进行了一些未完全描述的更改,并且您没有说过升级是提前还是延迟,所以无法知道是什么你看到的是否是预期的。无论您做什么都有迁移问题,因为当前的ComponentId使用这些属性(包括密钥文件)记录在系统上,并且您无法通过在MSI文件的构建中更改它们来更改该系统状态。

为避免修复,通常最好将文件的ComponentId设置为null。这标志着它们不受管理,因此在卸载时不会修复或删除它们。他们是你的。因此,我建议您再次启动“早期”主要升级(以便在干净状态下启动产品)并且您的DB文件具有null ComponentId。您需要首先将现有文件复制到此升级中的其他位置,因为如果DB的ComponentId不在主要升级中,它将重新计数到零并且可能在某些不确定状态下被删除或孤立。

要检查的内容:有时文件似乎被替换,因为主要升级是“早期”,例如在InstallInitialize之后,这基本上是卸载所有旧文件,然后安装新产品。如果是这样,那么您的文件不会被覆盖,但可能会被卸载,然后从升级安装中安装新文件。使用详细日志执行升级可能会验证。但是,根据您的描述,这不应该发生。希望你不是以某种方式设置REINSTALLMODE来强制文件替换。

允许数据库移动到其他位置并不是一个好主意。除了您已经遇到的Windows Installer修复之外,我怀疑您始终需要确切知道数据库文件的位置,以防您在升级开始时备份它们或在安装期间因某些原因更新它们。或者另一种产品需要知道它在哪里。也许它可以由管理员移动到受限用户无法访问的位置。与仅在推荐位置(通常是标准数据文件夹之一)中安装文件相比,这些错误机会会使事情变得更加复杂和容易出错。