【问题标题】:Windows Installer-Avoid FileinUse dialog box when Installing a packageWindows Installer - 安装包时避免使用 FileinUse 对话框
【发布时间】:2018-11-27 17:57:04
【问题描述】:

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

【问题讨论】:

标签: wix windows-installer reboot file-in-use restartmanager


【解决方案1】:

“短”回答

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

下面是文件使用中的问题Restart Manager 的小细节 - 旨在快速查看文件使用中和重启问题。

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

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

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

请至少略读其余答案以了解更多详细信息和上下文。


重启管理器

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


重启管理器:是一种新的 C 风格 API,从 Windows Vista 和 Windows Server 2008 开始可用。重启管理器由单个 DLL 组成strong> 应用程序可以加载以访问Restart Manager 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) 然后Restart Manager可以重启 完成安装后的应用程序(可以禁用重新启动)。

更多技术资料:


重启管理器配置:有许多属性会影响重启管理器如何与 Windows Installer 一起运行:

使用Restart Manager 时,使用MsiRMFilesInUse 对话框代替FileInUse dialog 来显示已锁定文件的应用程序列表。

注意!整个Restart Manager 功能也可以通过策略禁用:


文件使用中

如果您没有时间或资源来实现与 Restart Manager 的适当互操作性(坦率地说,这是在 Windows 开发的这一点上花费您的资源的唯一明智的事情),那么有一些事情可能很高兴知道:

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

更多链接

【讨论】:

  • 非常感谢您让我知道所有可能的选项。我的更新安装中的主要问题是,我无法强制关闭正在使用的文件(应用程序或服务),因此我必须将它们排入安装队列并在文件发布时安装它们,这通常在系统重新启动时发生。 @Stein Åsmul
  • 很抱歉用很多“选项”“向您发送垃圾邮件”(并非所有选项都与您相关)。答案是为潜在的重复使用而编写的。希望你在那里找到有用的东西。如果您需要交互式安装(静默会解决问题?),那么也许检查上面答案中的最后一个链接?
  • 所有答案对我都有帮助,我学到了一些新东西。由于我已将更新作为补丁组策略发送,因此没有提供交互式安装选项。在这种情况下,您还有其他方法可以建议我吗?
  • 这些是服务吗?还是常规的桌面应用程序?
  • 主要是桌面应用程序,但有时我也会发送服务更新
【解决方案2】:

假设您是包作者,我建议您遵循规范,即使用 MsiRMFilesInUse 对话框。但是,如果您仍然想尝试禁用某些功能,请首先了解 Using Windows Installer with Restart Manager 上的软件包作者指南:

  • MsiRMFilesInUse 对话框添加到您的包中。如果包中存在 MsiRMFilesInUse 对话框,则在完整 UI user interface level 上运行安装的 Windows Vista 用户可以选择自动关闭和重新启动应用程序。安装包可以包含 MsiRMFilesInUse 对话框和 FilesInUse 对话框的信息。 MsiRMFilesInUse 对话框仅在 Windows Vista 上至少安装了 Windows Installer 4.0 的程序包时才会显示,否则将被忽略。没有 MsiRMFilesInUse 对话框的现有程序包继续使用 FilesInUse 对话框运行。自定义转换可用于将 MsiRMFilesInUse 对话框添加到现有包。 最终用户通常在完整 UI user interface level 上运行安装。即使MsiRMFilesInUse 对话框不存在,基本 UI 或简化的 UI 级别安装也使用户可以选择使用 Restart Manager 来减少系统重新启动。静默 UI 级安装始终关闭应用程序和服务,在 Windows Vista 上,始终使用重新启动管理器。

    : : :

  • 包作者可以在MsiSystemRebootPending property 上建立一个LaunchCondition table 中的条件,以防止在系统重新启动挂起时安装他们的包。

  • 包作者和管理员可以使用MSIRESTARTMANAGERCONTROLMSIDISABLERMRESTARTMSIRMSHUTDOWN 属性和DisableAutomaticApplicationShutdown 策略来控制Windows Installer 和重新启动管理器的交互。

设置@987654334@=Disable,可能会从您的包中删除FilesInUseMsiRMFilesInUse 对话框,并可以选择调整System Reboots 上讨论的进一步设置(例如设置REBOOTREBOOTPROMPT 属性)可能具有你想要的效果。

如果您不是包作者,您可能在错误的论坛中提问。这 DisableAutomaticApplicationShutdown 策略听起来可以完成您所描述的大部分工作,并且适用于您机器上安装的所有软件包。它旨在供系统管理员使用,而不是包作者。或者,您可以创建转换(或在安装命令行上指定属性)以像包作者一样有效地更改包。

【讨论】:

    【解决方案3】:

    希望这里不要重复太多,但我会首先指出该对话框的原因是为了避免重新启动。您没有说明为什么要等待重新启动而不是使用可让您避免重新启动的正在使用的功能。还不清楚您下次重启的时间,问题是应用程序的安装在所有文件都被完全替换和更新后才完成。安装不完整的应用程序崩溃并不罕见,因为它的当前状态是一些新旧文件混合在一起。

    1. 没有 MsiRMFilesInUse 属性,所以设置它没有效果。

    2. MSIRESTARTMANAGERCONTROL 属性告诉 Windows 是使用旧的 FilesInUse 行为还是使用中检测的新的重新启动管理器 FilesInUse 方法。它不会关闭文件使用中的行为检测,它只是新旧方法之间的切换。由于检测方法不同,您可能会看到不同的行为,具体取决于实际使用的文件(旧方法仅检测到打开窗口的应用程序)。

    3. 您应该说明您使用哪个工具来构建您的 MSI 文件,因为它们具有不同的功能。 Visual Studio 设置几乎不支持自动关闭,除非您使用安装程序类安装服务,那么您的 Uninstall 方法可以扩展为在卸载时停止服务。如果您使用的是 WiX,则有 util::CloseApplication 功能。

    4. 支持的 Windows 关机方法是将您的应用程序与重新启动管理器集成,Stein 有链接。对于服务,使用 MSI ServiceInstall/ServiceControl 的“正常”服务安装会处理这个问题,但对于带有安装程序类的 Visual Studio 安装项目则不行。

    最后,创建一个 MSI 详细日志并查找正在使用的条目,通常带有 1603 错误(使用中的文件类型,而不是安装崩溃的类型)。如果对话框告诉您需要关闭的应用程序,您可能不需要此日志,因此只需专注于让它们在更新时停止的方法,因为这是一个更好的解决方案,而不是试图抑制默认的 Windows 行为。

    【讨论】:

    • 我想避免该对话框的原因是我不希望我的客户在中间停止他们的进程以完成更新。我希望在他们发布该文件后完成更新。我希望更新文件排队。要完成排队的文件更新,我需要一个重新启动提示。对于更新,我可以灵活地使用任何可以帮助我解决问题的工具。现在我已经尝试使用 WIX、Install Shield、Advanced Installer
    • Windows Installer 将在重新启动时自动将文件排队等待替换。您可以通过在静默模式下运行 MSI 来避免该对话框以及所有其他对话框。安装完成后将自动重新启动,除非您在命令行上指定 REBOOT=ReallySuppress 以防止此行为。据我所知,没有办法让 MSI 静默安装,然后在最后显示重启提示 - 所有对话框都被抑制。您只能使用开关/QN+ 显示成功消息。我希望该开关也能显示重启警告,但事实并非如此。
    • 如果您使用 WiX 的刻录功能(引导程序 / 链接程序)以静默模式安装所有 MSI 文件,然后检查系统是否已安排重新启动,该怎么办?您也需要在所有安装之前进行检查。 Some reboot checking info。再添加两个链接:Preventing installs until rebootdetect multiple sessions
    • 我尝试使用 WIX 引导程序,但没有运气。随着该 FileInUse 对话框的出现,如果我试图避免安装在该点(正在使用的文件)永远停止,直到文件被释放。但我想试试你建议的方式(静音模式)。现在我正在尝试使用批处理文件以静默模式安装文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多