2011-10-23 198 views
5

我正在使用c#,.net 4,WIX 3.5,Windows Vista。 我通過p/invoker RegisterApplicationRestart方法和處理WM_QUERYENDSESSION和WM_ENDSESSION窗口消息(我返回new IntPtr(1);)使我的應用程序與RestartManager兼容。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(); 
    } 

4)由於我使用的被動模式下,應用程序被自動關閉;
5)安裝後,我的應用程序不會重新啓動,並在事件查看器我有一個
事件10007 - 應用程序或服務「MyApp的」無法重新啓動

我曾嘗試:

  1. 不使用被動模式MSIEXEC;
  2. 通過cmd.exe啓動msiexec(cmd.exe/C「msiexec/i ....」) - 希望從其他進程啓動msiexec可以解決問題;
  3. 等待60多秒啓動MSI更新之前(不應該在我的情況有關,但MSDN文檔中有一些事情...)

但沒有以上已經工作(總是相同的結果)。

不必啓動以提升的權限設置可能有一些做的問題,因爲在手動更新過程中出現了在事件查看器的警告 - 應用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,那麼我可能會得到更多的細節(雖然這是我不太願意的去做);

編輯2 - MSI日誌文件:
http://mommi.planet.ee/muu/log.txt

+0

你試過直接使用MSI API ['MsiInstallProduct'(http://msdn.microsoft.com/en-us/library/windows/desktop/aa370315.aspx)?不幸的是,我不知道它在.Net環境中的對應物。 –

+0

我以前沒有嘗試過這個MSI API,但我放棄了它。兩個問題 - 1)該API不支持RestartManager(它要求我重新啓動計算機); 2)似乎沒有辦法通過管理員權限(在我的方案中必須)。 – Marko

+0

可否請您提供msi安裝的日誌文件。您可以通過添加參數「/ l * v%temp%\ mylog.log」將其從msiexec中取出。這可能會給我們提供關於他的問題的線索 – weberik

回答

0

假設手工工藝的確作品,未經看來你需要管理員權限與「更新自己,」組合產生任何問題這些問題。我看到如下選項:

  • 創建一個批處理文件來執行更新
    當你想更新調用這個批處理文件(使用提升的權限),使應用程序關閉本身......批處理文件應等待幾秒鐘,然後檢查應用程序是否仍在運行(並關閉它),然後運行您需要運行的命令行msiexec - 不要在msiexec中重新啓動應用程序,但在批處理文件成功運行msiexec後。

  • 創建一個始終用於啓動應用程序的批處理文件
    當需要更新時,只需結束該應用程序即可。批處理文件檢查可用的更新並應用它,在成功更新後啓動應用程序,或者應用程序設置一些環境變量,然後由該批處理文件的其餘部分進行相應處理。

+1

我認爲你有權創建一個單獨的批處理文件或可執行文件,以便在我的方案中執行更新。我認爲這是由於Windows中的一些限制/錯誤。我要添加的一件事是,爲了以當前用戶權限(非管理員)重新啓動應用程序,那麼您需要兩個文件。主應用程序將調用第一個用管理員權限調用第二個(調用msiexec),之後第一個將啓動主應用程序。由於第一個可執行文件是以當前用戶權限調用的,因此該應用程序也以當前用戶權限啓動。 – Marko

相關問題