RestartManager无法在更新期间重新启动应用程序
我正在使用c#,.net 4,WIX 3.5,Windows Vista。 我通过p/invoker RegisterApplicationRestart方法和处理WM_QUERYENDSESSION和WM_ENDSESSION窗口消息(我返回new IntPtr(1);
)使我的应用程序与RestartManager兼容。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启动msiexec(cmd.exe/C“msiexec/i ....”) - 希望从其他进程启动msiexec可以解决问题;
- 等待60多秒启动MSI更新之前(不应该在我的情况有关,但MSDN文档中有一些事情...)
但没有以上已经工作(总是相同的结果)。
不必启动以提升的权限设置可能有一些做的问题,因为在手动更新过程中出现了在事件查看器的警告 - 应用MyApp的(PID 3220)无法重新启动 - 应用SID不匹配指挥SID。
尽管如此,重新启动应用程序仍然有效。谷歌的警告没有产生好的/具体的结果,只是这个警告可能是由提升提示运行msi引起的。
如何解决(或解决方法)此问题,以便我可以从应用程序本身更新我的应用程序,然后重新启动我的应用程序?
编辑 - 额外的测试:
- 似乎有不被需要,以WM_QUERYENDSESSION WM_ENDSESSION和消息作出响应,因为手动升级过程中重新启动应用程序的工作原理没有他们,因此我们可以排除他们出去;
- 如果我没有为应用程序启动的升级提供管理员凭据,而是在升级过程中输入它们,那么应用程序重新启动将工作;
- 如果我运行提升的命令提示符并从那里启动应用程序升级(手动),那么应用程序重新启动仍然有效;
- 为了让应用程序升级在标准用户帐户下工作(迄今为止我使用UAC以管理员帐户进行了测试),那么我还必须设置
p.StartInfo.LoadUserProfile = true;
。否则没有任何反应(虽然应用程序重启仍然不起作用); - 我尝试了所有其他可以设置的StartInfo参数 - WorkingDirectory,Redirect,Verb
(=“runas”) - 结果没有变化; - 我将Vista SP2安装到我一直在测试的虚拟机上(到目前为止运行SP1),但没有更改;
- 我使用详细日志记录执行了“自动”应用程序升级。最后出现错误消息 - RESTART MANAGER:重新启动应用程序时失败。错误:352。该错误代码是非常通用的(http://msdn.microsoft.com/cs-cz/library/aa373665),为了获得更详细的信息,我将不得不编写自己的安装程序,在调用错误后会调用RmGetList,那么我可能会得到更多的细节(虽然这是我不太愿意的去做);
编辑2 - MSI日志文件:
http://mommi.planet.ee/muu/log.txt
假设手工工艺的确作品,未经看来你需要管理员权限与“更新自己,”组合产生任何问题这些问题。我看到如下选项:
创建一个批处理文件来执行更新
当你想更新调用这个批处理文件(使用提升的权限),使应用程序关闭本身......批处理文件应等待几秒钟,然后检查应用程序是否仍在运行(并关闭它),然后运行您需要运行的命令行msiexec
- 不要在msiexec中重新启动应用程序,但在批处理文件成功运行msiexec
后。创建一个始终用于启动应用程序的批处理文件
当需要更新时,只需结束该应用程序即可。批处理文件检查可用的更新并应用它,在成功更新后启动应用程序,或者应用程序设置一些环境变量,然后由该批处理文件的其余部分进行相应处理。
我认为你有权创建一个单独的批处理文件或可执行文件,以便在我的方案中执行更新。我认为这是由于Windows中的一些限制/错误。我要添加的一件事是,为了以当前用户权限(非管理员)重新启动应用程序,那么您需要两个文件。主应用程序将调用第一个用管理员权限调用第二个(调用msiexec),之后第一个将启动主应用程序。由于第一个可执行文件是以当前用户权限调用的,因此该应用程序也以当前用户权限启动。 – Marko
你试过直接使用MSI API ['MsiInstallProduct'(http://msdn.microsoft.com/en-us/library/windows/desktop/aa370315.aspx)?不幸的是,我不知道它在.Net环境中的对应物。 –
我以前没有尝试过这个MSI API,但我放弃了它。两个问题 - 1)该API不支持RestartManager(它要求我重新启动计算机); 2)似乎没有办法通过管理员权限(在我的方案中必须)。 – Marko
可否请您提供msi安装的日志文件。您可以通过添加参数“/ l * v%temp%\ mylog.log”将其从msiexec中取出。这可能会给我们提供关于他的问题的线索 – weberik