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

Mar*_*rko 5 windows-installer wix

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

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

  1. 启动程序;
  2. 启动包含新应用版本的msi文件;
  3. 在安装/更新期间,我被提示关闭正在运行的应用程序;
  4. 继续运行的应用程序关闭后,安装完成,应用程序重新启动;

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

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();
    }
Run Code Online (Sandbox Code Playgroud)

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

我试过了:

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

但上述都没有奏效(总是相同的结果).

必须以提升的权限启动设置可能与问题有关,因为在手动更新期间,我在事件查看器中收到警告 - 应用程序MyApp(pid 3220)无法重新启动 - 应用程序SID与Conductor 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,然后我可能会获得更多细节(这虽然是我不愿意做的事);

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

Yah*_*hia 0

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

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

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