Windows Installer - 安装包时避免 FileinUse 对话框

tej*_*eja 3 windows-installer wix reboot file-in-use restartmanager

当有文件的更新补丁必须用现有文件替换时,如果其中一个文件正在被任何进程使用,则会弹出一个正在使用的文件对话框。我想避免那个对话框并使该文件排队等待安装,以便在系统重新启动时安装它。我已经读到在重新启动时排队更新文件是 Windows 安装程序的内置功能。有人可以建议我删除那个 FileInUse 对话框的方法。我尝试将“MsiRMFilesInUse”属性设置为“0”,但没有奏效。

Ste*_*mul 10

“简短”答案

本质上:您可以完全静默运行(抑制正在使用的文件对话框),正常关闭锁定应用程序(应用程序更新以允许正常关闭 - 有或没有重启管理器支持),确保适当的服务控制(如果处理服务),强制终止正在运行的进程(“大锤方法”),如果检测到锁定则中止设置在部署前需要注销为每个版本安装到一个新文件夹(并行安装)等...1) 2) 3) 4) 5) 6) 7)

下面是对使用中文件问题重新启动管理器的一个小钻取- 旨在快速查看使用中的文件和重新启动问题。

就你的实际问题而言。我不会惹FileInUse dialog(s). 它不会真正解决你的问题。也许考虑这些指针:

  • 服务:如果您正在安装服务并且它们触发了文件使用中的问题,请参阅底部的服务部分以确定您是否可以改进设置的逻辑。
  • 静默模式:在静默模式下运行设置将是抑制此类正在使用的文件对话框的明显方法,但是您必须抑制自动重启,否则系统将在没有警告的情况下自发重启。详情如下。
  • 策略:请检查您的机器/标准 PC 配置是否启用了DisableAutomaticApplicationShutdown 策略。请参阅下面的详细信息。
  • 注册表位置是:HKLM\Software\Policies\Microsoft\Windows\Installer
  • 我不确定启用此策略是否会使使用中的文件对话框消失。
  • 重新启动管理器合规性:也许检查您是否应该更新您的应用程序以注意重新启动管理器功能的设计- 允许通过正常关闭的应用程序进行自动魔法和无问题升级(前提是您正在处理可以实际更改的二进制文件)你自己 - 换句话说:你有源代码)。下面有很多细节
  • “Setup Overkill”:如果您认为在升级过程中毫不留情地终止应用程序是安全的,请参阅下面的部分。
  • 正常关机自定义操作:如果您使应用程序能够正常关机(重启管理器样式),那么您也可以通过立即模式自定义操作(如果重启管理器是被策略禁用 - 不过要注意计时和超时问题 - 特别是对于静默运行 - “死锁”)。
  • 并排安装:下面的一些详细信息。一些公司决定真正并行安装应用程序,因此他们的新部署不会出现文件覆盖问题(旧版本卸载可能仍会触发所需的重新启动)。

我想如果检测到锁定的文件,您也可以中止安装,或者您可以要求用户在运行安装之前注销- 如果您有分发系统。

请至少略读答案的其余部分以获取更多详细信息和上下文。


重启管理器

您的应用程序和服务应该准备好被重启管理器关闭,并保存干净重启所需的用户数据和状态信息。这需要对应用程序/服务进行更新和更改,以符合关闭和重新启动应用程序的标准。


重启管理器:是从 Windows Vista 和 Windows Server 2008 开始提供的新 C 样式 API。重启管理器由单个 DLL 组成,应用程序可以加载该DLL以访问重启管理器 API这个想法是,通过让应用程序/服务遵循一组准则,重启管理器将在安装/更新期间自动关闭和重启您的应用程序:

本质上The whole idea is basically to prefer restarting applications rather than restarting the OS - and also to avoid reboots in general.。为此:1) 您的应用程序RegisterApplicationRestart()使用为其最终重启指定的命令行调用- 它“注册”以进行重启管理。2)您的应用程序监视WM_QUERYENDSESSION 消息并在被告知时以适当的方式优雅地关闭保存数据。3)然后重新启动管理器可以在安装完成后重新启动应用程序(可以禁用重新启动)。

更多技术资料:


重启管理器配置:有许多属性会影响重启管理器与 Windows 安装程序的运行方式:

使用Restart Manager 时,将使用MsiRMFilesInUse对话框而不是FileInUse 对话框来显示已锁定文件的应用程序列表。

注意!整个重启管理器功能也可以通过策略禁用:


文件在用

如果您没有时间或资源来实现与Restart Manager 的正确互操作性(坦率地说,这是目前在 Windows 开发中花费您的资源的唯一明智之举),那么有一些事情可能对您有益知道:

  • 静默安装:首先要指出的是,FileInUse如果您在静默模式下安装安装程序,将不会出现对话框。但是,除非您指定REBOOT=ReallySuppress property.
  • 服务:您是否安装了在升级过程中没有正确关闭的服务?有built-in MSI constructsshut down services升级过程中-在业务控制表
  • 如果使用得当,此 ServiceControl 功能意味着您不再遇到任何触发重新启动以被替换的服务可执行文件的问题(除非服务本身出现关闭问题)。
  • 这是一个内置的 MSI 结构,如果使用得当,效果很好。人们不应诉诸自定义操作来安装服务。
  • 应用程序支持:除了与Restart Manager 的互操作性之外,某些应用程序(有文件正在使用)可以在被告知关闭时正常关闭。
  • 例如App.exe -shutdown,某些应用程序在发送命令行时会正常关闭,尽管尚未编写为可与Restart Manager互操作。也许系统托盘应用程序不为用户保存数据?
  • 这显然必须针对相关应用程序专门实现 - 如果您这样做,此时您应该改用重新启动管理器(或者另外,您可以调用相同的实际关闭实现)。
  • “Setup Overkill”:某些设置旨在仅终止安装时打开的应用程序进程。
  • 不理想,但它可以适用于在后台运行的某些类型的应用程序(好吧,这很疯狂,但它是定期完成的)。
  • 使用自定义操作或部署工具中可用的任何内置结构。
  • REINSTALLMODE:您是否可能REINSTALLMODE="amus"在安装过程中使用强制覆盖文件?
  • 这会显着增加正在使用的文件数量和重新启动提示,因为所有文件都被尝试替换 - 通常是不必要的 - 特别是在repairmodify场景中。
  • 对于安装服务的安装程序来说尤其如此,这些服务在尝试覆盖其二进制文件之前未正确使用ServiceControl 表来关闭服务。
  • Side-By-Side Installations (SO):添加这个以供参考,它超出了“通常相关”的范围。在我看来,这种方法需要相当多的技术更改和适当的分发流程才能成功 - 它主要用于内部核心企业应用程序(可以完全控制应用程序)。
  • 新版本,针对新安装文件夹(将版本号添加到安装文件夹?),通常可以安装而不会出现任何文件覆盖问题(除非更新了任何系统共享文件 - 在这种情况下,您应该将它们拆分为单独的先决条件 MSI -具有自己的分发逻辑 - 在需要时 - 这应该很少)。
  • 旧版本的卸载仍会触发重新启动要求,因为文件可能正在使用中且尚未准备好卸载。明显地。
  • 您可以为设置组件使用自动 GUID - 因此 MSI 可以以正确的方式单独跟踪它们。您通常必须消除所有设置静态组件的需要(或者它们必须安装到共享位置并保持静态 - 或者在需要时通过单独的先决条件 MSI 进行更新)。
  • 整个应用程序必须“表现良好”才能并行使用和安装。换句话说,不要争夺文件关联并正确加载所有资源并管理可以在实例之间共享的数据库连接等......
  • 您将版本号添加到开始菜单快捷方式?不知何故,您必须能够区分安装并启动所需的版本 - 显然。应用程序应该知道它的分身吗?
  • 我可能会考虑为每个版本设置一个新的升级代码,以便将产品彼此分离,然后使用分发系统卸载旧的旧版本(作为周末或每月的批处理作业?)。这不是 100% 必要的,这完全取决于您的情况。很多事情在计划一致的情况下都可以奏效——显然。
  • 不适合正常并行操作的应用程序有时可能会使用App-V(虚拟包)进行虚拟化和沙盒化,以允许不同版本共存于同一个盒子上。新挑战。

一些进一步的链接


归档时间:

查看次数:

3678 次

最近记录:

4 年,7 月 前