gpt4 book ai didi

wix - RestartManager 无法在更新期间重新启动应用程序

转载 作者:行者123 更新时间:2023-12-03 17:58:06 24 4
gpt4 key购买 nike

我使用的是 c#、.net 4、WIX 3.5、Windows Vista。
通过调用 RegisterApplicationRestart 方法和处理 WM_QUERYENDSESSION 和 WM_ENDSESSION 窗口消息(我返回 new IntPtr(1);),我使我的应用程序与 RestartManager 兼容。

如果我尝试手动更新我的应用程序,则一切正常:

  • 启动程序;
  • 启动包含新应用程序版本的 msi 文件;
  • 在安装/更新过程中,系统提示我关闭正在运行的应用程序;
  • 继续运行的应用程序关闭,安装完成,应用程序重新启动;

  • 如果我尝试从应用程序本身更新我的应用程序,那么我会遇到问题:

    1) 启动应用程序;
    2)下载新的msi文件;
    3) 使用以下命令启动 msi 文件:
        using (System.Diagnostics.Process p = new System.Diagnostics.Process())
    {
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.FileName = "msiexec";
    p.StartInfo.Arguments = "/i \"" + downloadPath + "\" /passive";
    p.StartInfo.UserName = "Administrator";
    p.StartInfo.Password = securePassword;
    p.Start();
    }

    4)因为我使用的是被动模式,应用程序会自动关闭;
    5)安装后,我的应用程序没有重新启动,在事件查看器下我有一个
    事件 10007 - 无法重新启动应用程序或服务“MyApp”。

    我试过了:
  • 不为 msiexec 使用被动模式;
  • 通过 cmd.exe (cmd.exe/C "msiexec/i ....") 启动 msiexec - 希望从另一个进程启动 msiexec 可以解决问题;
  • 在启动 msi 更新之前等待 60 秒以上(在我的场景中应该不相关,但 MSDN 文档中有一些关于它的内容...)

  • 但以上都没有奏效(总是相同的结果)。

    必须以提升的权限启动设置可能与问题有关,因为在手动更新期间,我在事件查看器中收到警告 - 应用程序 MyApp (pid 3220) 无法重新启动 - 应用程序 SID 与导体 SID 不匹配。
    尽管如此,重新启动应用程序仍然有效。谷歌搜索警告没有产生好的/特定的结果,只是这个警告可能是由在提升的提示中运行 msi 引起的。

    如何修复(或解决)此问题,以便我可以从应用程序本身更新我的应用程序,然后重新启动我的应用程序?

    编辑 - 额外测试:
  • 似乎不需要响应 WM_QUERYENDSESSION 和 WM_ENDSESSION 消息,因为在手动升级期间应用程序重新启动不需要它们,所以我们可以排除它们;
  • 如果我没有为应用程序启动的升级提供管理员凭据,而是在升级过程中输入它们,则应用程序重新启动工作;
  • 如果我运行提升的命令提示符并从那里(手动)启动应用程序升级,则应用程序重新启动仍然有效;
  • 为了使应用程序升级在标准用户帐户下完全正常工作(到目前为止,我在 UAC 的管理员帐户下进行了测试),那么我还必须设置 p.StartInfo.LoadUserProfile = true; .否则什么都不会发生。 (虽然应用程序重启仍然不起作用);
  • 我尝试了所有其他可以设置的进程 StartInfo 参数 - WorkingDirectory、Redirect、Verb
    (= "runas") - 结果没有变化;
  • 我将 Vista SP2 安装到我一直在测试的虚拟机上(到目前为止运行的是 SP1),但没有任何变化;
  • 我使用详细日志记录执行了“自动”应用程序升级。最后出现了错误信息——重新启动管理器:重新启动应用程序时失败。错误:352 .该错误代码非常通用( http://msdn.microsoft.com/cs-cz/library/aa373665 ),为了获得更详细的信息,我必须编写自己的安装程序,在错误发生后调用 RmGetList,然后我可能会获得更多详细信息(尽管这是我不愿意的)去做);

  • 编辑 2 - msi 日志文件:
    http://mommi.planet.ee/muu/log.txt

    最佳答案

    假设手动过程确实可以正常工作,似乎您需要管理员权限并结合“更新本身”会导致这些问题。我看到以下选项:

  • 创建一个批处理文件来执行更新
    当您要更新调用此批处理文件(具有提升的权限)时,使应用程序自行关闭...批处理文件应等待几秒钟,然后检查应用程序是否仍在运行(并关闭它以防万一),然后运行您需要运行的命令行 msiexec - 不要在 msiexec 内重新启动应用程序,而是在成功运行 msiexec 后重新启动应用程序从批处理文件。
  • 创建一个始终用于启动应用程序的批处理文件
    当需要更新时,您只需结束应用程序即可。批处理文件检查可用更新并应用它,在成功更新后启动应用程序,或者应用程序设置一些环境变量,然后由批处理文件的其余部分相应地处理。
  • 关于wix - RestartManager 无法在更新期间重新启动应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7865905/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com