Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dienst "Wiederherstellen"-Option einstellen (https://www.delphipraxis.net/84813-dienst-wiederherstellen-option-einstellen.html)

gsh 22. Jan 2007 11:11


Dienst "Wiederherstellen"-Option einstellen
 
Hi DPLer

ich möchte eigentlich das gleiche wie hier aber leider ist bei diesem thema ist keine antwort für mich rausgekommen.

Also nochmal fürs Protokoll: Ich programmiere einen Dienst der später auf einem Server laufen soll. D.h. er sollte die ganze Zeit durchlaufen. Da ich nur ein mensch bin :stupid: hat dieser Dienst sicher Fehler drinnen und jetzt möchte ich halt wenn der dienst abstürzt das der Dienst neu gestartet wird. Dies kann ich ja über die Option Wiederherstellen (In der dienstverwaltung -> unter Eigenschaften des Dienstes) erreichen. Nur wie schaff ich des der Dienst sich des selber einträgt?

gsh 23. Jan 2007 12:32

Re: Dienst "Wiederherstellen"-Option einstellen
 
*push* :feuerchen:

gsh 24. Jan 2007 13:44

Re: Dienst "Wiederherstellen"-Option einstellen
 
*push²* :duck:

Olli 25. Jan 2007 18:18

Re: Dienst "Wiederherstellen"-Option einstellen
 
Nunja, der Dienst kann schwerlich abstuerzen, wenn du SEH (try/except und try/finally) sinnvoll einsetzt. Daher sollte es ausreichen, wenn du es als Schleife konzipierst, ala:


Delphi-Quellcode:
while(ServiceRunning)do
try
// Hauptarbeit erledigen
except
// Fehler melden und naechsten Schleifendurchlauf angehen
end;

gsh 25. Jan 2007 19:35

Re: Dienst "Wiederherstellen"-Option einstellen
 
bringt mir gar nichts
Da das programm sehr leicht über den tcpserver und so weiter abstürzen kann.

Aber des ist ja auch egal wenn ich des alles über try except machen könnte dann würde ich ja nicht hier fragen
Außerdem ist es halt vorallem wichtig falls ich was vergessen hab zu sichern oder sonst was für ein problem auftritt das er ohne den benutzer neu startet

Olli 25. Jan 2007 19:44

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von gsh
Da das programm sehr leicht über den tcpserver und so weiter abstürzen kann.

Tcpserver? Aehem, du hast schon gelesen was ich geschrieben habe, oder? Ist doch piepegal ob innerhalb des try/except-Blocks was abstuerzt. Dann geht's eben weiter mit der naechsten Schleife. Service-Hauptfunktionen sind ohnehin ueblicherweise als Schleife implementiert. Es ist also ueberhaupt kein Problem, auch wenn du eins draus machen willst.

Oder reden wir hier von einem externen Prozess, mit dem dein Service kommuniziert?

Zitat:

Zitat von gsh
Aber des ist ja auch egal wenn ich des alles über try except machen könnte dann würde ich ja nicht hier fragen
Außerdem ist es halt vorallem wichtig falls ich was vergessen hab zu sichern oder sonst was für ein problem auftritt das er ohne den benutzer neu startet

Okay, wenn es nicht via SEH geht, dann hast du hier offenbar wichtige Fakten verschwiegen, die unabdingbar fuer eine sinnvolle Antwort sind. Das ist dann aber eher dein Problem.

gsh 25. Jan 2007 20:06

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von Olli
Tcpserver? Aehem, du hast schon gelesen was ich geschrieben habe, oder? Ist doch piepegal ob innerhalb des try/except-Blocks was abstuerzt. Dann geht's eben weiter mit der naechsten Schleife. Service-Hauptfunktionen sind ohnehin ueblicherweise als Schleife implementiert. Es ist also ueberhaupt kein Problem, auch wenn du eins draus machen willst.

ja schon aber den service kann ich nicht in eine schleife packen. Da ich mit dem tcp server ereigniss orientiert bin.

Zitat:

Zitat von Olli
Oder reden wir hier von einem externen Prozess, mit dem dein Service kommuniziert?

Weiss jetzt nicht genau was du meinst. Wenn du meinst des sich Clients auf dem server connecten und ab und zu mal ne message schicken worauf der server reagieren muss dann JA

Zitat:

Zitat von Olli
Okay, wenn es nicht via SEH geht, dann hast du hier offenbar wichtige Fakten verschwiegen, die unabdingbar fuer eine sinnvolle Antwort sind. Das ist dann aber eher dein Problem.

SEH? Wichtige Fakten vergessen? Wenn ich frag wie man die Wiederherstellungs Optionen einstellen kann, was brauchst du dann für Fakten?
Außerdem will ich dieses Wissen dann nicht nur für diesen Fall nutzen. Da ich mir sicher bin das ich noch andere Service schreiben werde wo ich des auch gut gebrauchen kann

Olli 25. Jan 2007 20:24

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von gsh
ja schon aber den service kann ich nicht in eine schleife packen. Da ich mit dem tcp server ereigniss orientiert bin.

Okay, an welcher Stelle kollidiert das jetzt mit meiner Aussage? Ich gehe mal davon aus, dass du eine TCP-Server-Komponente (Indy oder aehnliches) meinst. Dann wuerde der Absturz aber nach wie vor abgefangen und der "Server" (als neue Instanz) im naechsten Schleifendurchlauf neu erzeugt.

Zitat:

Zitat von gsh
Weiss jetzt nicht genau was du meinst. Wenn du meinst des sich Clients auf dem server connecten und ab und zu mal ne message schicken worauf der server reagieren muss dann JA

Nein, ich meine das was du als "TCP-Server" und das was du als "Dienst" bezeichnest. Sind das separate Prozesse?

Zitat:

Zitat von gsh
SEH?

Structured Exception Handling -> try/except und try/finally

Zitat:

Zitat von gsh
Wichtige Fakten vergessen? Wenn ich frag wie man die Wiederherstellungs Optionen einstellen kann, was brauchst du dann für Fakten?

Okay, was genau meinst du dann mit "Wiederherstellung-Optionen". Offenbar ein weiteres Missverstaendnis?! Ich habe NT-Dienste schon vor ueber 6 Jahren geschrieben aber davon noch nichts gehoert, weswegen es sich entweder um etwas Bekanntes unter neuem Namen oder um etwas neues und Unbekanntes handeln duerfte.

Zitat:

Zitat von gsh
Außerdem will ich dieses Wissen dann nicht nur für diesen Fall nutzen. Da ich mir sicher bin das ich noch andere Service schreiben werde wo ich des auch gut gebrauchen kann

Ja, genau deshalb solltest du robusten Code schreiben und SEH (sinnvoll) benutzen.

gsh 25. Jan 2007 20:44

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von Olli
Okay, an welcher Stelle kollidiert das jetzt mit meiner Aussage? Ich gehe mal davon aus, dass du eine TCP-Server-Komponente (Indy oder aehnliches) meinst. Dann wuerde der Absturz aber nach wie vor abgefangen und der "Server" (als neue Instanz) im naechsten Schleifendurchlauf neu erzeugt.

ja ich meine einen Indy server.
1. macht der Dienst nicht nur des.
2. wenn ich den server in deiner schleife auf active := true setzten würde dann würde er in einem anderen thread arbeiten anfangen und er würde die schleife weiter abarbeiten da kein fehler aufgetreten ist würde er wieder an den anfang der schleife springen und wieder den server auf True setzten. ... Ich glaub das wäre sehr schwer zu realiesieren und außerdem möchte ich nicht das die ganze zeit ein schleife durchläuft :roll:
3. Bevor mir da jetzt noch länger streiten. Es ist doch eigentlich egal was der dienst macht :|

Zitat:

Zitat von Olli
Nein, ich meine das was du als "TCP-Server" und das was du als "Dienst" bezeichnest. Sind das separate Prozesse?

Der TCP-Server ist ein idTCPServer (Indy) der als komponente auf dem Dienst läuft.

Zitat:

Zitat von Olli
Okay, was genau meinst du dann mit "Wiederherstellung-Optionen". Offenbar ein weiteres Missverstaendnis?! Ich habe NT-Dienste schon vor ueber 6 Jahren geschrieben aber davon noch nichts gehoert, weswegen es sich entweder um etwas Bekanntes unter neuem Namen oder um etwas neues und Unbekanntes handeln duerfte.

Geh mal Systemsteuerung -> Verwaltung -> Dienste
Dort klickst du auf einen dienst rechts drauf -> Eigenschaften
Dort gibt es einen Reiter "Wiederherstellung". Genau des meine ich

Zitat:

Zitat von Olli
Ja, genau deshalb solltest du robusten Code schreiben und SEH (sinnvoll) benutzen.

Ja das versuche ich ja, aber ich bin auch nur ein Mensch

Olli 25. Jan 2007 21:02

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von gsh
ja ich meine einen Indy server.
1. macht der Dienst nicht nur des.
2. wenn ich den server in deiner schleife auf active := true setzten würde dann würde er in einem anderen thread arbeiten anfangen und er würde die schleife weiter abarbeiten da kein fehler aufgetreten ist würde er wieder an den anfang der schleife springen und wieder den server auf True setzten. ... Ich glaub das wäre sehr schwer zu realiesieren und außerdem möchte ich nicht das die ganze zeit ein schleife durchläuft :roll:

Angenommen es ist in einem Thread (der ja seine eigene SEH-Sicherung von Windows bekommt), wuerde sich ja genau dieser Thread beenden. Damit waeren wir wieder am Ausgang unseres Gespraeches: du koenntest die Beendigung des Threads in einer Schleife mit WaitForSingleObject ueberwachen und darauf reagieren indem du den Thread neu startest oder eine neue Serverinstanz erzeugst.

Somit muesstest du noch nichtmal die Failure-Optionen setzen ... aber naja, scheint wohl eine Geschmacksfrage zu sein, ob man fuer die TCB robusten Code bevorzugt, oder lieber moegliche Sicherheitsloecher aufreisst.

Zitat:

Zitat von gsh
3. Bevor mir da jetzt noch länger streiten. Es ist doch eigentlich egal was der dienst macht :|

Stimmt genau.

Zitat:

Zitat von gsh
Geh mal Systemsteuerung -> Verwaltung -> Dienste
Dort klickst du auf einen dienst rechts drauf -> Eigenschaften
Dort gibt es einen Reiter "Wiederherstellung". Genau des meine ich

Ah, gut. Danke.

Dazu benutzt du MSDN-Library durchsuchenQueryServiceConfig2 und MSDN-Library durchsuchenChangeServiceConfig2 jeweils mit SERVICE_CONFIG_FAILURE_ACTIONS und der SERVICE_FAILURE_ACTIONS-Struktur. Sollte bei JEDI-Apilib enthalten sein ...

Zitat:

Zitat von gsh
Ja das versuche ich ja, aber ich bin auch nur ein Mensch

Sind wir doch alle :zwinker: ... soweit ich weiss *g*

Phoenix 25. Jan 2007 21:06

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von Olli
Zitat:

Zitat von gsh
Geh mal Systemsteuerung -> Verwaltung -> Dienste
Dort klickst du auf einen dienst rechts drauf -> Eigenschaften
Dort gibt es einen Reiter "Wiederherstellung". Genau des meine ich

Ah, gut. Danke.

Dazu benutzt du MSDN-Library durchsuchenQueryServiceConfig2 und MSDN-Library durchsuchenChangeServiceConfig2 jeweils mit SERVICE_CONFIG_FAILURE_ACTIONS und der SERVICE_FAILURE_ACTIONS-Struktur. Sollte bei JEDI-Apilib enthalten sein ...

Das bedeutet Du kennst das schon *g*
Unter welcher Bezeichnung läuft das bei Dir, Olli? ;-)

Olli 25. Jan 2007 21:08

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von Phoenix
Das bedeutet Du kennst das schon *g*
Unter welcher Bezeichnung läuft das bei Dir, Olli? ;-)

Nunja, da ich meinen Code (ja, auch den privaten) auf Englisch kommentiere tendiere ich zum englischen Begriff oder einer direkten Uebersetzung.

Nachtrag: Sagen wir mal so, die Tatsache, dass ich (als ich noch die Zeit dazu hatte) mich wild durch's PSDK gewuehlt habe, zahlt sich noch immer aus *g*

gsh 25. Jan 2007 21:23

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von Olli
Ah, gut. Danke.

Dazu benutzt du MSDN-Library durchsuchenQueryServiceConfig2 und MSDN-Library durchsuchenChangeServiceConfig2 jeweils mit SERVICE_CONFIG_FAILURE_ACTIONS und der SERVICE_FAILURE_ACTIONS-Struktur. Sollte bei JEDI-Apilib enthalten sein ...

hmm ja sagt mir nichts :mrgreen:
Ich hab mich noch nie wirklich in der msdn zurecht gefunden. Ich verstehs einfach nicht :stupid:

JEDI-Apilib? Sagt mir auch nichts

Olli 25. Jan 2007 21:50

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von gsh
Zitat:

Zitat von Olli
Ah, gut. Danke.

Dazu benutzt du MSDN-Library durchsuchenQueryServiceConfig2 und MSDN-Library durchsuchenChangeServiceConfig2 jeweils mit SERVICE_CONFIG_FAILURE_ACTIONS und der SERVICE_FAILURE_ACTIONS-Struktur. Sollte bei JEDI-Apilib enthalten sein ...

hmm ja sagt mir nichts :mrgreen:
Ich hab mich noch nie wirklich in der msdn zurecht gefunden. Ich verstehs einfach nicht :stupid:

Das waere Minimalanforderung an jeden Windowsprogrammierer :zwinker:

Zitat:

Zitat von gsh
JEDI-Apilib? Sagt mir auch nichts

http://jedi-apilib.sf.net ... moegliche Bugs darfste auch gleich an mich weiterleiten :zwinker:

gsh 26. Jan 2007 12:43

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von Olli
http://jedi-apilib.sf.net ... moegliche Bugs darfste auch gleich an mich weiterleiten :zwinker:

hmm ich hab mir des mal geholt. hab auch glaub ich die richtige datei gefunden "JwaWinSvc.pas"
Auch die Functionen hab ich gefunden
Delphi-Quellcode:
function ChangeServiceConfig(hService: SC_HANDLE; dwServiceType, dwStartType,
  dwErrorControl: DWORD; lpBinaryPathName, lpLoadOrderGroup: LPCTSTR;
  lpdwTagId: LPDWORD; lpDependencies, lpServiceStartName, lpPassword,
  lpDisplayName: LPCTSTR): BOOL; stdcall;
{$EXTERNALSYM ChangeServiceConfig}
aber da kann ich ja keine Wiederherstellungsoptionen einstellen oder?

gsh 26. Jan 2007 12:56

Re: Dienst "Wiederherstellen"-Option einstellen
 
hab was anderes gefunden:
Und zwar in der Regedit:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\{ ServiceName}
Da sind die einstellungen von einem Service. Und dort gibt es auch einen schlüssel names: FailureActions
Da sind aber leider alles nur binärdaten drinnen:

Beispiel (Ohne eine Aktion):
Code:
00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 4E 00 42 00 00 00 00 00 60 EA 00 00 00 00 00 00 60 EA 00 00 00 00 00 00 00 00 00 00
Beispiel (1. Aktion: Dienst neustarten):
Code:
00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 4E 00 42 00 01 00 00 00 60 EA 00 00 00 00 00 00 60 EA 00 00 00 00 00 00 00 00 00 00
Aber des konnte problematisch werden wenn ich des direkt änder. Oder?

Olli 26. Jan 2007 14:08

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von gsh
hab was anderes gefunden:
Aber des konnte problematisch werden wenn ich des direkt änder. Oder?

Jupp, könnte es. Daher solltest du einfach besagte API benutzen. Mach mal bitte folgendes: miste deinen Service so aus, daß nichts mehr drin ist außer dem eigentlichen Service-Kram. Also kein Server usw. und schicke mir das Ergebnis zu! Ich werde mich bemühen dir schnellstmöglich ein angepaßtes Beispiel zukommen zu lassen. Ich nehme nämlich an, daß du irgendeine Service-Komponente/Klasse benutzt und nicht den Standardweg. Daher dieser Umweg.

gsh 26. Jan 2007 14:21

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von Olli
Jupp, könnte es. Daher solltest du einfach besagte API benutzen. Mach mal bitte folgendes: miste deinen Service so aus, daß nichts mehr drin ist außer dem eigentlichen Service-Kram. Also kein Server usw. und schicke mir das Ergebnis zu! Ich werde mich bemühen dir schnellstmöglich ein angepaßtes Beispiel zukommen zu lassen. Ich nehme nämlich an, daß du irgendeine Service-Komponente/Klasse benutzt und nicht den Standardweg. Daher dieser Umweg.

Was? Wenn ich alles raushaue dann kann ich ja gleich schon einfach auf Neu-> Service-Anwendung klicken. :gruebel:
Die zwei standart funktionen sind immer noch vorhanden:
Delphi-Quellcode:
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  LibraServerService.Controller(CtrlCode);
end;

function TLibraServerService.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;
und der service ist immer noch von der klasse class(TService). Also was soll anderes sein?

Olli 26. Jan 2007 23:54

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von gsh
und der service ist immer noch von der klasse class(TService). Also was soll anderes sein?

Ich weiß nicht, vermutlich könnte sein, daß ich zu doof zur Telepathie bin und es ja nur ein paar dutzend verschiedene Möglichkeiten gibt, wie man nun konkret die Implementation vornimmt :roll: ... oder vielleicht ist mir (und dem Forum als du Absenden geklickt hast) ja entgangen, daß du TService geschrieben hast? Da ich leider ein bißchen blöde bin, konnte ich diesen meinen Fehler ja nicht bemerken.

Also weiß nicht, einer der Gründe wird's wohl gewesen sein :wall:

gsh 27. Jan 2007 10:08

Re: Dienst "Wiederherstellen"-Option einstellen
 
Zitat:

Zitat von Olli
Ich weiß nicht, vermutlich könnte sein, daß ich zu doof zur Telepathie bin und es ja nur ein paar dutzend verschiedene Möglichkeiten gibt, wie man nun konkret die Implementation vornimmt :roll: ... oder vielleicht ist mir (und dem Forum als du Absenden geklickt hast) ja entgangen, daß du TService geschrieben hast? Da ich leider ein bißchen blöde bin, konnte ich diesen meinen Fehler ja nicht bemerken.

Ich hab ganz am anfang geschrieben des ich einen dienst habe also imho ein TService. Ich weiss ja nicht wie man sonst noch services schreibt. Aber ich hab es mir ganz einfach mit Neu -> Service-Anwendung gemacht :mrgreen:
Und wie kann ich jetzt mit einem TService des einstellen?

SirThornberry 27. Jan 2007 10:53

Re: Dienst "Wiederherstellen"-Option einstellen
 
TService macht das in seiner Installroutine automatisch. Dir wird also nix anderes übrig bleiben als das AfterInstall (oder so ähnlich) zu nutzen und dort das ganze nochmal mit den Apifunkionen abändern.

gsh 27. Jan 2007 12:16

Re: Dienst "Wiederherstellen"-Option einstellen
 
hab ich mir schon gedacht. aber wie änder ich des mit api funktionen?

gsh 2. Feb 2007 20:03

Re: Dienst "Wiederherstellen"-Option einstellen
 
*push* :duck:


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

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