Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Serverzugriff aus Service (https://www.delphipraxis.net/100598-serverzugriff-aus-service.html)

jjep 1. Okt 2007 10:59


Serverzugriff aus Service
 
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:
Delphi-Quellcode:
 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?

Reinhard Kern 1. Okt 2007 12:08

Re: Serverzugriff aus Service
 
Zitat:

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

jjep 1. Okt 2007 12:34

Re: Serverzugriff aus Service
 
Tönt einleuchtend, aber wie kann ich einem Service das Recht geben auf den Server zuzugreifen?

Reinhard Kern 1. Okt 2007 17:12

Re: Serverzugriff aus Service
 
Zitat:

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

Christian Seehase 1. Okt 2007 19:22

Re: Serverzugriff aus Service
 
Moin Reinhard,

Zitat:

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).

jjep 2. Okt 2007 08:09

Re: Serverzugriff aus Service
 
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?

Tyrael Y. 2. Okt 2007 11:00

Re: Serverzugriff aus Service
 
Zitat:

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.

jjep 2. Okt 2007 11:06

Re: Serverzugriff aus Service
 
Zitat:

Ist das Betriebssystem Vista?
Nein Windows XP.

Dezipaitor 2. Okt 2007 11:14

Re: Serverzugriff aus Service
 
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').

jjep 2. Okt 2007 11:33

Re: Serverzugriff aus Service
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr.
Seite 1 von 2  1 2      

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