Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dienst aktualisieren (https://www.delphipraxis.net/129712-dienst-aktualisieren.html)

MacKleriker 24. Feb 2009 12:33


Dienst aktualisieren
 
Hallo Leute,

ich hätte nochmal eine Frage in Bezug auf einen Dienst...

Was ist die beste (am einfachsten für den Kunden) Möglichkeit einen TService (TServiceApplication) zu updaten??
Wie macht man das normalerweise (wenn möglich voll automatisch)?

Vielen Dank

WoGe 24. Feb 2009 13:17

Re: Dienst aktualisieren
 
Dienst beenden
File ersetzten
Dienst starten
Fertig

Allerdings ja keinen Namen im Dienst ändern

Gruss
wo

MacKleriker 24. Feb 2009 13:47

Re: Dienst aktualisieren
 
OK, das hört sich relativ logisch an.
Nun die eintscheidenten Punkte:
-die neue Version ist in einem Netzwerkverzeichnis
-die alte Version soll automatisch aktualisiert werden
-der Dienst existiert lokal im Windows-Verzeichnis


Jetzt die Problematik, auf die ich gestoßen bin:
Ich kann den Dienst als User "Netzwerkdienst" laufen lassen, somit hat dieser dann Rechte um auf den UNC Pfad zuzugreifen.
Der Dienst kopiert einen Updater (dazu später mehr) und die neue Version auf das Verzeichnis C:\.
Er startet jetzt den Updater.
Der Updater soll jetzt den Dienst beenden die Exe ersetzen und wieder starten.
Problem ist, dass der Updater vom Dienst geerbt hat und somit auch unter "Netzwerkdienst" läuft und dadurch nicht auf das Win-Verzeichnis zugreifen kann.

Ich habe jetzt auch schon versucht den Updater unter einen anderen Benutzer laufen zu lassen, aber das geht anscheinend auch nicht. (Versucht wurde "System")


Welche Möglichkeit gibt es noch?
Wie gesagt, gefordert ist:
-Die neue Version vom Dienst taucht irgendwann mal in einem Netzwerkverzeichnis auf
-Dies soll er merken und sich selbst Updaten
-Und zuguter letzt, der Dienst kann außerdem auf mehreren Rechnern laufen.


Vielen Dank!

nahpets 24. Feb 2009 14:11

Re: Dienst aktualisieren
 
Hallo,

per Batch könntest Du das so lösen, Dein Updater müsste halt diese Batch aufrufen.
Code:
@ECHO OFF
net stop DienstName
net use \\rechnername\freigegebenesVerzeichnis\ /user:Domaene\Benutzername kennwort
copy \\rechnername\freigegebenesVerzeichnis\Dienst.exe c:\Support\Dienst.Exe
net use \\rechnername\freigegebenesVerzeichnis\ /delete
net start DienstName
Zitat:

Zitat von MacKleriker
-der Dienst existiert lokal im Windows-Verzeichnis

Warum muss der Dienst auf das Windowsverzeichnis zugreifen bzw. dort liegen?
Wir haben unsere Dienste... alle in einem Supportverzeichnis liegen und halten sie so getrennt von den windowseigenen Programmen. Auf das Supportverzeichnis können wird die Rechte so vergeben, wie es für unsere Aufgaben geeignet erscheint.

MacKleriker 24. Feb 2009 14:22

Re: Dienst aktualisieren
 
Jop,
und wie soll dann diese Batch aufgerufen werden?
Das Update soll ja automatisch anlaufen!!


Zitat:

Zitat von nahpets
Warum muss der Dienst auf das Windowsverzeichnis zugreifen bzw. dort liegen?

Es ist ein Unterverzeichnis im Windows-Verzeichnis.
Dort liegen alle Computerspezifischen Einstellungen des Programms...


Danke schonmal!

nahpets 24. Feb 2009 14:30

Re: Dienst aktualisieren
 
Hallo,

die Batch kann Dein Updater aufrufen.
Das was die Batchdatei macht, müsste eigentlich auch alles über die Windows-API zu erledigen sein, da kann ich die aber nicht sagen, was mit welcher Funktion zu realisieren ist.

MacKleriker 24. Feb 2009 14:40

Re: Dienst aktualisieren
 
Ja, aber die Batchdatei wird ja wiederum mit den Rechten von "Netzwerkdienst" aufgerufen und kann nicht in das Windowsverzeichnis zugreifen!

nahpets 24. Feb 2009 15:03

Re: Dienst aktualisieren
 
Hallo,
Zitat:

Zitat von MacKleriker
Ja, aber die Batchdatei wird ja wiederum mit den Rechten von "Netzwerkdienst" aufgerufen und kann nicht in das Windowsverzeichnis zugreifen!

ja, irgendwie hast Du recht, wir laufen hier wohl momentan in eine Rekursion.

Das wollen wir dann doch mal lieber schnell abstellen:

Mache auf das Verzeichnis des Dienstes eine Freigabe, z. B.: DienstName$. Durch das $ am Ende wird es eine versteckte Freigabe, die im Explorer nicht zu sehen ist.

Code:
@ECHO OFF
net stop DienstName
:REM Laufwerksverbindung mit Anmeldung an "Fileserver"
net use \\rechnername\freigegebenesVerzeichnis\ /user:Domaene\Benutzername kennwort
:REM Laufwerksverbindung auf uns selbst mit anderer Anmeldung
net use \\%COMPUTERNAME%\LokaleFreigabe$ /user:Domaene\Benutzername kennwort
copy \\rechnername\freigegebenesVerzeichnis\Dienst.exe \\%COMPUTERNAME%\LokaleFreigabe$\Dienst.Exe
net use \\rechnername\freigegebenesVerzeichnis\ /delete
net use \\%COMPUTERNAME%\ObenGenannteFreigabe$ /delete
net start DienstName
Über die "Eleganz" dieser Lösung wollen wir uns lieber nicht streiten :wink:

Ansonsten schau bitte mal, ob Du mit CreateProcess nicht weiter kommst.

MacKleriker 24. Feb 2009 15:10

Re: Dienst aktualisieren
 
Man kann doch den Dienst gar nicht über "Netzwerk" installieren (bzw. starten) oder?
Als ich das vor ein paar Tagen probiert hab, ging es jedenfalls nicht wirklich... :gruebel:

Vielen Dank!

nahpets 24. Feb 2009 15:23

Re: Dienst aktualisieren
 
Hallo,
Zitat:

Zitat von MacKleriker
Man kann doch den Dienst gar nicht über "Netzwerk" installieren (bzw. starten) oder?
Als ich das vor ein paar Tagen probiert hab, ging es jedenfalls nicht wirklich... :gruebel:

Vielen Dank!

was willst Du damit sagen, dass der Benutzer, unter dessen Anmeldung der Dienst läuft, den Dienst nicht beenden und starten darf?
Dann müsstest Du wohl probieren, über Deinen Updater mit CreateProcess einen weiteren Prozess zu starten, dem beim Start die entsprechenden Benutzerrechte mitgegeben werden.

MacKleriker 24. Feb 2009 15:31

Re: Dienst aktualisieren
 
Ne,
ich meinte, dass man einen Dienst nicht mit einem Netzwerkpfad installieren kann.
Der dienst wird zwar installiert, man kann ihn aber nicht starten! (Soweit ich das probiert hab)

Mit CreateProcess bzw. CreateProcessAsUser mit LogonUser davor hab ichs auch schon versucht, aber das funzt ja auch nicht.

Gibts denn keine andere Lösung?


Dankä!

nahpets 24. Feb 2009 15:47

Re: Dienst aktualisieren
 
Hallo,
Zitat:

Zitat von MacKleriker
Ne,
ich meinte, dass man einen Dienst nicht mit einem Netzwerkpfad installieren kann.
Der dienst wird zwar installiert, man kann ihn aber nicht starten! (Soweit ich das probiert hab)

Mit CreateProcess bzw. CreateProcessAsUser mit LogonUser davor hab ichs auch schon versucht, aber das funzt ja auch nicht.

Gibts denn keine andere Lösung?


Dankä!

die Batchdatei kopiert doch die EXE des Dienstes nach C:\Windows..., das sollte doch funktionieren, ggfls. musst Du auf dem Dienstverzeichnise entsprechende Rechte für den Netzwerkdienst einrichten.

WoGe 24. Feb 2009 15:54

Re: Dienst aktualisieren
 
Zitat:

ich meinte, dass man einen Dienst nicht mit einem Netzwerkpfad installieren kann.
Steht so - glaub ich - auch bei MS.
Ist ja auch logisch, weil Dienste ja auch starten können (müssen) wenn gerade mal kein Netzwerk da ist.
Der Dienst befindet sich indem das Verzeichnis aus dem der Dienst installiert wird.

Gruss
wo

MacKleriker 25. Feb 2009 08:19

Re: Dienst aktualisieren
 
Guten Morgen.

Also ist das schon mal nicht ganz so optimal mit den Netzwerkpfaden...
Aber wie könnte man so etwas sonst lösen?
Irgendeine Möglichkeit muss es doch geben um einen Dienst sauber, selbstständig und sicher zu aktualisieren, auch im Netzwerk?!

Danke!

Thomas83 25. Feb 2009 14:15

Re: Dienst aktualisieren
 
Dienst schaut alle x sekunden nach ob es ein update gibt (z.B. webseite, netzwerk etc.)
wenn es eine neue version gibt. Updater starten
updater beendet dienst
kopiert neue datei
startet den dienst

das müste eigentlich eine sinvolle Lösung sein, oder?

SirThornberry 25. Feb 2009 14:28

Re: Dienst aktualisieren
 
Zitat:

Zitat von Thomas83
Dienst schaut alle x sekunden nach ob es ein update gibt (z.B. webseite, netzwerk etc.)
wenn es eine neue version gibt. Updater starten
updater beendet dienst
kopiert neue datei
startet den dienst

das müste eigentlich eine sinvolle Lösung sein, oder?

Kann es sein das du den Thread hier nicht vollständig gelesen hast?
Wenn der Dienst unter dem Konto Netzwerkdienst läuft kann er zwar das neue Update vom Netzwerk lesen aber das Konto Netzwerkdienst hat standardmäßig eben keine Rechte um im Windowsverzeichnis das update zu plazieren.

Meiner Meinung nach gibt es keine Möglichkeit unter Verwendung eines Kontos was entweder nur Rechte für das eine oder nur Rechte für das andere hat. Du braucht entweder ein Konto was für beides die Rechte hat oder du musst eben die Berechtigungen anpassen.

Ich weiß nicht um was für einen Dienst es sich genau handelt und ob es erlaubt ist das dieser nicht läuft wenn das Netzwerk nicht erreichbar ist. Ich würde (wenn der Dienst nicht zwangsläufig immer laufen muss sondern nur wenn Netzwerk vorhanden ist) die gesamte Logic des Dienstes in eine DLL auslagern und diese vom Dienst laden lassen. Dadurch kann der Dienst die Logic aktuallisieren ohne sich selbst beenden zu müssen und es bleibt die Möglichkeit das die Logic auf dem Letzlaufwerk liegen bleiben kann. Sozusagen kann der Dienst dann schauen welches die aktuellste DLL im Netzwerkpfad ist und diese Laden. Kommt eine aktuellere hinzu lädt er diese.

Thomas83 25. Feb 2009 14:34

Re: Dienst aktualisieren
 
Zitat:

Zitat von SirThornberry
Kann es sein das du den Thread hier nicht vollständig gelesen hast?

lol doch gelesen aber irgend wie nich wahrgenommen....

Zitat:

Zitat von nahpets
Hallo,
Mache auf das Verzeichnis des Dienstes eine Freigabe, z. B.: DienstName$. Durch das $ am Ende wird es eine versteckte Freigabe, die im Explorer nicht zu sehen ist.

Dann halt per Freigabe wo das Konto die Rechte hat.
Man installiert den Dienst auf C:\windows\meinProgramm
und bei der Freigabe meinProgramm$ kannste den Dienst kopieren und wieder starten.

Kirchi 25. Feb 2009 15:18

Re: Dienst aktualisieren
 
Muss der Dienst eigentlich mit dem Netzwerkdienste-User laufen :?:

Du kannst ja auch den Dienst unter dem System laufen lassen und bei der Freigabe in den Sicherheitseinstellungen die Computer bzw. eine Computergruppe den Zugriff gewähren. Somit kannst Du auf den UNC-Pfad zugreifen und auf das Windows Verzeichnis.

SirThornberry 25. Feb 2009 16:09

Re: Dienst aktualisieren
 
Der Dienst muss mit dem Netzwerkdienstuser laufen damit er Zugriff/Berechtigungen auf Netzwerkressourcen hat :-)

Kirchi 26. Feb 2009 17:03

Re: Dienst aktualisieren
 
Muss nicht. Ich habe Dienste mit System Rechten laufen, die auch auf Netzwerkresourcen zugreifen können. Wir haben hier Windows XP mit Server 2003 im Einsatz und unsere Dienste können ohne Probleme auf die Resourcen zugreifen. Wie bereits erwähnt, muss man bei den Resource definieren welche Computer bzw. Computergruppen Zugriff haben dürfen. Liegt wahrscheinlich da dran, dass jeder PC auch seinen eigenen Account in der Domäne hat.

MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz