Msiexec / v不断被调用并搞砸了注册表

时间:2012-07-30 21:35:38

标签: msiexec

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

我运行了进程监视器并等待它发生,上面的信息是我推断的。我需要知道为什么要调用它以及如何阻止它。任何有助于我理解正在发生的事情的信息或知识都会受到赞赏,因为我正积极努力解决这个问题。我发现没有特别发现这些事件。可能是创业公司。

1 个答案:

答案 0 :(得分:1)

很难知道发生了什么。您是否在MSI中安装自己的服务可执行文件?如果是这样,它将在调用(开始/停止)时成为“自修复”入口点。这意味着将动态验证所有组件中的所有关键路径,如果发现任何关键路径丢失,则会自动重新安装您的应用程序。您可以使用详细日志文件来确定触发自修复的组件。使用Windows Installer命令行生成器构造msiexec.exe命令行以创建该文件。请在此处查看我的回答:How to interactive a silently installing msi? (Progress data and cancel it)

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

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

如果我的直觉感觉正确,您的服务exe文件正在重置MSI认为它“拥有”的注册表值,并且启动服务会触发密钥路径检查,进而触发自我修复以将值恢复为MSI默认值。对于凌乱的解释感到抱歉,但我正在努力为你提供一些调试指针。