AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Serverzugriff aus Service

Ein Thema von jjep · begonnen am 1. Okt 2007 · letzter Beitrag vom 2. Okt 2007
Antwort Antwort
Seite 1 von 2  1 2      
jjep

Registriert seit: 19. Jun 2007
Ort: Wettingen CH
78 Beiträge
 
#1

Serverzugriff aus Service

  Alt 1. Okt 2007, 10:59
Hallo zusammen

Ich versuche auf eine dll zuzugreifen, mit dieser kann ich auf Tags(Variablen) zugreifen. Diese Tags liegen auf einem DXS-Server.
Dies funktioniert auch:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
TagsObj := TTags.create(self);
TagsObj.Connect;

Control_0 := TagsObj.DefaultInterface.CreateInteger('Control[0]', 16, 0);
Control_0.Value := 4000;
end;
Jetzt möchte ich aber das ganze als Service laufen lassen...

Delphi-Quellcode:
procedure TService1.ServiceExecute(Sender: TService);
begin
TagsObj := TTags.create(self);
TagsObj.Connect;

Control_0 := TagsObj.DefaultInterface.CreateInteger('Control[0]', 16, 0);
Control_0.Value := 4000;
end;
Hier kommt aber immer das Problem:
Kurz nach dem Start des Service wird die Fehlermeldung:
Zitat:
Dienst "Service1" wurde auf "Lokaler Computer" gestartet und dann angehalten. Einige Dienste werden automaitsch angehalten, wenn sie sich im Leerlauf befindet, wie z.B. Leistungsprotokoll- und Alarmdienste.
anzeigt.
Aus dieser wird ich aber nicht wirklich Schlau, denn diese zeigt es mir bei allen möglichen Fehlern in einem Service an.

Da der Code schlussendlich gleich ist, kann es nur daran liegen, dass ich beim Befehl:
 TagsObj := TTags.create(self); liegt. Denn hier ist der unterschied das ich beim Service den Service als self weitergebe und bei der Formanwendung die Form.

Weiss jemand was ich dann beim Service anders mitgeben soll antstatt "self"? Oder ist es ein ganz anderes Problem?
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#2

Re: Serverzugriff aus Service

  Alt 1. Okt 2007, 12:08
Zitat von jjep:
Hallo zusammen

...
Weiss jemand was ich dann beim Service anders mitgeben soll antstatt "self"? Oder ist es ein ganz anderes Problem?
Hallo,

der Service ist kein Formular, also bei self in jedem Fall falsch. Falls Create den Parameter als Parent braucht (kann man aus den Schnipseln nicht entnehmen), wirst du wohl oder übel alles so umschreiben müssen, dass keine VCL-Teile mehr gebraucht werden.

Ausserdem hat der Service natürlich nicht den Account des Users, weil da gar kein User ist - der Service kann also u.U. nicht auf Daten auf dem Server zugreifen. Dazu muss man ihm erst die Rechte geben.

Gruss Reinhard
  Mit Zitat antworten Zitat
jjep

Registriert seit: 19. Jun 2007
Ort: Wettingen CH
78 Beiträge
 
#3

Re: Serverzugriff aus Service

  Alt 1. Okt 2007, 12:34
Tönt einleuchtend, aber wie kann ich einem Service das Recht geben auf den Server zuzugreifen?
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#4

Re: Serverzugriff aus Service

  Alt 1. Okt 2007, 17:12
Zitat von jjep:
Tönt einleuchtend, aber wie kann ich einem Service das Recht geben auf den Server zuzugreifen?
Hallo,

ohne weiteres läuft der Service unter dem Systemaccount, d.h. er darf viel auf dem eigenen Rechner und praktisch nichts im Netz. Das ist sozusagen der Standardfehler aller Serviceentwickler-Anfänger. Man kann aber den Service unter einem anderen Account starten, der die nötigen Rechte hat. Das entspricht "Ausführen als".

Viele Entwickler legen der Übersichtlichkeit halber gleich einen speziellen Benutzeraccount für den Service an, der dann z.B. für einen Faxserver auch einen passenden Namen haben sollte, dann sieht das jeder Admin gleich.

Gruss Reinhard
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Serverzugriff aus Service

  Alt 1. Okt 2007, 19:22
Moin Reinhard,

Zitat von Reinhard Kern:
Viele Entwickler legen der Übersichtlichkeit halber gleich einen speziellen Benutzeraccount für den Service an, der dann z.B. für einen Faxserver auch einen passenden Namen haben sollte, dann sieht das jeder Admin gleich.
Ich würde mal sagen, der Entwickler lässt den Account von der Administration anlegen, und klärt vorab ab, wozu der dienen soll, damit gemeinsam entschieden werden kann, welche Rechte benötigt werden.
Unter Umständen kann das dann auch zu Programmänderungen führen, falls man Zugriffe benutzt hat, die für die eigentliche Funktionalität nicht notwendig wären (z.B. irgendetwas mit Schreib-/Lesezugriff öffnen, wo lesen genügt).
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
jjep

Registriert seit: 19. Jun 2007
Ort: Wettingen CH
78 Beiträge
 
#6

Re: Serverzugriff aus Service

  Alt 2. Okt 2007, 08:09
Ich führe den Service jetzt mit meinem Benutzerkonto aus. Hier bringt der Service zwar keine Fehlermeldung, jedoch macht er auch gar nichts. Er bringt nicht einmal die eingebaute Messagebox, obwohl "Interaktive" auf true ist.

Delphi-Quellcode:
procedure TService1.ServiceExecute(Sender: TService);
begin
ShowMessage('test'); //Diese MessageBox wird gar nicht angezeigt

TagsObj := TTags.create(self);
TagsObj.Connect;

Control_0 := TagsObj.DefaultInterface.CreateInteger('Control[0]', 16, 0);
Control_0.Value := 4000;
end;
Stimmt das eigenlich, dass man während des ausführen des Services sich nur im Execute teil befindet? Und somit eigenlich nur Sequenziel programmieren kann?
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Serverzugriff aus Service

  Alt 2. Okt 2007, 11:00
Zitat von jjep:
Ich führe den Service jetzt mit meinem Benutzerkonto aus. Hier bringt der Service zwar keine Fehlermeldung, jedoch macht er auch gar nichts. Er bringt nicht einmal die eingebaute Messagebox, obwohl "Interaktive" auf true ist.
Ist das Betriebssystem Vista?

Wenn ja, ist es nicht möglich direkt aus dem Service heraus eine UI-Element aufzurufen.
In diesem Fall muss man einen Umweg über ein weiteres Programm gehen, daß von dem Service aufgerufen wird und welches dann das UI-Element aufruft.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
jjep

Registriert seit: 19. Jun 2007
Ort: Wettingen CH
78 Beiträge
 
#8

Re: Serverzugriff aus Service

  Alt 2. Okt 2007, 11:06
Zitat:
Ist das Betriebssystem Vista?
Nein Windows XP.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#9

Re: Serverzugriff aus Service

  Alt 2. Okt 2007, 11:14
Die Meldung, dass der Dienst angehalten wurde kommt daher, dass deine Execute Methode ja sofort wieder beendet wird. Die Methode ist genau dieselbe, wie eine Threadmethode. Der Thread wird zerstört sobald die End; Zeile abgearbeitet wurde.

Man kann eine Nachrichtenbox ausgeben lassen, indem man MessageBox der WinAPI verwendet und MB_SERVICENOTIFICATION verwendet. Oder man macht es eben über ein extra Programm. Jedoch ist ab XP und Win2003 das Problem, welcher Benutzer die Nachricht sehen soll. Schließlich können mehrere Benutzer gleichzeitig eingeloggt sein, siehe Terminal Services.

Wenn du deinen Dienst unter einem normalen Benutzer laufen lässt, dann ist das ok, sofern der Benutzer kein Administrator ist. Das verhindert, dass Fehler in deinem Programm, es anderen Benutzern ermöglicht Dinge zu machen, die sie eigentlich nicht dürften.
Du solltest daher die Ausführung unter dem Dienst Konto verweigern (GetUserName = 'SYSTEM').
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
jjep

Registriert seit: 19. Jun 2007
Ort: Wettingen CH
78 Beiträge
 
#10

Re: Serverzugriff aus Service

  Alt 2. Okt 2007, 11:33
Zitat:
Die Meldung, dass der Dienst angehalten wurde kommt daher, dass deine Execute Methode ja sofort wieder beendet wird. Die Methode ist genau dieselbe, wie eine Threadmethode. Der Thread wird zerstört sobald die End; Zeile abgearbeitet wurde.
Dies ist komisch, denn mein Service bleibt unter den Prozessen im TaskManager.

Zitat:
Man kann eine Nachrichtenbox ausgeben lassen, indem man MessageBox der WinAPI verwendet und MB_SERVICENOTIFICATION verwendet.
Das mit der MessageBox ist mir nicht wichtig, bzw. habe ich jetzt nur gebrauch um den Service zu testen ob überhaupt etwas läuft.

Zitat:
Du solltest daher die Ausführung unter dem Dienst Konto verweigern (GetUserName = 'SYSTEM').
Also sollte ich es als Lokalen Dienst laufen lassen?
Den letzten Absatz habe ich nicht ganz verstanden.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:59 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