Windows installer Msiexec/v不断被调用,并使注册表混乱

Windows installer Msiexec/v不断被调用,并使注册表混乱,windows-installer,Windows Installer,我相信services.exe使用命令行msiexec.exe/v来重新安装或重新缓存或任何我的软件。问题是,当您实际安装时,您选择了一个安装路径,并将其设置为注册表项。调用此msiexec.exe/v时,所有注册表项都会重置,但由于它不再具有此路径,因此路径项将保留为空 我运行process monitor并等待它发生,上面的信息就是我推断的。我需要知道它为什么叫它,以及如何阻止它。任何信息或知识,以帮助我了解正在发生的事情将不胜感激,因为我正在积极努力解决这个问题。我没有特别发现引发这些事件

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


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

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

请注意,通过检查系统的事件日志,通常还可以找到负责自修复的组件。这是最快的方法。日志文件将为您提供更多信息。要理解日志,请使用Microsoft自己的日志文件分析器:

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


如果我的直觉是正确的,您的服务exe文件正在重置MSI认为它“拥有”的注册表值,并且启动该服务会触发密钥路径检查,进而触发自修复以将值还原为MSI默认值。很抱歉解释得很混乱,但我只是想给你一些调试方面的建议。

是的,很抱歉我忘了发布我的答案。你是对的,我的软件创建了一个快捷方式,所以它是一个广告的快捷方式。它将看到其中一个组件消失,然后开始重新安装。重新安装将替换该文件,但同时取出在实际安装过程中通常要设置的注册表项。我必须进行自定义操作以添加快捷方式,这样它就不会被公布,因为导致重新安装的文件不重要。您可能仍然有问题。自修复可以通过广告快捷方式以外的其他方式触发。最好修复问题的根本原因:丢失的文件。这很可能是应用程序生成或编辑的文件?在这种情况下,应用程序应该生成文件,而不应该安装它。将其从安装程序中取出,并保留所宣传的快捷方式,以符合Windows安装程序指南。一些公司拒绝使用不符合要求的软件。是的,该文件是一个旧的flash文件,在更新flash时会被替换,从而导致重新安装。我同意最终的解决方案是删除flash文件,特别是因为我们不再使用它,但我们需要更快的修复。谢谢你的帮助。