2013-04-24 13 views
13

Tworzę pakiet MSI do instalowania i uruchamiania usług systemu Windows przy użyciu WiX v3.8. Kod następująco:Nie można zainstalować i uruchomić usług systemu Windows w instalatorze WiX

<Component Id="INSTALLAPSSERVICE" Guid="991D5F82-0E77-4FE3-B1D8-4C941B84C7CD" Win64="yes"> 
    <File Id="ApsService.exe" 
     Name="ApsService.exe" 
     Source="Resource\ApsService.exe" 
     KeyPath="yes" 
     Vital="yes" 
     DiskId="1"></File> 
    <ServiceInstall Id="ApsServiceInstaller" 
        Name="ApsService" 
        DisplayName="ApsService" 
        Type="ownProcess" 
        Start="auto" 
        ErrorControl="normal" 
        Description="A monitor service for windows application." 
        Account="[SERVICEACCOUNT]" 
        Password="[SERVICEPASSWORD]" 
        Vital="yes" 
        Interactive="no"></ServiceInstall> 
    <ServiceControl Id="StartService" 
        Start="install" 
        Stop="both" 
        Remove="uninstall" 
        Name="ApsService" 
        Wait="yes"/> 
</Component> 

Ale instalacja nie powiedzie się z następujących błędów w dzienniku:

Executing op: ServiceControl(,Name=ApsService,Action=1,Wait=1,) 
StartServices: Service: ApsService 
Error 1920. Service 'ApsService' (ApsService) failed to start. Verify that you have  sufficient privileges to start system services. 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 3676 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 1888 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 1764 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 3504 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 2100 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 2752 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 3672 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 3876 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 1400 could not be cancelled. Error: 1168 
MSI (s) (F0:C0) [15:57:28:630]: Product: WinApsSetup64 -- Error 1920. Service 'ApsService' (ApsService) failed to start. Verify that you have sufficient privileges to start system services. 

Jak można naprawić błędy?

Odpowiedz

12

Wyświetlany komunikat o błędzie to ogólny komunikat, który Instalator Windows wysyła, gdy nie może uruchomić usługi podczas instalacji. Niemal zawsze problem polega na tym, że w usłudze brakuje zależności lub w inny sposób nie jest ona w pełni skonfigurowana po rozpoczęciu uruchamiania. Aby debugować problem root, spróbuj:

  1. Zainstaluj pakiet MSI.
  2. Po wyświetleniu okna błędu informującego, że nie można uruchomić usługi * , nie odłóż okna dialogowego od.
  3. Uruchom usługi .sc lub użyj polecenia sc.exe z wiersza polecenia, aby spróbować uruchomić usługę. Instalator Windows powinien mieć skonfigurowaną wystarczającą ilość usługi, aby móc głębiej debugować przyczyny niepowodzenia.
  4. Jeśli jest to konieczne, należy debugować bezpośrednio plik wykonywalny usługi, aby sprawdzić, dlaczego nie można go uruchomić.

Jeśli jest to usługa napisany w kodzie zarządzanym, należy upewnić się, że robi nie zależą pliki są umieszczane w GAC. Pliki nie znajdują się w GAC do bardzo, bardzo późno podczas procesu instalacji. Jeśli musisz używać plików w GAC, nie będziesz mógł używać wbudowanego elementu ServiceControl i będziesz musiał napisać niestandardową akcję, która będzie działać po InstallFinalize. Zwróć uwagę, że po InstallFinalize akcja niestandardowa nie zostanie podniesiona, więc Twoja usługa będzie musiała być obsługiwana przez nieukierunkowanych użytkowników. Ponownie, nie polecam w zależności od GAC.

Powodzenia w debugowaniu usługi!

+1

Cześć Rob, podczas gdy pytanie może brzmieć dummy, ale skąd mam wiedzieć, czy mój plik wykonywalny zależy od jakiegoś pliku w GAC? – Pant

+0

to działa ze mną, dzięki – jovenb

6

ServiceInstall Konto jest ukrywane w przykładzie PO, ale ten błąd może się zdarzyć, jeśli ktoś zapomni pełni zakwalifikować konta, jako takich:

<ServiceInstall ... Account="NT AUTHORITY\LocalService" />

Instalator zakończy się niepowodzeniem, jeśli tylko podać nazwę użytkownika (w/o NT Authority) tak:

<ServiceInstall ... Account="LocalService" />

+0

Związane z tą odpowiedzią: jeśli używasz konta lokalnego dla [SERVICEACCOUNT], upewnij się, że podajesz nazwę komputera, a nie tylko nazwę konta. Na przykład. MYSERVER \ UserX będzie działać, a tylko UserX nie będzie działać. I, oczywiście, musisz podać nazwę domeny, to jest konto domeny. –

4

Pamiętaj, aby dodać "Logowanie jako usługa" prawa do [konto_usługi]

Aby dodać prawo "Zaloguj się jako usługa" do konta na lokalnym komputerze:

1) Otwórz lokalną politykę bezpieczeństwa.

2) W drzewie konsoli kliknij dwukrotnie Zasady lokalne, a następnie kliknij Przypisywanie praw użytkownika.

3) W okienku szczegółów kliknij dwukrotnie Zaloguj się jako usługa.

4) Kliknij Dodaj użytkownika lub grupę, a następnie dodaj odpowiednie konto do listy kont które posiadają Zaloguj się jako usługa rację.

Od: http://technet.microsoft.com/en-us/library/cc739424%28v=ws.10%29.aspx.

0

Podczas debugowania problemu z uruchomieniem usługi zawsze używam prostej instrukcji if(), która sprawdza istnienie określonego pliku w katalogu instalacyjnym. Gdy usługa się nie powiedzie, otwieram wiersz polecenia (przed zamknięciem okna wskazującego niepowodzenie) i użyj "echo> tego pliku", aby utworzyć plik, którego szukam w if(). Obiekt if() to wywołanie Debugger.Launch().

Teraz mogę zamknąć okno dialogowe i ponownie uruchomić instalator, a tym razem uruchomi się debugger i zobaczę, co się stanie. Zwykle używam klasy statycznej init jako momentu uruchomienia debuggera, ale możesz spróbować zrobić to w "OnStart()", ale jeśli są problemy z ładowaniem/bindowaniem, prawdopodobnie nie dotrzesz do tego momentu, zanim umrze. . Natomiast wykonanie podczas klasy statycznej init prawie zawsze powie ci rzeczy, które musisz rozwiązać jako zależności.

0

Dostałem ten błąd dzisiaj, ponieważ moja usługa miała zależności, które musiały zostać ZAKOŃCZONE przed uruchomieniem usługi. Jak się okazuje, instalatory pobierają ostatnie zależności i naprawdę nie ma dobrego sposobu na obejście tego bez budowania jakiegoś instalatora typu bootstraper/multipart.

Jednak znalazłem następującą rozdzielczość: zainstaluj złożenia zarówno do GAC, jak i zainstaluj je w tym samym katalogu, co usługa. W ten sposób usługa będzie mogła znaleźć biblioteki DLL na początku w katalogu plików programu, a będą one GACed (co było wymogiem z innych powodów).

Aby to zrobić, musiałem stworzyć dwie oddzielne grupy komponentów, a „manekin” katalog:

<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="ProgramFilesFolder"> 
    <Directory Id="INSTALLDIR" Name="NameOfProgram" /> 
    <Directory Id="GacDlls" Name="libs" /> 
    </Directory> 
</Directory> 

I następnie utworzyć dwie grupy komponentów: jeden, który ma exe i wszystkich bibliotek, a druga z tymi samymi bibliotekami z atrybutem Assembly ustawionym na ".net":

<ComponentGroup Id="ServiceLibs" Directory="GACDlls"> 
    <Component Id="log4netGAC" 
        Guid="a23099ac-5880-4b6e-af3f-fa7cef113226"> 
     <File Id="log4net.dllGAC" 
       Name="log4net.dll" 
       Source="..\ProjectDir\bin\$(var.Configuration)\log4net.dll" 
       KeyPath="yes" 
       Vital="yes" 
       DiskId="1" 
       Assembly=".net" 
      /> 
    </Component> 
</ComponentGroup> 

<ComponentGroup Id="ProductComponents" Directory="INSTALLDIR"> 
    <Component Id="log4net" 
       Guid="463e05db-e248-44d7-bbde-467358b7310f"> 
     <!-- normally we'd want to GAC this (Assembly=".net"), but that would prevent us from starting the service up during install so we'll just drop it in the program folder --> 
     <File Id="log4net.dll" 
       Name="log4net.dll" 
       Source="..\ProjectName\bin\$(var.Configuration)\log4net.dll" 
       KeyPath="yes" 
       Vital="yes" 
       DiskId="1"      
      />    
    </Component> 
    ... other components ... 
</ComponentGroup> 

A teraz działa!

Powiązane problemy