Laden...

Setup: Update eines Windows Dienstes: "Der angegebene Dienst ist bereits vorhanden"

Erstellt von caldicot vor 12 Jahren Letzter Beitrag vor 12 Jahren 6.714 Views
C
caldicot Themenstarter:in
51 Beiträge seit 2010
vor 12 Jahren
Setup: Update eines Windows Dienstes: "Der angegebene Dienst ist bereits vorhanden"

Hi,

ich habe ein Setup Projekt gemacht, das einen Windows Dienst installiert. Das klappt auch.
Bei einem Update habe ich Assembly und die Setup Version erhöht.

Folgende Eigenschaften habe ich beim Setup gesetzt:*DetectNewerInstalledVersion = True *RemovePreviousVersions = True

Wenn ich aber das geupdatete Setup auf einer Maschine ausführe, auf der bereits der Windows Dienst installiert ist, kommt während dem Setup die Fehlermeldung "Der angegebene Dienst ist bereits vorhanden".

Ich hätte gehofft, das Setup entfernt die alte Installation bevor die neue Version installiert wird.
Oder überschreibt die alte Version mit der Neuen?

Könnte mir bitte jemand weiter helfen?

Danke
caldicot

2.298 Beiträge seit 2010
vor 12 Jahren

Problem wird die Registrierung des Dienstes sein, die im Normalfall nur bei erstinstallation ausgeführt werden muss.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

N
6 Beiträge seit 2010
vor 12 Jahren

Dafür musst du ein Major Upgrad durchführen.
Das heißt die Versionsnummer deines Installers muss an der dritten Stelle erhöht werden.
Also zb. von 1.1.1 auf 1.1.2
Des weiteren darf sich der UpgradeCode des Installers in den verschiedenen Versionen nicht unterscheiden. Der ProductCode muss aber für ein Major-Upgrade geändert werden.
So mach ich das zumindest immer bei meinen Setups.
Die erstelle ich allerdings mit dem Windows Installer Xml

Gruß Nadril

C
caldicot Themenstarter:in
51 Beiträge seit 2010
vor 12 Jahren

Hi,

danke für Eure Antworten.
Ich habe gerade probiert die Versionsnummer an der dritten Stelle zu erhöhen.
Den ProductCode habe ich geändert. UpgradeCode ist gleich geblieben.

Leider ohne gewünschtem Ergebnis.
Beim Installieren kommt der selbe Fehler.

Könnte ich die Dienst Registrierung mit einem CustomInstaller bei bereits vorhandener Installation überspringen?

Habt Ihr noch eine Idee?

Danke
caldicot

2.298 Beiträge seit 2010
vor 12 Jahren

Wie wird die Registrierung des Dienstes durchgeführt?
Mittels installutil aus einer Batch heraus?
Stellt deine Setup-Anwendung das bereits bereit?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

C
caldicot Themenstarter:in
51 Beiträge seit 2010
vor 12 Jahren

Das macht das Setup Projekt für mich.
Ich habe unter Ansicht->Benutzerdefinierte Aktionen das Dienst-Projekt zu allen 4 Kategorieren (Installieren, Commit ausführen, Rollback, Deinstallieren) hinzugefügt.
Damit wird der Dienst registriert.

G
538 Beiträge seit 2008
vor 12 Jahren

Du kannst eine Anpassung im Installer machen, so dass er überprüft ob dein Dienst schon vorhanden ist, und wen ja lässt du ihn einfach nicht auf base.OnInstall() los, sondern machst einfach nichts.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

C
caldicot Themenstarter:in
51 Beiträge seit 2010
vor 12 Jahren

Hi,

danke für den Tipp, ich habe versucht das umzusetzen leider funktioniert es nicht.
Zusätzlich zur Install Methode habe ich die OnAfterInstall Methode überschrieben um den Dienst nach der Installation automatisch zu starten.
So sieht der Code aus:


    [RunInstaller(true)]
    public partial class ProjectInstaller : System.Configuration.Install.Installer
    {
        public ProjectInstaller()
        {
            InitializeComponent();
        }

        public override void Install(IDictionary stateSaver)
        {
            if(!ServiceAlreadyInstalled(serviceInstaller.ServiceName))
                base.Install(stateSaver);
        }

        private static bool ServiceAlreadyInstalled(string serviceName)
        {
            ServiceController[] allServices = ServiceController.GetServices();
            return allServices.Any(sc => sc.ServiceName == serviceName);
        }

        protected override void OnAfterInstall(IDictionary savedState)
        {
            base.OnAfterInstall(savedState);

            ServiceController sc = new ServiceController(serviceInstaller.ServiceName);
            int count = 10;

            if (sc.Status == ServiceControllerStatus.Stopped)
            {
                sc.Start();
                while (sc.Status == ServiceControllerStatus.Stopped && count > 0)
                {
                    Thread.Sleep(1000);
                    sc.Refresh();
                    count--;
                }
            }
        }

Habe ich vielleicht irgendwas falsch gemacht?
Der Fehler bleibt der Selbe...

Danke
caldi

G
538 Beiträge seit 2008
vor 12 Jahren

Es besteht durchaus die Möglichkeit, dass der Dienst nicht in der InstallPhase sondern in der Committ-Phase im SC eingetragen wird, aber das weiß ich leider nicht auf anhieb - ist länger her, dass ich mich damit befasst habe.

Ansonsten: Die Deinstallation des Dienstes könnte scheitern, weil der Dienst läuft - vielleicht hilft schon stoppen im deinstaller?

Du wirst mal ein wenig experimentieren müssen 😉

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

C
caldicot Themenstarter:in
51 Beiträge seit 2010
vor 12 Jahren

Ok, danke 😃
Du hast Dich vorher so sicher angehört, da bin ich gar nicht auf die Idee gekommen, dass ich eine andere Methode probieren könnte zu überschreiben ..

Ich melde mich, wenn ichs ausprobiert habe ..

C
caldicot Themenstarter:in
51 Beiträge seit 2010
vor 12 Jahren

irgendwie scheint es gar nicht zu klappen.
Ich habe jeweils einzeln die Commit Methode und die Install Methode so überschrieben, dass die base Methode nur dann aufgerufen wird, wenn der Dienst nicht bereits installiert ist.
Ich habe es mit beiden Methoden gleichzeitig versucht.
Jedesmal habe ich die Major Versionnummer erhöht und den ProductCode verändert (UpdateCode ist gleich geblieben). Der Dienst war zum Zeitpunkt der Installation aus.
Trotzdem kam jedesmal die selbe Fehlermeldung, dass der Dienst bereits installiert sei.

Ich bin etwas ratlos, an was es noch liegen könnte?

Danke
caldi

C
caldicot Themenstarter:in
51 Beiträge seit 2010
vor 12 Jahren

Ich habe gerade auch nochmal probiert, die Commit und Install Methode mit einem return zu beenden ohne die Base Methode oder irgend einen anderen Code auszuführen.
Leider ebenfalls ohne Erfolg.
Es scheint als würde die Dienst Registrierung nicht hier statt finden.

Könnt Ihr mir weiterhelfen?

C
caldicot Themenstarter:in
51 Beiträge seit 2010
vor 12 Jahren

Hi,

ich habe testweise die Benutzerdefinierte Aktion "Installieren" gelöscht.
Dann wird der Dienst tatsächlich nicht registriert. Getestet habe ich es ohne dass der Dienst davor installiert war.

Daher verstehe ich nicht, warum der erste Lösungsansatz von Grumbler85 nicht funktionierte.

Ich habe außerdem probiert eine Condition bei der Installieren Aktion anzulegen.
Eine MSDN-Dokumentation habe ich dazu leider nicht gefunden.
Folgende Condtions habe ich bereits probiert:*(Not Installed) OR PREVIOUSVERSIONSINSTALLED *Not Installed *NOT Installed

Ich habe gelesen, dass die Anweisung case-sensitive ist.

Vermutlich sind die Bedingungen falsch und deswegen wird die Benutzerdefinierte Aktion trotzdem ausgeführt.

Habt Ihr vielleicht eine Idee, wie die Condition richtig heißen muss?

Danke
caldi

C
caldicot Themenstarter:in
51 Beiträge seit 2010
vor 12 Jahren

Hat keiner mehr eine Idee?
Ich konnte das Problem immer noch nicht lösen?

Würde das vielleicht mit Wix besser gehen?
Ich habe damit bisher keinerlei Erfahrung?

Danke
caldi

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo caldicot,

eine inhaltliche Idee habe ich nicht. Aber möglicherweise ist dein System nach den ganzen Versuchen einfach "aus dem Tritt" gekommen. Ich würde an deiner Stelle mal ein komplett neues Setup erstellen, wie du nach den ganzen Hinweisen meinst, dass es richtig wäre. Und dieses dann auf einem anderen, unbelasteten Rechner probieren.

herbivore