UpdateManager在更新期间无法重新启动应用程序

时间:2011-10-23 11:42:10

标签: wix windows-installer

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

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

  1. 启动应用程序;
  2. 启动包含新应用版本的msi文件;
  3. 在安装/更新期间,我被提示关闭正在运行的应用程序;
  4. 继续运行的应用程序关闭后,安装完成,应用程序重新启动;
  5. 如果我尝试从应用程序本身更新我的应用程序,那么我遇到了问题:

    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”

    我试过了:

    1. 不使用msiexec的被动模式;
    2. 通过cmd.exe启动msiexec(cmd.exe / C“msiexec / i ....”) - 希望从其他进程启动msiexec可以解决问题;
    3. 在启动msi更新之前等待60多秒(在我的方案中应该不相关,但MSDN文档中有相关信息......)
    4. 但以上都没有奏效(总是相同的结果)。

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

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

      修改 - 额外测试:

      1. 似乎没有必要回复WM_QUERYENDSESSION和WM_ENDSESSION消息,因为手动升级期间的应用程序重启没有它们,所以我们可以排除它们;
      2. 如果我没有为应用程序启动的升级提供管理员凭据,而是在升级期间键入它们,则应用程序重新启动可以正常工作;
      3. 如果我运行提升的命令提示符并从那里(手动)启动应用程序升级,则应用程序重启仍然有效;
      4. 为了使应用程序升级在标准用户帐户下完全正常工作(到目前为止,我在使用UAC的管理员帐户下进行了测试),我还必须设置p.StartInfo.LoadUserProfile = true;。否则没有任何反应(应用程序重启仍然无法正常工作);
      5. 我尝试了我可以设置的所有其他进程StartInfo参数 - WorkingDirectory,Redirect,Verb
        (=“runas”) - 结果没有变化;
      6. 我将Vista SP2安装到我测试过的虚拟机上(到目前为止已运行SP1),但没有变化;
      7. 我使用详细日志记录执行了“自动”应用程序升级。最后出现错误消息 - RESTART MANAGER:重新启动应用程序时失败。错误:352 。该错误代码非常通用(http://msdn.microsoft.com/cs-cz/library/aa373665),为了获得更详细的信息,我必须编写我自己的安装程序,在错误后调用 RmGetList ,然后我可能会得到更多详细信息(这虽然是我不愿意做的事情;
      8. 编辑2 - msi日志文件:
        http://mommi.planet.ee/muu/log.txt

1 个答案:

答案 0 :(得分:0)

假设手动过程确实没有任何问题,似乎您需要管理员权限与“更新本身”相结合会导致这些问题。我看到以下选项:

  • 创建批处理文件以执行更新
    当您想要更新调用此批处理文件(具有提升的权限)时,让应用程序自行关闭...批处理文件应等待几秒钟,然后检查应用程序是否仍在运行(并在以后关闭它)然后运行您需要运行msiexec的命令行 - 不要在msiexec中重新启动应用程序,但是在批处理文件中成功运行msiexec之后。

  • 创建一个始终用于启动应用程序的批处理文件 当需要更新时,您只需结束应用程序。批处理文件检查可用更新并应用它,在成功更新后启动应用程序或应用程序设置一些环境变量,然后由批处理文件的其余部分进行相应处理。