MSI 安装程序 InstallValidate 如何确定正在使用的文件?

2024-01-21

我正在尝试找出如何防止重新启动管理器在卸载应用程序时检测到需要重新启动。

我的应用程序有一个 Windows 服务,它使用本机 DLL(Tanuki Wrapper)并创建另一个写入一些日志文件的进程(Java)。我正在使用 WiX Toolset,但我对 MSI 安装程序本身更感兴趣。我一直在使用 Orca 手动尝试一些更改。作为参考,相关的 WiX 配置是(还有一些其他的 JAR 组件等我省略了):

<DirectoryRef Id="logs3327407xx">
    <Component Guid="344ec345-bdd7-4c1d-801f-55ddf9e07735" Id="logs_wrapper_log88580873x">
        <File DiskId="1" Id="fl_logs_wrapper_log88580873x" Name="wrapper.log" Source="logs\wrapper.log"/>
    </Component>
</DirectoryRef>
<DirectoryRef Id="bin97543xxxx">
    <Component Guid="67c93dd8-36ad-427f-9d79-64a07c719eea" Id="bin_wrapper_windows_x86_64_exe189026768">
        <File DiskId="1" Id="fl_bin_wrapper_windows_x86_64_exe189026768" KeyPath="yes" Name="wrapper-windows-x86-64.exe" Source="bin\wrapper-windows-x86-64.exe"/>
        <ServiceInstall Account="LocalSystem" Arguments="-s &quot;..\conf\wrapper.conf&quot; wrapper.console.flush=true" Description="My Example Service." DisplayName="My Service" ErrorControl="ignore" Id="srvc_i_bin_wrapper_windows_x86_64_exe189026768" Interactive="no" Name="MyService" Start="auto" Type="ownProcess" Vital="yes"/>
        <ServiceControl Id="srvc_c_bin_wrapper_windows_x86_64_exe189026768" Name="MyService" Remove="uninstall" Start="install" Stop="both" Wait="yes"/>
    </Component>
</DirectoryRef>
<DirectoryRef Id="bin_wrapper_native490235675">
    <Component Guid="d7e4295a-1ce5-4dd2-aa92-230caac34247" Id="bin_wrapper_native_wrapper_windows_x86_64_dll156404367">
        <File DiskId="1" Id="fl_bin_wrapper_native_wrapper_windows_x86_64_dll156404367" Name="wrapper-windows-x86-64.dll" Source="bin\wrapper\native\wrapper-windows-x86-64.dll"/>
    </Component>
</DirectoryRef>

我明白这里面有逻辑InstallValidate确定文件是否正在使用的操作。它将根据以下情况使用重新启动管理器或 FilesInUseMSIRESTARTMANAGERCONTROL 属性 https://msdn.microsoft.com/en-us/library/aa370377(v=vs.85).aspx.

如果我使用重新启动管理器,则会打开一个对话框,提示需要重新启动。日志说:

MSI (s) (1C:7C) [12:27:14:679]: Doing action: InstallValidate
Action ended 12:27:14: MigrateFeatureStates. Return value 0.
MSI (s) (1C:7C) [12:27:14:679]: PROPERTY CHANGE: Deleting MsiRestartManagerSessionKey property. Its current value is 'f2947dee632d694f8b4f1795ff254092'.
...
MSI (s) (1C:7C) [12:27:14:679]: Component: bin_wrapper_windows_x86_64_exe189026768; Installed: Local;   Request: Absent;   Action: Absent;   Client State: Local
MSI (s) (1C:7C) [12:27:14:679]: Component: bin_wrapper_native_wrapper_windows_x86_64_dll156404367; Installed: Local;   Request: Absent;   Action: Absent;   Client State: Local
MSI (s) (1C:7C) [12:27:14:679]: Component: logs_wrapper_log88580873x; Installed: Local;   Request: Absent;   Action: Absent;   Client State: Local
...
MSI (s) (1C:7C) [12:27:14:741]: RESTART MANAGER: Detected that application with id 11368, friendly name 'java.exe', of type RmCritical and status 1 holds file[s] in use.
MSI (s) (1C:7C) [12:27:14:741]: RESTART MANAGER: Did detect that a critical application holds file[s] in use, so a reboot will be necessary.
MSI (s) (1C:7C) [12:27:14:741]: Note: 1: 1610 

它实际上并没有说出文件,但如果我禁用重新启动管理器并使用 FilesInUse ,则不会出现对话框。这次日志显示:

Info 1603. The file C:\...\wrapper-windows-x86-64.exe is being held in use by the following process: Name: wrapper-windows-x86-64, Id: 11004, Window Title: '(not determined yet)'. Close that application and retry.
MSI (s) (1C:8C) [12:33:23:458]: 2 application(s) had been reported to have files in use.
Info 1603. The file C:\...\wrapper-windows-x86-64.dll is being held in use by the following process: Name: java, Id: 8284, Window Title: '(not determined yet)'. Close that application and retry.
MSI (s) (1C:8C) [12:33:23:458]: Note: 1: 2727 2:  
MSI (c) (AC:28) [12:33:23:458]: File In Use: -wrapper-windows-x86-64- Window could not be found. Process ID: 11004
MSI (c) (AC:28) [12:33:23:458]: File In Use: -java- Window could not be found. Process ID: 8284
MSI (c) (AC:28) [12:33:23:458]: No window with title could be found for FilesInUse

有人可以解释一下如何InstallValidate确定哪些文件正在使用?

另外,如何防止重新启动管理器说文件正在使用中,一旦服务停止,这些文件将被释放?

作为一个附带问题,为什么重新启动管理器不显示 MsiRMFilesInUse 对话框?我已经检查了所有要求MsiRMFilesInUse 对话框 https://msdn.microsoft.com/en-us/library/aa370379(v=vs.85).aspx据我所知,它们都是真的。

我记得在某处读到过使用ServiceControl而不是自定义操作可以帮助重新启动管理器知道那些File在那之内Component由服务使用。我尝试将文件添加到其中Component但这似乎没有任何区别。


InstallValidate 和与 ServiceControl 相关的使用中文件的行为并不复杂。如果某个服务正在使用某个文件,并且该服务位于 ServiceControl 表中并标记为在卸载时停止,那么它将忽略这些文件的使用行为。将文件放在同一个组件中没有什么区别,显然 Windows 无法知道服务代码将关闭导致文件使用情况的进程。据我所知,无法告诉 InstallValidate 某些文件在要卸载时确实不会使用。

当不使用重新启动管理器时,您不会看到旧式的 FilesInUse 对话框,因为它需要一个活动窗口,可以提示用户关闭该窗口以关闭应用程序。这就是没有活动窗口的托盘应用程序不会导致 FilesInUse 对话框的原因。我不能确定,但​​在我看来,第一个涉及重新启动管理器的日志提取实际上是 RMFilesInUse,我认为这就是您看到的对话框。

如果您看到的唯一文件使用问题与服务将关闭的 java 进程有关,则可能的解决方案是:

  1. 卸载期间禁止显示所有正在使用的文件对话框。
  2. 使用 ServiceControl 关闭您的服务。
  3. 确保您的 ServiceControl 为 Wait=1,并且在 java 进程终止之前它不会响应“停止服务”请求(假设您可以显式关闭它)。

Windows 并没有愚蠢到仅仅因为文件在 InstallValidate 时正在使用而强制重新启动,但在实际删除时情况并非如此。因此,如果您可以确保文件在实际需要删除/替换/其他操作时不再使用,则无需重新启动。看到该对话框然后发现实际上不需要重新启动的情况并不罕见。因此,如果您抑制该对话框并关闭所有内容,您将不会看到重新启动请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MSI 安装程序 InstallValidate 如何确定正在使用的文件? 的相关文章

  • 如何使用 Wix 运行 sql 脚本创建数据库

    我在使用 Wix 创建数据库时遇到问题 我能找到的示例 参见下面的链接 都是首先使用 wix 创建数据库并运行创建表 sql 脚本 问题是我需要将 wix 设置为使用 CREATE DATABASE 运行 sql 脚本来创建数据库和表 而不
  • MSI 安装程序,64 位操作系统,写入 \windows\system32\inetsrv 文件夹

    在 Windows Server 2008 64 位上 我需要一个 msi 安装程序文件来将一些文件写入 windows system32 inetsrv 文件夹 这些文件是一些 XML 架构验证文件 C XmlReaderSettings
  • 执行卸载之前停止 Windows 服务

    我有一个安装程序 它安装了一些组件 包括 Windows 服务 安装后它将启动使用 CustomAction 安装到系统上的服务 当我卸载应用程序时出现问题 安装程序要求先关闭应用程序 然后再继续 我创建了一个将停止服务的自定义操作 并通过
  • 是否有其他方法可以访问延迟自定义操作中的会话详细信息?

    我有一个自定义操作 需要获取以下值才能将某些部分从安装文件夹复制到 VS2010 文件夹 VS2010目录路径 VS2010DEVENV财产 安装路径 INSTALLLOCATION财产 为了提供足够的权限 我将自定义操作设置为Execut
  • 在 WiX 文件中,Name="SourceDir" 指的是什么?

    WiX 文件似乎总是包含这一行
  • 警告 LGHT1076:ICE91:文件“doc_code_file1”将安装到每个用户目录“code_Simple”

    即使我添加了注册表值设置 它给出以下警告 warning LGHT1076 ICE91 The file doc code file1 will be installed to the per user directory code Sim
  • Wix 4 收获目录的解释?

    我正在尝试学习 Wix 4 0 来为我正在开发的应用程序创建安装程序 构建我的应用程序后 我在一个文件夹中有一堆文件 我想将它们安装到程序文件中 我已经读到收获功能允许我简化此过程并为整个目录创建组件映射 但我不确定这是什么example
  • 如何在自定义操作期间移动进度条

    在安装程序中运行自定义操作时 没有进度条 我们正在使用立即 C 管理代码自定义操作 运行自定义操作时是否有其他方法显示进度 预先致谢 维卢 使用 ProgressText 元素 模板 属性是放置标记以反映进度的地方 例如 请参阅标准 Ins
  • 如何禁用恢复 Visual Studio 安装程序项目丢失的文件?

    我创建了一个使用来自暴雪 API 服务的图像的程序 我为该程序创建了一个安装程序 并将图像放置在 用户的应用程序数据文件夹 中 安装非常好 图像被解压到文件夹 AppData Roaming MyApp 中 如果需要删除图像 程序将从暴雪服
  • CAQuietExec 命令字符串必须以带引号的应用程序名称开头

    好吧 我相信我正在按照 Wix3 5 中的在线示例执行安静命令 但我似乎无法让我的命令被引用
  • 如何使用 SCCM 服务器推送带参数的 MSI

    我想使用 SCCM 服务器推送带有参数的 MSI 安装程序 IE msiexec exe i setup msi INSTALLFOLDER SpecifiedInstallationLocation CONFIGFILE FileName
  • 在 WiX 中轻量运行时,DefaultDir 无效

    我只是想做一个安装程序 将一些文件移动到程序文件中 设置开始菜单链接 并出现在要卸载的添加 删除程序中 目前我很乐意点击开始菜单链接 因为这看起来相对简单 需要注意的是 我特别希望可以通过脚本构建它without任何类型的全局安装 这意味着
  • 无法使用wix工具集创建postgresql数据库

    我正在尝试使用 Wix ToolSet 在 PostgreSQL 中创建数据库 但总是收到错误 错误 2147467259 无法创建 SQL 数据库 pontow 错误详细信息 未知错误 当我尝试创建数据库或错误 无法连接到 SQL 数据库
  • IIS 中的 WIX 和证书

    我正在尝试设置我的安装 以便使用 WIX 配置我的站点及其证书 我可以在 IIS 中查看证书并有权访问 cer 文件 这就是我对证书的了解 所以请简化任何答案 即我不知道我的 BinaryKey 是什么 该证书已安装在计算机上 理想情况下
  • 手动创建 msix 包,无需 GUI 或 msi 安装程序

    谁能给我提示如何手动定义 msix 包 我的应用程序还没有 msi 包 所以我不能简单地转换它 有没有一种方法可以像配置文件一样创建 我可以手动定义哪些文件需要进入 msix 包 MSIX GUI Creator 也没有给我足够的控制权 非
  • Wix 安装结束后添加多个复选框

    我的 C 应用程序有一个设置 在设置结束时 我添加了一个建议启动应用程序的复选框 效果很好 但我无法添加第二个复选框来提议启动可选安装程序 有我的代码
  • 如何在 MSBuild 中创建新属性并在 WIX 中引用它

    我们需要创建一个属性来指示我们的软件版本 然后我们想在我们的 WIX 项目中使用它 即在 wxs 文件中引用它 我们不想在 wxs 文件中定义它 因为我们希望 MSBuild 也根据此版本号重命名输出文件 PropertyGroup 中的常
  • 如何说服 VS2005 msi 升级?

    我有一个使用 VS2005 用 C 编写的 Windows 服务 安装是通过一个向导调用 msiexec 来安装同样使用 VS2005 创建的 msi 文件 我在生成将从一个版本的服务升级到另一个版本的 msi 文件时遇到问题 向导程序负责
  • 用于检查和安装先决条件的安装项目与引导程序项目

    这是我的情况 我创建了一个普通的 WiX 安装项目 然后我尝试检查一些先决条件 例如是否安装了 NET 框架 我似乎无法从 WiX 安装项目中执行此操作 所以我创造 WiX Bootstrapper 项目 我能够检查并安装它们 先决条件 我
  • Windows 安装程序 (C#) 错误代码 2869

    我在 VS 2005 中有一个项目 其中有一个控制台应用程序和一个与安装该应用程序关联的安装项目 我在控制台应用程序中还有一个安装程序类 安装项目将使用它在安装前进行一些验证 这些任务正在检查数据库连接字符串并检查某些目录位置以确保它们在安

随机推荐

  • 需要 modbus Java 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要带有源代码的简单 modbus Java 库 我在谷歌上找到了 但有 jar 文件 并且没有强大的
  • 如何从 jQuery 触发 JSF 渲染

    是否可以触发jsf
  • 具有 CSS 类的 img 的 DataURL

    我必须应用一些样式 img 感谢 CSS 类 是否有可能获得dataURL of the img 与CSS样式 function Original const imgOriginal document getElementById orig
  • 运行 Gitlab Docker

    我正在遵循这些说明 http doc gitlab com omnibus docker http doc gitlab com omnibus docker However http localhost http localhost是说W
  • Python Falcon 中的 CORS 失败,即使有 Auth Pre-Flight 的头

    使用时收到这些错误选项动词在 Angular2 http get url options 中 即使在 Falcon Rest API 中设置了适当的 CORS 标头 XMLHttpRequest 无法加载http localhost 800
  • Autofac Resolve 具有开放通用类的开放通用接口

    所以我有一个接口和类 public interface IMyInterface
  • 无法通过终端访问 OS X 中的 adb,“找不到命令”

    我已在 Mac 系统上安装了 Android SDK 和 Eclipse 我能够使用 Eclipse 进行编程并创建了一些示例应用程序 但我仍然无法访问adb通过终端窗口 我在终端中尝试过以下命令 pwd Users espireinfol
  • 在CDN的vue应用程序中保持资产和公共路径不同

    vue 有这个选项publicPath https cli vuejs org config publicpath它允许将应用程序部署在子路径上 foob ar com my path 使链接和每个资产都可以通过它访问 从性能的角度来看 我
  • 如何将 React App 嵌入到另一个网站

    我有一个旧网站在服务器 x 上运行 现在一个React App已经开发出来了 在y服务器上 该网站应显示 React App 我已经搜索并阅读了有关该主题的几篇文章 但到目前为止没有成功 目前唯一有效的解决方案是 iframe 但我们不想要
  • 如何从用 Java 编写的 Azure Function App 连接到 PostgreSQL?

    我有一个 Azure 函数应用程序 其中有一个用 Java 编写的计时器触发函数 我需要连接到部署在其中一台 Azure VM 上的 PostgreSQL 此处不使用托管 Postgres 我的代码 import java sql publ
  • R:plm——年度固定效应——年度和季度数据

    我在设置面板数据模型时遇到问题 这是一些示例数据 library plm id lt c 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 year lt c 1999 1999 1999 1999 2000 2000 200
  • Java 的 SQL 解析器库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • AutoFac中是否可以获取容器类型

    例如 我在类型的构造函数中使用一个参数注册了类 C1System Type 我有另一个类 C2 其中注入了 C1 类型的参数 我想收到typeof C2 自动在 C1 构造函数中 以某种方式有可能吗 示例代码 public class C1
  • 如何查找网络机器名称和登录该机器的用户?

    我必须找到机器名称以及登录机器的用户名 I have Updated My answer please see my answer NetworkBrowser nb new NetworkBrowser IPHostEntry ip Dn
  • 每台服务器的带宽摘要

    我正在尝试获取我帐户下所有 Softlayer 服务器的带宽数据 谢谢account servers rb我能够获取所有服务器的服务器 ID 现在我想获取服务器在特定时间范围内使用的带宽 我感兴趣的数据是 http sldn softlay
  • 如何根据 R 中的条件填充数据框

    我创建了一个像这样的空数据框 id Alyr Crub Lala Brap Bole Spar Esal Aara Thas 1 XLOC 003940 TBH 1 NA NA NA NA NA NA NA NA NA 我想看看是否id和列
  • Kubernetes DNS 在 Kubernetes 1.2 中失败

    我正在尝试在 Centos 7 上的 Kubernetes 1 2 中设置 DNS 支持 根据文档 https github com kubernetes kubernetes tree master cluster addons dns
  • 查找具有相似文本的文章的算法

    我在数据库中有很多文章 带有标题 文本 我正在寻找一种算法来找到 X 个最相似的文章 例如当你提出问题时 Stack Overflow 的 相关问题 我尝试用谷歌搜索这个问题 但只找到了有关其他 相似文本 问题的页面 例如将每篇文章与所有其
  • PHP 中大括号之间的匹配文本

    直接跟进上一个question https stackoverflow com questions 413071 regex to get string between curly braces i want whats between t
  • MSI 安装程序 InstallValidate 如何确定正在使用的文件?

    我正在尝试找出如何防止重新启动管理器在卸载应用程序时检测到需要重新启动 我的应用程序有一个 Windows 服务 它使用本机 DLL Tanuki Wrapper 并创建另一个写入一些日志文件的进程 Java 我正在使用 WiX Tools