2011-10-23 20 views
5

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:

  1. Uruchom aplikację;
  2. Uruchom plik msi zawierający nową wersję aplikacji;
  3. Podczas instalacji/aktualizacji zostanie wyświetlony monit o zamknięcie działającej aplikacji;
  4. 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:

  1. nie używać trybu pasywnego dla msiexec;
  2. Uruchom msiexec za pomocą cmd.exe (cmd.exe/C "msiexec/i ....") - w nadziei, że uruchomienie msiexec z innego procesu rozwiąże problem;
  3. 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:

  1. 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;
  2. Jeśli nie podaję danych uwierzytelniających administratora do aktualizacji inicjowanej przez aplikację, a zamiast tego wpisuję je podczas aktualizacji, uruchamia się ponownie;
  3. 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ć;
  4. 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);
  5. Próbowałem wszystkich innych parametrów procesu StartInfo, które mogłem ustawić - WorkingDirectory, Redirect, Verb
    (= "runas") - bez zmian w wynikach;
  6. Zainstalowałem Vista SP2 na maszynie wirtualnej, na której testowałem (do tej pory uruchomiono dodatek SP1), ale bez żadnych zmian;
  7. 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

+0

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. –

+0

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

+0

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

Odpowiedz

0

Zakładając, że proces obsługi rzeczywiście działa bez problemu wydaje się, że zapotrzebowanie na uprawnieniami administratora w połączeniu z „aktualizowanie się” prowadzi do te problemy. Widzę następujące opcje:

  • utworzyć plik wsadowy, aby wykonać aktualizację
    Kiedy chcesz zaktualizować nazywają ten plik wsadowy (z podwyższonymi uprawnieniami), sprawiają, że aplikacja zamyka się ... plik wsadowy powinien poczekaj kilka sekund, a następnie sprawdź, czy aplikacja jest nadal uruchomiona (i zamknij ją na wszelki wypadek), a następnie uruchom wiersz poleceń, aby uruchomić aplikację msiexec - nie uruchamiaj ponownie aplikacji z poziomu msiexec, ale po pomyślnym uruchomieniu msiexec z pliku wsadowego .

  • utwórz plik wsadowy, który jest zawsze używany do uruchamiania aplikacji.
    Kiedy nadchodzi czas aktualizacji, po prostu kończ aplikację. Albo plik wsadowy sprawdza dostępność aktualizacji i ją stosuje, uruchamia aplikację po udanej aktualizacji LUB ustawia w aplikacji pewną zmienną środowiskową, która jest następnie przetwarzana przez resztę pliku wsadowego.

+1

Myślę, że masz prawo do tworzenia osobnego pliku wsadowego lub pliku wykonywalnego, aby wykonać aktualizację w moim scenariuszu. Myślę, że wynika to z pewnych ograniczeń/błędów w systemie Windows. Jedną rzeczą, którą chciałbym dodać jest to, że aby ponownie uruchomić aplikację z bieżącymi uprawnieniami użytkownika (nie administratora), to potrzebujesz dwóch plików. Główna aplikacja wywoła pierwszą, która wywoła drugą z prawami administratora (która wywołuje msiexec), a następnie pierwsza uruchomi główną aplikację. Ponieważ pierwszy plik wykonywalny jest wywoływany z bieżącymi uprawnieniami użytkownika, aplikacja jest również uruchamiana z bieżącymi uprawnieniami użytkownika ... – Marko

Powiązane problemy