Autor Beitrag
Patrick Marti
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 26.10.07 09:09 
Guten Tag
Ich habe ein spezielles Backup-Programm erstellt.
Mit einem externen Programm, habe ich einen Service erstellt damit es auch dann läuft, wenn niemand angemeldet ist und das klappt gut so.
Sobald sich aber jemand anmeldet und wieder abmeldet, wird das Programm beim Abmelden gestoppt.

Ich habe etwas gefunden mit CTRL_LOGOFF_EVENT und SetConsoleCtrlHandler(@HandlerRoutine, True) und dies in meine Applikation eingebaut, aber es hat mir nichts gebracht.
Nach Tests bin ich sicher, dass die HandlerRoutine aufgerufen wird, aber den Case CTRL_LOGOFF_EVENT bin ich mir nicht sicher und wie merkt Delphi, dass ich das CTRL_LOGOFF_EVENT überhaupt verarbeitet habe, wenn ich doch die Funktion als ganzes mit true oder false beantworte und nicht den konkreten Lofoff-Fall?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
implementation

uses Konfig, Job, DBMutation, Mandant, Info;

{$R *.DFM}

function HandlerRoutine(dwCtrlType: DWord): Bool; stdcallfar;
var
  res : bool;
begin
  res := true;
  case dwCtrlType of
    CTRL_LOGOFF_EVENT:
      res := false; // Habe mit true und false erfolglos experimentiert
  end;
  HandlerRoutine := res;
end;

procedure TFormMain.FormActivate(Sender: TObject);
begin
  SetConsoleCtrlHandler(@HandlerRoutine, True);
  ...
end;


Wenn da jemand bescheid weiss, bin ich riesig dankbar
Gruss Patrick Marti

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 26.10.07 09:55 
user profile iconPatrick Marti hat folgendes geschrieben:
Guten Tag
Ich habe ein spezielles Backup-Programm erstellt.
Mit einem externen Programm, habe ich einen Service erstellt damit es auch dann läuft, wenn niemand angemeldet ist und das klappt gut so.
Sobald sich aber jemand anmeldet und wieder abmeldet, wird das Programm beim Abmelden gestoppt.

Wer macht denn jetzt die eigentliche Arbeit? Der Dienst oder das Programm? Ein Dienst, so fern er nicht an einen Benutzer gebunden ist, sollte sich nicht beim Abmelden eines Benutzers beenden. Was hats du denn schon getan, um den Fehler zu finden? Schreibst du eine Log-Datei oder machst du Einträge in die Ereignisanzeige...
Patrick Marti Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 26.10.07 10:21 
Vielen Dank für die promte Reaktion
Also, die Arbeit macht mein Backupprogramm. Dieser Service habe ich mit einem externen Programm welches ich heruntergeladen habe (RunAsSvc.exe) erstellt.

Wenn ich den Server starte ohne mich jedoch anschliessend anzumelden, wird ein anstehender Backup effektiv ausgeführt.
Wenn ich mich anmelde natürlich auch.
Wenn ich mich jedoch auslogge (sogar remote) wird mein Programm beendet und beim wiederanmelden sehe ich einfach, dass der Service dann auch nicht mehr läuft. Der Service läuft unter Lokales System.
Eine Messagebox, welche zwar nicht angezeigt wird, aber einen Fehler wirft, hat mir verraten, dass die Funktion "HandlerRoutine" noch aufgerufen wird.

Ich denke, dass ich bei den Ereignissen nichts herausfinden werde, da ja nicht ein Programmfehler an sich passiert, sondern der Programmablauf ist einfach nicht wie von mir gewünscht, weil ich vermutlicherweise etwas falsch mache.

Übrigens, das Problem habe ich diversemale im Internet beschrieben gefunden, daher ja auch diese HandlerRoutine-Funktion, aber eben, klappt trotzdem nicht (Beschriebe immer in C++).
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 26.10.07 11:01 
user profile iconPatrick Marti hat folgendes geschrieben:
Dieser Service habe ich mit einem externen Programm welches ich heruntergeladen habe (RunAsSvc.exe) erstellt.

Ich nehme mal an, wenn du dich abmeldest wird auch dieses komische andere Programm RunAsSvc beendet und damit auch das Programm, was RunAsSvc als Dienst laufen lässt beednet. Was soll dieser Murks mit RunAsSvc? Warum schreibst du nicht einen richtigen Dienst, was die saubere Lösung wäre?
Patrick Marti Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 26.10.07 14:59 
Das mit dem Self Made Service ist sicher ein berechtigter Einwand.
aber:
- Ich arbeite mit Delphi 4
- Ich wüste nicht wie so einen Service zu erstellen (bin eben kein Profi)

Der Service wird nur dann beim Logoff gestoppt, wenn ich die Option "Datenaustausch zwischen Dienst und Desktop zulassen" in den Eigenschaften des Services selektiert habe, also meine Applikation sichtbar ist.
So gesehen, ist also dieses RunAsSvc.exe sicher ok.

Vielen Dank jedenfalls für die
Tipps
Gruss
Patrick Marti


PS: Übrigens dieses RunAsSvc.exe wird als vielgerühmte Alternative zum srvany.exe von Windows angeboten.
Auch ich finde es praktisch für Antiprofis wie ich umso mehr das Tool als Freeware vom Autor erhältlich
ist.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 26.10.07 15:37 
user profile iconPatrick Marti hat folgendes geschrieben:
Das mit dem Self Made Service ist sicher ein berechtigter Einwand.
aber:
- Ich arbeite mit Delphi 4
- Ich wüste nicht wie so einen Service zu erstellen (bin eben kein Profi)

Es gibt entsprechende Tutorials im Internt.

Zitat:
Der Service wird nur dann beim Logoff gestoppt, wenn ich die Option "Datenaustausch zwischen Dienst und Desktop zulassen" in den Eigenschaften des Services selektiert habe,

Nun ja, da beim Abmelden die aktuelle Session beendet wird, mit der der Service Daten austauscht, wird sich der Dienst wohl beenden, weil er keine daten mehr austauschen kann. Zu dem ist das eine ganz schlechte Lösung, da zum einem so ein riesen Sicherheitsloch geöffnet wird, Microsoft empfiehlt deshalb selber dies nicht zu tun und zum anderen dürfte dein Dienst unter Vista eh nicht mehr laufen, weil es dort dies Feature aus oben genannten Gründen nicht mehr gibt.