2

我相信 services.exe 使用命令行 msiexec.exe /v 来重新安装或重新缓存或任何我的软件。问题是,当您实际安装时,您选择了安装路径并将其设置为注册表项。当调用此 msiexec.exe /v 时,所有注册表项都会重置,但由于它不再具有此路径,因此路径项将留空。

我运行进程监视器并等待它发生,以上信息就是我推断的。我需要知道它为什么调用它以及如何阻止它。任何有助于我了解正在发生的事情的信息或知识将不胜感激,因为我正在积极努力解决这个问题。我发现没有什么特别的东西可以引发这些事件。不过可能是一家初创公司。

4

1 回答 1

1

很难知道发生了什么。您是否将自己的服务可执行文件安装为 MSI 的一部分?如果是这样,它将在调用(启动/停止)时成为“自我修复”入口点。这意味着将即时验证所有组件中的所有关键路径,如果发现任何关键路径丢失,则会自动重新安装您的应用程序。您可以使用详细日志文件来确定哪个组件触发了自我修复。使用 Windows Installer 命令行生成器构建 msiexec.exe 命令行以创建文件。请在此处查看我的答案:如何与静默安装的 msi 交互?(进度数据并取消)

请注意,您通常还可以通过检查系统的事件日志来找到负责自我修复的组件。这是最快的方法。日志文件将为您提供更多信息。要了解日志,请使用 Microsoft 自己的日志文件分析器: http: //msdn.microsoft.com/en-us/library/windows/desktop/aa372811 (v=vs.85).aspx

如果您在 msi 中对注册表项进行硬编码,则它们确实会在修复完成后被重置。当您将 MSI 组件指向注册表路径作为密钥路径时,MSI 文件认为它“拥有”该密钥并将在安装时重置它并在卸载时将其删除,除非您专门设计 MSI 文件以避免这种情况。您可以通过将组件设置为“永久”和“如果 keypath 存在则从不覆盖”来避免这种情况。更好的选择是让服务 exe 文件在安装后将其自己的默认值写入注册表(如果它有权这样做)。这将使您的设置与 MSI 分离,安装程序永远不会弄乱它们。

如果我的直觉是正确的,您的服务 exe 文件正在重置 MSI 认为它“拥有”的注册表值,并且启动服务会触发密钥路径检查,进而触发自我修复以将值恢复为 MSI 默认值。很抱歉解释混乱,但我在这里从臀部拍摄,试图为您提供一些调试指导。

于 2012-08-25T02:16:28.380 回答