安装程序包时,Windows Installer-Avoid FileinUse对话框

时间:2018-06-18 20:32:29

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

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

3 个答案:

答案 0 :(得分:2)

“简短”答案

  

本质上:您可以 1) 完全安静地运行(禁止使用中的文件对话框), 2) 关闭锁定   正常地(应用程序更新以允许正常关闭-有或没有重启管理器支持), 3) 确保适当的服务控制(如果处理服务), 4) 强制杀死   正在运行的进程(“大锤方法”), 5) 如果检测到锁定,则中止设置 6) < / strong> 部署前需要注销 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 ,应用可以加载以访问Restart Manager API想法是,重新启动管理器将通过使应用程序/服务遵循一系列准则来自动关闭并重新启动您的应用程序:

  

本质上 The whole idea is basically to prefer restarting applications rather than restarting the OS 。为此: 1)   您的应用程序使用命令调用RegisterApplicationRestart()   指定用于最终重启的行-它“注册”重启   管理。 2) 您的应用程序监视WM_QUERYENDSESSION   消息并以适当的方式正常关闭数据保存   当被告知要这样做时。 3) 然后,Restart Manager可以重新启动   应用程序安装完成后(可以禁用重新启动)。

更多技术资料:


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

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

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


FileInUse

如果您没有时间或资源来实现与Restart Manager的适当互操作性(坦率地说,这是Windows开发中目前唯一将资源投入的明智之举),那么可能要知道的事情:

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

一些其他链接

答案 1 :(得分:0)

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

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

         

    :::

  •   
  • 软件包作者可以在LaunchCondition tableMsiSystemRebootPending property中建立一个条件,以防止在系统重新启动挂起时安装其软件包。

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

设置MSIRESTARTMANAGERCONTROL=Disable,可能会从包中删除FilesInUseMsiRMFilesInUse对话框,并有选择地调整关于System Reboots的其他设置(例如设置{{3} }或REBOOT属性)。

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

答案 2 :(得分:0)

希望这里不要重复太多,但我将首先指出该对话框的原因是避免重新启动。您没有说为什么要等待重新启动,而不是使用使您避免在一开始就重新启动的使用中功能。还不清楚何时需要下次重新启动,问题是在所有文件都被完全替换和更新之前,应用程序的安装才完成。未完全安装的应用程序崩溃的情况并不罕见,因为其当前状态是一些旧文件和新文件混合在一起。

  1. 没有MsiRMFilesInUse属性,因此设置它无效。

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

  3. 您应该说出正在使用哪个工具来生成MSI文件,因为它们具有不同的功能。 Visual Studio安装程序实际上不支持自动关闭,除非您使用安装程序类安装服务,然后可以扩展您的Uninstall方法以在卸载时停止该服务。如果您使用的是WiX,则有util :: CloseApplication功能。

  4. 受支持的Windows关闭方法是将您的应用程序与Restart Manager集成在一起,Stein具有链接。对于服务,使用MSI ServiceInstall / ServiceControl进行“常规”服务安装可解决此问题,但不适用于具有安装程序类的Visual Studio安装项目。

最后,创建一个MSI详细日志并查找使用中的条目,通常会出现1603错误(使用中的文件,而不是安装崩溃的文件)。如果对话框告诉您需要关闭的应用程序,则可能不需要此日志,因此,请着重于使它们停止更新的方法,因为这是一个更好的解决方案,而不是尝试抑制默认的Windows行为。