2012-03-27 9 views
8

Mam usługę. Zainstalowałem go jakiś czas temu. Muszę zaktualizować usługę. Poszedłem do Dodaj/Usuń programy i szukałem mojej usługi, i nie jest tam zainstalowane. Spojrzałem na services.msc i on tam jest, zatrzymany. Udało mi się go uruchomić i zatrzymać. Uruchomiłem wiersz polecenia jako administrator i uruchomiłem SC usuń [Nazwa usługi] i otrzymałem "Określona usługa nie istnieje jako usługa zainstalowana." Zrobiłem kwerendę sc w wierszu polecenia i nie jest ona zwracana. Kliknąłem ikonę instalatora, kliknąłem na odinstalowanie i otrzymałem "Ta akcja jest ważna tylko dla produktów, które są obecnie zainstalowane." Próbowałem również naprawy i otrzymałem tę samą wiadomość.Błąd 1001: Określona usługa już istnieje. Nie można usunąć istniejącej usługi

Kilkukrotnie zrestartowałem komputer i nie było problemu ze ściąganiem tej usługi. Używam podstawowego szablonu projektu instalacji zainstalowanego w Visual Studio. Próbowałem zmienić nazwę programu i zwiększyć numer wersji.

Jak odinstalować usługę, która najwyraźniej istnieje, i zapobiec takiemu zdarzeniu w przyszłości?

+1

Dla jasności istnieje nazwa usługi i wyświetlana nazwa usługi. Czasami ludzie zapominają, że kolumna "nazwa" w services.msc jest nazwą wyświetlaną usługi. Nazwę usługi otrzymasz klikając prawym przyciskiem myszy na swoje usługi i przechodząc do właściwości. – Tung

+0

@ Tung Sprawdziłem to i obie są takie same. –

+1

Migracja do http://www.superuser.com? To naprawdę nie jest pytanie programistyczne. – CodingWithSpike

Odpowiedz

0

Czy próbowałeś wyszukać w rejestrze systemu Windows jakieś śmieci związane z tą usługą ?.

Należy spojrzeć na tego folderu: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \

+0

Niestety, nie mam dostępu do rejestru. Nie zawsze czuję się dobrze, jak tam wchodzę, więc miałem nadzieję, że jest coś, co mógłbym zrobić bez wchodzenia tam. Poprosiłem o dostęp do rejestru, ale wiąże się z tym wiele biurokracji. –

6

Jeśli masz plik .exe, który obejmuje korzystanie instalatora serwis InstallUtil.exe /u <process.exe> InstallUtil.exe znajduje się w \Windows\Microsoft.Net\Framework\v4.0.30319

W projekt setup, podać swoje usługi we wszystkich działań niestandardowych, również odinstaluj

(prawy przycisk myszy na projekt, akcja niestandardowa)

HTH

Mario

3

Jest to całkowicie normalne, że usługa nie jest wymieniony w Dodaj/Usuń programy, że pozycja jest dla pakietów oprogramowania, a nie usług. (Jedna paczka lub program może zawierać wiele usług, ale zazwyczaj nie instaluje żadnych).

Najwyraźniej usługa została zainstalowana ręcznie, a nie jako część produktu, nawet jeśli w szczególności instalowałaby się z produktem którego pakiet instalacyjny masz.

Używanie sc delete jest poprawne. Będziesz musiał podać (krótką) nazwę usługi podwójnymi cudzysłowami (chyba że jest to tylko jedno słowo), ale nic więcej.

W przeciwnym razie należy przejść do rejestru HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services, zarówno w wersji 32-, jak i 64-bitowej (odpowiednio regedt32.exe i regedit.exe). Możesz nawet bezpośrednio usunąć usługę, ale powinieneś oczywiście zacząć od odwracalnych zmian, aby zdiagnozować, jak dokładnie nazywa się twoja usługa i dlaczego sc nie widzi jej nazwy i korzysta tylko z bezpośredniego dostępu do rejestru po tym, jak wszystko inne zawiodło i po utworzeniu kopii zapasowej twój rejestr (google ta procedura do określania twojego systemu operacyjnego).

1

To samo stało się dziś ze mną. Jedynym rozwiązaniem było naprawienie pliku instalacyjnego za pomocą narzędzia Dodaj/Usuń w systemie Windows. Po naprawieniu pliku instalacyjnego odinstaluj i zainstaluj go ponownie.

3

** Jeśli jest to konieczne do wykonania przy użyciu tylko konfigurację, należy wykonać:

To mogą być obsługiwane przez wyraźnej realizacji usuwania istniejących usług (odinstalować) i następnie pozwalając nowsza wersja do zainstalowania. W tym celu należy zaktualizować ProjectInstaller.Designer.cs jak poniżej:

Należy rozważyć dodanie następującej linii na początku InitializeComponent(), która wyzwala zdarzenie do odinstalowania istniejącej usługi, zanim bieżący instalator spróbuje ponownie zainstalować tę usługę . Tutaj odinstalowujemy usługę, jeśli już istnieje.

Add następujących nazw:

using System.Collections.Generic; 
using System.ServiceProcess; 

Dodaj poniżej linii kodu, jak opisano wcześniej:

this.BeforeInstall += new 
System.Configuration.Install.InstallEventHandler(ProjectInstaller_BeforeInstall); 

przykład:

private void InitializeComponent() 
{ 
    this.BeforeInstall += new System.Configuration.Install.InstallEventHandler(ProjectInstaller_BeforeInstall); 

    this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller(); 
    this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller(); 
    // 
    // serviceProcessInstaller1 
    // 
    this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem; 
    this.serviceProcessInstaller1.Password = null; 
    this.serviceProcessInstaller1.Username = null; 
    // 
    // serviceInstaller1 
    // 
    this.serviceInstaller1.Description = "This is my service name description"; 
    this.serviceInstaller1.ServiceName = "MyServiceName"; 
    this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic; 
    // 
    // ProjectInstaller 
    // 
    this.Installers.AddRange(new System.Configuration.Install.Installer[]{ 
      this.serviceProcessInstaller1, 
      this.serviceInstaller1 
     } 
    ); 
} 

poniżej kod wywoływane przez wypadku Odinstaluj usługa, jeśli istnieje.

void ProjectInstaller_BeforeInstall(object sender, System.Configuration.Install.InstallEventArgs e) 
{ 
    List<ServiceController> services = new List<ServiceController>(ServiceController.GetServices()); 

    foreach (ServiceController s in services) 
    { 
     if (s.ServiceName == this.serviceInstaller1.ServiceName) 
     { 
      ServiceInstaller ServiceInstallerObj = new ServiceInstaller(); 
      ServiceInstallerObj.Context = new System.Configuration.Install.InstallContext(); 
      ServiceInstallerObj.Context = Context; 
      ServiceInstallerObj.ServiceName = "MyServiceName"; 
      ServiceInstallerObj.Uninstall(null); 

      break; 
     } 
    } 
} 

PS: Wraz z powyższymi zmianami, również należy rozważyć aktualizację wersji konfiguracji, ProductCode (i optionall UpgradeCode) dla dobrych praktyk, lepsze zarządzanie wersji, śledzenie i konserwacji

+0

To jest świetna odpowiedź, ale dowiedziałem się, że można uzyskać to samo zachowanie bez ręcznej edycji ProjectInstaller.Designer.cs (jest to automatycznie generowany plik źródłowy, a edycja jest niebezpieczna, ponieważ VS może je zregenerować, więc możesz zakończyć utratę swoich zmian). Możesz powiązać zdarzenie PrzedInstall w zakładce właściwości w usłudze processProcessInstaller, w panelu szczegółów wydarzenia. – andreapier

+0

@andreapier: Dziękuję za komentarze. Tak, to prawda. Można to osiągnąć za pomocą zakładki właściwości. Tutaj właśnie pomyślałem, że łatwiej będzie zrozumieć wewnętrzne elementy. Dzięki za opinie. Tak trzymaj. – ShivanandSK

0

na wszelki wypadek ktokolwiek inny napotyka ten problem:

Co pracowało dla mnie było aktualizowanie nazwy, wersji i kodu produktu mojego instalatora. Zdecydowanie należy przestrzegać dobrej praktyki wersjonowania.

Powiązane problemy