AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Daten aus der Registry lesen mit TService
Thema durchsuchen
Ansicht
Themen-Optionen

Daten aus der Registry lesen mit TService

Ein Thema von fips0705 · begonnen am 28. Mär 2007 · letzter Beitrag vom 13. Apr 2007
Antwort Antwort
Seite 1 von 3  1 23      
fips0705

Registriert seit: 13. Sep 2006
45 Beiträge
 
#1

Daten aus der Registry lesen mit TService

  Alt 28. Mär 2007, 10:46
Hallo,

ich versuche einen NT-Dienst zu schreiben, in dem ich prüfe ob ein bestimmter Rechner noch über einen Ping im Netzwerk zu erreichen ist. Dies funktioniert auch sehr gut. Der Dienst lässt sich starten und stoppen, nur wenn ich die gespeicherten Daten aus der Registry lesen will tut sich gar nichts. Er liest die Daten nicht.
Wenn ich den Abschitt für das lesen der Registry deaktiviere, funktioniert die Routine, so wie jetzt wird der Timer nicht vollständig durchlaufen.
Oder kann man im TService nicht in der Registry lesen.
Wo habe ich da einen Denkfehler.
Delphi-Quellcode:
 

//------------------------------------------------------------------------------
// Arbeitsroutine

procedure TService.Timer1Timer(Sender: TObject);
var
  Regi: TRegistry;

const
FileName = 'c:\temp\pinglog.txt';

begin
If RegRead=True then
begin

  Regi := TRegistry.Create;
 try
  Regi.RootKey := HKEY_LOCAL_MACHINE;
  if Regi.OpenKey('SOFTWARE\JF\AutoDown', True) then
   begin
    MIP:=regist.ReadString('IP');
    MZeit:=regist.ReadString('Zeit');
   end
  finally
   regist.Free;
 end;



if MIP = 'then
 begin
     MIP := '127.0.0.1';
     MZeit := '30';
 end;

// ReceiveTimeout einstellen
 ICMP_Service.ReceiveTimeout := 1000;
// Zähler für Shutdown auf null setzen;
 MZaehler:=0;
 RegRead:=False;
end;

AssignFile(f,FileName);
if FileExists(FileName) then Append(f)
else Rewrite(f);

// Ping starten

ICMP_Service.Host := MIP;
// Ping senden
ICMP_Service.Ping;

if ICMP_Service.ReplyStatus.FromIpAddress = '0.0.0.0then
  begin
  if MZaehler <= strtoint(MZeit) then
    begin
     MZaehler:=MZaehler+1;
     IF MZaehler < strtoint(MZeit) then
       writeln(f,inttostr(Mzaehler)+' Ping an IP ' +MIP + ' nicht i.o. ' + datetimetostr(now()))
      else
       begin
       writeln(f,'Shutdown wird eingeleitet '+ inttostr(Mzaehler)+' Ping an IP ' +MIP + ' nicht i.o. ' + datetimetostr(now()));
       CloseFile(f);
// ExWindows(EWX_Poweroff); //Herunterfahren und Ausschalten
       end;
      end;
  end
else
  begin
// Zähler für Shutdown auf 0 setzen;
    MZaehler:=0;
    writeln(f,'Ping an IP ' +ICMP_Service.ReplyStatus.FromIpAddress + ' ok.');

  end;

CloseFile(f);
end;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Daten aus der Registry lesen mit TService

  Alt 28. Mär 2007, 10:57
Ich frage mich, ob man in einem Service überhaupt einen Timer benutzen kann, denn an welches Fenster soll er denn seine WM_TIMER Nachricht schicken? Versuch doch mal, nur zum Testen ausserhalb der Timer-Prozedur auf die Registry zu zugreifen und schreib parallel eine Log-Datei, damit du siehst, wo der Service gerade ist.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
fips0705

Registriert seit: 13. Sep 2006
45 Beiträge
 
#3

Re: Daten aus der Registry lesen mit TService

  Alt 28. Mär 2007, 11:04
ja ausserhalb des Timers funktioniert das lesen aus der Registry einwandfrei,
auch so funktioniert es.
Delphi-Quellcode:
if FileExists(FileName) then Append(f)
else Rewrite(f);
writeln(f,'timerstart');
If RegRead=True then
begin
//
  Regi := TRegistry.Create;
  writeln(f,'create');
 try
   writeln(f,'try');
// Regi.RootKey := HKEY_LOCAL_MACHINE;
// if Regi.OpenKey('SOFTWARE\JF\AutoDown', True) then
// begin
// writeln(f,'lese');
// MIP:=regist.ReadString('IP');
// MZeit:=regist.ReadString('Zeit');
// end
  finally
    writeln(f,'finally');
// regist.Free;
 end;
  Mit Zitat antworten Zitat
fips0705

Registriert seit: 13. Sep 2006
45 Beiträge
 
#4

Re: Daten aus der Registry lesen mit TService

  Alt 28. Mär 2007, 11:21
Hallo Luckie,

ich habe hier im Forum gelesen, das man einen Timer im tService benutzen kann, aber nicht muss, aber wo soll ich denn dann aus der Registry lesen?

ich habe den Fehler jetzt so weit eingegenzt, dass ich weiss das es an

Delphi-Quellcode:
    MIP := regist.ReadString('IP');
    MZeit:= regist.ReadString('Zeit');
nur verstehen tue ich das nicht da die Werte ja in der Registry stehen

Gruss Jörg
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Daten aus der Registry lesen mit TService

  Alt 28. Mär 2007, 12:29
Delphi-Quellcode:
var
  Regi: TRegistry;
...
  Regi := TRegistry.Create;
try
  Regi.RootKey := HKEY_LOCAL_MACHINE;
  if Regi.OpenKey('SOFTWARE\JF\AutoDown', True) then
   begin
    MIP:=regist.ReadString('IP');
    MZeit:=regist.ReadString('Zeit');
   end
  finally
   regist.Free;
Du initialisiert "Regi", benutzt später aber "regist".

Gruß Igotcha
  Mit Zitat antworten Zitat
fips0705

Registriert seit: 13. Sep 2006
45 Beiträge
 
#6

Re: Daten aus der Registry lesen mit TService

  Alt 28. Mär 2007, 12:53
Vielen Dank Igotcha,

manchmal sieht man den Wald vor Bäumen nicht.

jetzt funktioniert es auch, warum sollte es auch nicht
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Daten aus der Registry lesen mit TService

  Alt 8. Apr 2007, 23:30
Hallo,

ich habe es mit den o.g. Tips ausprobiert, aber bislang keinen Erfolg gehabt.

Zur Vereinfachung und auch für mein Verständnis habe ich mir jetzt einen Dienst geschrieben, der nur einen Registry-Wert (ist vorhanden) ausliest und in einer Log-Datei das Ergebnis vermerkt und sonst nichts weiter macht. Die einzige Procedure die ich hinzugefügt habe, ist die für das Ereignis OnStart.
Ich habe denselben Code in einer Anwendung gehabt. Dort hat das alles prima geklappt. Nach dem Portieren in den Dienst geht das mit dem Auslesen der Registry nicht mehr.

Delphi-Quellcode:
Procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
Var
   Reg : TRegistry;
   Quelle : String;
   F : Text;
Begin
   Reg:=TRegistry.Create;
   Try
      Reg.RootKey:=HKEY_CURRENT_USER;
      If Reg.OpenKeyReadOnly('Software\Olympus\DSSPlayer2002\Dictation
Module\DownLoad\InstallSetting
') Then
         Quelle:=Reg.ReadString('DictationPath')+'\'
      Else
         Quelle:='Error';
   Finally
      Reg.Free;
   End;
   AssignFile(F,'Test.log');
   {$I-}
   ReWrite(F);
   WriteLn(F,Quelle);
   CloseFile(F);
   {$I+}
End;
Wo liegt mein Fehler? Bin völlig ratlos!
Alex Winzer
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.889 Beiträge
 
Delphi 12 Athens
 
#8

Re: Daten aus der Registry lesen mit TService

  Alt 8. Apr 2007, 23:35
@Schwedenbitter: Ich gehe davon aus, dass Du Deinem Service keinen User zugewiesen hast. Dadurch wird als User System verwendet. Dieser User ist nicht in der Lage, Deinen User-Bereich auszulesen.
Deine Abfrage sollte funktionieren, wenn Du dem Service Deinen Useraccount zuweist.

Gruß

Thomas
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#9

Re: Daten aus der Registry lesen mit TService

  Alt 9. Apr 2007, 03:39
Zitat von onlinekater:
Dieser User ist nicht in der Lage, Deinen User-Bereich auszulesen.
Falsch. Aber er ist in disem Kontext nicht als HKCU verlinkt!

Es ist sogar noch besser. Als Teil der TCB hat man sogar Backup/Restore-Rechte und kann damit Registry-Hives mounten. Damit kann man also die NTUSER.DAT eines beliebigen Benutzers einbinden. Aber gehen wir mal davon aus, daß der Benutzer dessen Registrywerte den Service interessieren im Moment eingeloggt ist und damit sein Profil (NTUSER.DAT) geladen ist. In diesem Fall hole man sich die SID des Benutzers (notfalls auch den vollen Namen) und lese den entsprechenden Wert unter HKEY_USERS aus.

Beispiel. Insofern "Administrator" gerade eingeloggt ist und es sich um das eingebauten Adminkonto handelt, wird der Schlüssel
HKEY_USERS\S-1-5-21-??????????-??????????-??????????-500
das gleiche enthalten wie
HKEY_CURRENT_USER
im Kontext dieses Benutzers. Probiert es einfach aus.

Zitat von Luckie:
Ich frage mich, ob man in einem Service überhaupt einen Timer benutzen kann, denn an welches Fenster soll er denn seine WM_TIMER Nachricht schicken?
Bekanntermaßen kann ein Timer auch eine Callback-Funktion benutzen und damit vollkommen unabhängig von einem Fenster agieren.
Zitat:
[in] Handle to the window to be associated with the timer. This window must be owned by the calling thread. If this parameter is NULL, no window is associated with the timer and the nIDEvent parameter is ignored.
Übrigens gibt es für die Registry genau wie für Verzeichnisse/Dateien Benachrichtigungsfunktionen, womit man sich den Timer spart und es elegant und vor allem zeitgemäß löst. Timer sind nicht gerade ressourcenschonend
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Daten aus der Registry lesen mit TService

  Alt 9. Apr 2007, 09:42
Zitat von Olli:
...
Insofern "Administrator" gerade eingeloggt ist und es sich um das eingebauten Adminkonto handelt, wird der Schlüssel
HKEY_USERS\S-1-5-21-??????????-??????????-??????????-500
das gleiche enthalten wie
HKEY_CURRENT_USER
im Kontext dieses Benutzers. Probiert es einfach aus.
Würde ich gern! Ich habe nur nicht die geringste Ahnung, wie ich das machen soll. Ich weiß noch nicht einmal, wo in der Hilfe ich nachschauen bzw. nach welchen Stichworten ich suchen sollt.

P.S.
Ich verstehe auch nicht ganz, warum ich das mit meiner Anwendung prima auslesen kann. Sofern das SYSTEM quasi als User benutzt wird, wäre doch davon auszugehen, dass dieses ziemlich viel Rechte hat und die Werte deshalb lesen kann ...
Alex Winzer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 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