Service soll auf eine Benutzeranmeldung reagieren
-
Hallo,
ich habe eine Service (mit Builder Xe7) erstellt. Dieser wird bei Rechnerstart automatisch gestartet.
Sobald sich ein Benutzer nun anmeldet am System, soll mein Service z.B. eine Meldung auf dem Bildschirm erstellen. Wie kann mein Service diese Benutzeranmeldung erkennen u. darauf reagieren?
Danke!
-
Services können keine Meldungen auf Desktops erzeugen.
Starte auf dem Desktop über Run/Runonce/Atostart ein extra Programm das mit dem Service kommuniziert.
-
Danke,
aber ein Service kann so etwas wie ein Logon Event erkennen und dann als Reaktion darauf z.B. eine ZeigeMeldung.exe starten.
Wie kann der Service dieses Logon Event erkennen?
-
Es gibt 1000 Arten "Logon Events".
Welche davon interessieren dich?Davon abgesehen... eine Möglichkeit wäre das Event-Log zu überwachen. Das haben wir mal für nen Serversystem gemacht, wo per Gesetz interaktive Logons protokolliert werden mussten (wer, wann, warum).
(Den "warum" Teil konnte das Service natürlich nicht machen, dafür mussten wir dann sowieso mitschreiben, nur war auch gefordert dass die "wer/wann" Daten automatisch erfasst werden und live über ein Web-Interface abfragbar sind.)
-
Auf jeden Fall muss dann wohl eine zyklische Abfrage per Timer im Service stattfinden, dann wird das doch nicht so schwierig.
-
Uff.
Also wir haben es so gemacht. Ich kann aber nicht sagen ob es nicht noch andere Möglichkeiten gibt.Das nette an der Lösung über's Event-Log ist halt dass man auch Logon Events mitbekommt die stattgefunden haben während das Service gerade nicht gelaufen ist.
Vorausgesetzt natürlich sie werden geloggt (soweit ich weiss kann man das per Group-Policy abdrehen). Und vorausgesetzt das Event-Log wurde nicht gelöscht/modifiziert (das geht auf jeden Fall, jeder Admin kann das Log löschen).Und wenn das System entsprechend konfiguriert ist (=diesen Typ von Logon Events loggt), bekommt man sogar mit wenn sich jemand nicht-interaktiv anmeldet. z.B. einfach jemand der ein File von einem Server runterkopiert.
----
Wenn du es so implementieren willst, also per Polling, würde ich empfehlen dass dein Service sich die ID des zuletzt gelesenen Event-Log Eintrags merkt. Und dann nur Events > dieser ID liest. Dann ist das Polling halbwegs billig.
-
Danke!
-
Es kann interaktiv ZeigeMeldung nicht starten. Für welchen, denn der vielen angemeldeten Benutzer?
Aber es kann dem schlafenden Prozess eine Nachricht geben...
-
es gibt da so einen registry Eintrag, oder besser, meist gibt es ihn nicht und man muss ihn selber anlegen:
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Winlogon2 neue string values darin erstellen:
1. LegalNoticeCaption -> "dein Meldungs Titel"
2. LegalNoticeText -> "deine Meldung"nun wird bei jedem Start eine Messagebox mit entsprechendem Titel und Inhalt ausgegeben.
in Pascal/Delphi sähe das z.b so aus:
program startMsg; {$APPTYPE CONSOLE} uses SysUtils, Registry, Windows; const KEY_msg = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon'; var Reg: TRegistry; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey(KEY_msg, False) then begin Reg.WriteString('LegalNoticeCaption','"Hier steht der Titel"'); Reg.WriteString('LegalNoticeText','"Hier ist deine Meldung"'); Reg.CloseKey; end; finally Reg.Free; end; end.
sollte kein Problem sein das zu porten...
mfg
-
@jodoissneaw: Und in wie weit hilft das zu der Frage?