Używam C#, .net 4, WIX 3.5, Windows Vista. Zrobiłem moją aplikację zgodną z RestartManager przez p/wywołanie metody RegisterApplicationRestart i przez obsługę komunikatów okna WM_QUERYENDSESSION i WM_ENDSESSION (zwracam new IntPtr(1);
).RestartManager nie może ponownie uruchomić aplikacji podczas aktualizacji
Gdy próbuję ręcznie zaktualizować aplikację, a następnie wszystko działa tak jak powinno:
- Uruchom aplikację;
- Uruchom plik msi zawierający nową wersję aplikacji;
- Podczas instalacji/aktualizacji zostanie wyświetlony monit o zamknięcie działającej aplikacji;
- Po kontynuowaniu uruchomionej aplikacji zostanie zamknięta, instalacja zostanie zakończona, a aplikacja zostanie ponownie uruchomiona;
Gdy próbuję zaktualizować aplikację z samej aplikacji, potem napotkasz problemy:
1) uruchamianie aplikacji;
2) Pobierz nowy plik msi;
3) uruchamianie plik 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) Ponieważ ja w trybie biernym natychmiast są zamknięte;
5) Po instalacji moja aplikacja nie zostanie ponownie uruchomiona, a pod Podglądem zdarzeń mam
Zdarzenie 10007 - Nie można ponownie uruchomić aplikacji lub usługi "MojaAplikacja".
Próbowałem:
- nie używać trybu pasywnego dla msiexec;
- Uruchom msiexec za pomocą cmd.exe (cmd.exe/C "msiexec/i ....") - w nadziei, że uruchomienie msiexec z innego procesu rozwiąże problem;
- Odczekaj 60+ sekund przed uruchomieniem aktualizacji MSI (nie powinno być istotne w moim scenariuszu, ale dokumentacji MSDN ma coś na ten temat ...)
Ale żadna z powyższych współpracował (zawsze ten sam wynik).
Konieczność uruchomienia konfiguracji z podwyższonymi uprawnieniami może mieć związek z problemem, ponieważ podczas aktualizacji ręcznej otrzymuję ostrzeżenie w Podglądzie zdarzeń - Nie można ponownie uruchomić aplikacji MyApp (pid 3220) - Identyfikator SID aplikacji nie mecz Dyrygent SID.
Mimo to ponowne uruchomienie aplikacji nadal działa. Googleing ostrzeżenia nie daje dobrych/konkretnych wyników, tyle tylko, że to ostrzeżenie jest prawdopodobnie spowodowane uruchomieniem msi w podwyższonym monicie.
Jak naprawić (lub obejść) ten problem, aby móc zaktualizować aplikację z poziomu samej aplikacji i ponownie uruchomić aplikację?
Edit - dodatkowo badania:
- Nie wydaje się konieczne, aby odpowiadać na wiadomości WM_QUERYENDSESSION i WM_ENDSESSION, ponieważ ponowne uruchomienie aplikacji podczas ręcznej aktualizacji działa bez nich, więc możemy wykluczyć je;
- Jeśli nie podaję danych uwierzytelniających administratora do aktualizacji inicjowanej przez aplikację, a zamiast tego wpisuję je podczas aktualizacji, uruchamia się ponownie;
- Jeśli uruchomię wiersz polecenia z podwyższonym poziomem uprawnień i rozpocznę z niego aktualizację aplikacji (ręcznie), to ponowne uruchomienie aplikacji będzie nadal działać;
- Aby uaktualnienie aplikacji działało w ogóle na standardowych kontach użytkowników (do tej pory testowałem pod kontem administratora z UAC), muszę też ustawić
p.StartInfo.LoadUserProfile = true;
. W przeciwnym razie nic się nie dzieje. (restart aplikacji wciąż nie działa); - Próbowałem wszystkich innych parametrów procesu StartInfo, które mogłem ustawić - WorkingDirectory, Redirect, Verb
(= "runas") - bez zmian w wynikach; - Zainstalowałem Vista SP2 na maszynie wirtualnej, na której testowałem (do tej pory uruchomiono dodatek SP1), ale bez żadnych zmian;
- Przeprowadziłem "automatyczne" uaktualnienie aplikacji z pełnym logowaniem. Na końcu pojawił się komunikat o błędzie - RESTART MANAGER: Błąd podczas ponownego uruchamiania aplikacji. Błąd: 352. Ten kod błędu jest bardzo ogólny (http://msdn.microsoft.com/cs-cz/library/aa373665), aby uzyskać bardziej szczegółowe informacje, musiałbym napisać własny instalator, który wywoływałby po błędzie RmGetList, wtedy mógłbym uzyskać więcej szczegółów (to jest jednak coś, czego nie chcę do zrobienia);
Edycja 2 - msi plik dziennika:
http://mommi.planet.ee/muu/log.txt
Czy próbowałeś użyć MSI API bezpośrednio [ 'MsiInstallProduct'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa370315.aspx)? Niestety, nie znam jego odpowiednika w środowisku .Net. –
Nie próbowałem wcześniej tego interfejsu API MSI, ale zrobiłem to.Dwa problemy - 1) Ten interfejs API nie obsługuje RestartManager (prosi mnie o ponowne uruchomienie komputera); 2) Wydaje się, że nie ma sposobu na przekazanie uprawnień administratora (pozycja obowiązkowa w moim scenariuszu). – Marko
czy mógłbyś podać plik logu instalacji msi? możesz go pobrać z msiexec, dodając parametr "/ l * v% temp% \ mylog.log". to może nam dać wskazówkę o problemie, – weberik