Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird über NTService (Dienst) zugreifen funkt nicht (https://www.delphipraxis.net/177417-firebird-ueber-ntservice-dienst-zugreifen-funkt-nicht.html)

Kostas 5. Nov 2013 17:04

Datenbank: Firebird • Version: 1.5 • Zugriff über: IBO

Firebird über NTService (Dienst) zugreifen funkt nicht
 
Hallo Zusammen,

ich hab eine Windows Forms Anwendung geschrieben die über IBO auf eine entfernte Firebird Datenbank zugreift.
Alles funktioniert einwandfrei. Nun erzeuge ich ein parallel Projekt mit exakt der gleichen Funktionalität jedoch
als Dienst. Beim versuch die TIB_Connection zu öffnen bekomme ich eine Fehlermeldung:
"Zugriffsverletzung bei Adresse 10013621 in Modul 'fbclient.dll'. Schreiben von Adresse 00000054" ich habe auch die richtige fbclient.dll in das Programmverzeichnis kopiert, doch ohne Erfolg.
Ist da etwas spezielles zu tun wenn es sich um ein Service handelt? Alles andere funktioniert einwandfrei.

Kann es sein dass ein Dienst nicht auf eine Firebird Installation auf einem anderen Rechner zugreifen kann?

Gruß Kostas

Union 5. Nov 2013 17:08

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Du musst dem Konto unter dem der Dienst läuft Netzwerkzugriff einräumen oder den dafür definierten Benutzer NT AUTHORITY\NetworkService verwenden.

Kostas 5. Nov 2013 17:18

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Hallo Union,

danke für die Blitz Antwort.
Ich starte den Dienst über mein eingelogten user (Admin Rechte)
Was genau müsste ich bitte machen? Etwa dem Dienst unter Anmeldung die Gruppe "NETZWERKDIENST"
zuordnen? das habe ich soeben versucht. Der Dienst int nun angemeldet als Netzwerkdienst, funktioniert jedoch
auch nicht. Die gleiche Fehlermeldung.

Gruß Kostas

Union 5. Nov 2013 17:23

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Funktioniert es denn mit dem Service als Standalone exe? Kannst Du auf den Rechner und die DB auf anderem Wege zugreifen?

Kostas 5. Nov 2013 17:35

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Ich habe die Applikation zuerst als normale Windows VCL-Anwendung erstellt, wobei das main Form leer ist.
Alle Elemente befinden sich auf ein Datamodul. Die Anwendung funktioniert einwandfrei.
Danach habe ich ein parallel Projekt angelegt und alles aus dem Datamodul in ein NTServiceModul gepackt.
Ich verwende übrigens die Komponenten SvCom( bin noch im Test damit) für die Umsetzung als Dienst.
Mir ist nicht bekannt ob es möglich ist den Dienst als normale Anwendung zu starten.
Jetzt wird es vermutlich schwierig oder?

Gruß Kostas

Union 5. Nov 2013 17:57

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Du kannst das in der dpr programmieren:
Delphi-Quellcode:
begin
  if ParamStr(1) = '/EXE' then
  begin
    // Das musst Du hinzufügen mit einem entsprechenden Formular aus dem Du die Aktionen aufrufst wie im Service (normalerweise in ServiceExecute. Am besten ServiceExecute besteht nur aus einer Zeile...)
    Forms.Application.Initialize;
    Forms.Application.CreateForm(TfrmDeinFormular, frmDeinFormular);
    Forms.Application.Run;
  end
  else
  begin
    // Das hier ist der automatisch erzeugte Block einer Dienstanwendung
    SvcMgr.Application.Initialize;
    SvcMgr.Application.CreateForm(TSrvDeinService, SrvDeinService);
    SvcMgr.Application.Run;
  end;
end.

Kostas 5. Nov 2013 18:04

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
ah, jetzt verstehe ich das. Die SvCom Komponenten haben das per Default drin.
Ich werde das mal gleich morgen ausprobieren. Ich habe jetzt leider noch einen Termin.
Herzlichen Dank und ich melde mich morgen damit.

Dir noch eine schöne Zeit.

Union 5. Nov 2013 18:10

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Ja, dann musst Du das entsprechend austauschen:
Delphi-Quellcode:
begin
  if SvComfindCommand('EXE') then
  begin
    Forms.Application.Initialize;
    Forms.Application.CreateForm(TfrmDeinFormular, frmDeinFormular);
    Forms.Application.Run;
  end
  else
  begin
    SvCom_NTService.Application.Initialize;
    SvCom_NTService.Application.CreateForm(TSrvDeinService, SrvDeinService);
    SvCom_NTService.Application.Run;
  end;
end.

tsteinmaurer 5. Nov 2013 18:22

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Kostas,

zusätzlich zu den Delphi-Empfehlungen ist es auch ratsam einen TCP/IP Connect-String zur Firebird Datenbank in einer Service Anwendung zu verwenden.

Kostas 5. Nov 2013 23:36

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Hallo Zusammen,
hallo Thomas, schon lange nicht mehr voneinander gehört. Ich hoffe es geht dir soweit gut.

Ich habe den Dienst nun als Standalone Exe laufen lassen und es funkt alles einwandfrei.
Auch ein Neustart hat nicht gebraucht. Den User "NT AUTHORITY" habe ich auf mein Win7 Ultimate 64Bit
nicht. Dafür konnte ich jedoch den Dienst-Anmeldung-DiesesKonto= "NETZWERKDIENST" mit dem Admin Passwort angeben.

Für IBO habe ich der TIB_Connection wie immer:
cn1.Server := Computername/3050
cn1.Protocol := 'cpTCP_IP'
cn1.Path := 'F:\Real path zur Datenbank\Datenbank.FDB'

Damit funktioniert der Dienst als Standalone Exe einwandfrei.
Nur der Dienst macht Zicken mit der Fehlermeldung Zugriffsverletzung bei Adresse 10013621 in Modul 'fbclient.dll'. Schreiben von Adresse 00000054

Wie gesagt, die richtige fbclient.dll habe ich auch im Exe Verzeichnis kopiert.

Übrigens, die Entwicklungsmaschine ist vistualisiert mit VMWare Workstation 9.0.2
Delphi XE2 und der Dienst laufen auf der vistualisierten Maschine Win7 Ultimate 64Bit.
Firebird läuft nur auf der Host-Maschine in zwei Instanzen FB1.5 Port 3050 und FB2.5 Port 3025.
Das LW F: ist eine Netzlaufwerk auf der Host-Maschine, ebenfalls Win7 Ultimate 64Bit.
LW F: ist auch freigegeben für "Jeder" und zusätzlich jetzt auch für "NETZWERKDIENST".
Hat leider auch nicht funktioniert.

Hat jemand noch eine Idee?

Union 6. Nov 2013 07:30

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Das ist ja kein TCP Connectstring. Woher soll denn der Dienst bitte das Laufwerk F: kennen? also entweder <Server>:<lokaler Serverpfad> oder <Ip-Adresse>:<lokaler Serverpfad>

mjustin 6. Nov 2013 08:41

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Zitat:

Zitat von Union (Beitrag 1234641)
Das ist ja kein TCP Connectstring. Woher soll denn der Dienst bitte das Laufwerk F: kennen? also entweder <Server>:<lokaler Serverpfad> oder <Ip-Adresse>:<lokaler Serverpfad>

IBObjects "baut" sich den Connectstring aus den Angaben cn1.Server und cn1.Path.

mjustin 6. Nov 2013 08:45

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Zitat:

Zitat von Kostas (Beitrag 1234635)
Das LW F: ist eine Netzlaufwerk auf der Host-Maschine, ebenfalls Win7 Ultimate 64Bit.
LW F: ist auch freigegeben für "Jeder" und zusätzlich jetzt auch für "NETZWERKDIENST".

Die Firebird Datenbankdatei muss nicht auf einem Netzlaufwerk liegen, um über TCP erreichbar zu sein! Ich würde eher stark davon abraten.

Sie sollte nur lokal erreichbar sein, und auch nicht in einem freigegebenen Ordner liegen.

mkinzler 6. Nov 2013 09:08

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Der Pfad muss aus Sicht des Servers aufgebaut sein. Eine direkter Zugriff auf die Datenbankdatei vom Client aus ist aus Sicherheitsgründen zu unterbinden.

ThomasBab 6. Nov 2013 09:19

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Hallo!

Ich habe mir (aus leidvoller Erfahrung) angewöhnt, grundsätzlich über einen Alias auf die Datenbank zuzugreifen.

Außerdem sollte man bedenken, dass ein Dienst keine Freigaben und auch keine Laufwerksbuchstaben kennt (imho)

Kostas 6. Nov 2013 09:39

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Hallo Zusammen,

Dankeschön für die zahlreihe Antworten.
Ich bin es von IBO gewohnt dass er selbstständig den Path in TCP Konvention anpasst wenn ein Server und das Protokoll 'cpTCP_IP' angegeben ist. Anscheinend ist es bei einem Dienst anders. Wenn der "Dienst" als Standalone Exe läuft, wird der Path angepasst und alles läuft einwandfrei. Jetzt funktioniert auch der Dienst nachdem ich den
Path angepasst habe in TCP Konvention, auch über das das Netzwerk einwandfrei. Ich habe die Konstellation nur während der Entwicklungsphase. Der Dienst wird dann schon auf dem Produktiv-Server laufen auf dem FB und die DB installiert sind.

Herzlichen Dank an alle und einen schönen Tag.

Kostas 6. Nov 2013 13:32

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Sorry dass ich nochmals zurückkomme, ich habe mich vorher geirrt und war zur voreilig mit der Meldung jetzt geht’s. Ich habe nur schnell auf die lange Fehlerzeile im Log geschaut. Weil sie nicht mehr da war, war ich der Meinung jetzt geht’s. Aber das war nur eine andere kürzere Fehlermeldung
„Verbindungspfad nicht gültig“ Kurzum, es funktioniert die Verbindung zur FB-Datenbank über den Dienst nicht. Ich übergebe nur noch TIB_Connection1.database := notebook/3050:F:\TC_Projekte\CSV2\Server\Datenbank.FDB
Den Dienst habe ich auf der physikalischen Maschine installiert. Der Name meiner Maschine ist notebook, FB1.5 hört auf den Port 3050, der angegebene Pfad ist wirklich vorhanden auf der Partition F: und ist kein Netzlaufwerk.
Egal was ich versuche, ich bekomme Zugriffsverletzung bei Adresse 10013621 in Modul 'fbclient.dll'. Schreiben von Adresse 00000054. Starte ich den "Dienst" als Standalone Exe funktioniert die Verbindung einwandfrei.

Sorry nohmals für die Irreführung.
Gruß Kostas

mkinzler 7. Nov 2013 07:39

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Die Datei liegt aber immer noch auf einem gemappten Laufwerk. Da der Dienst inen einem anderen Benutzerkontext läuft, kennt dieser dieses Laufwerk nicht!

Kostas 7. Nov 2013 08:49

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Hallo Markus,

Das LW F: ist eine Partition auf der Lokalen Festplatte vom NOTEBOOK. Firebird ist ebenfalls auf NOTEBOOK installiert zufällig auch auf der Partition F:. Der Dienst wurde auf NOTEBOOK installiert und gestartet.
Ich habe es mit Server=localhost/3050 und mit NOTEBOOK/3050 ausprobiert. Die Eigenschaft Database habe ich auch
direkt zugewiesen mit notebook/3050:F:\TC_Projekte\CSV2\Server\Datenbank.FDB und auch
localhost/3050:F:\TC_Projekte\CSV2\Server\Datenbank.FDB. Ich habe auch den Dienst von FB2.5 (Port 3025) gestoppt.
Es bringt alles nichts.

Grundsätzlich würde mich interessieren ob jemand aus dem Forum über einen Dienst auf eine Firebird 1.5 Dialekt 1
Datenbank zugegriffen hat. Die gleiche Anwendung mit den gleichen Einstellungen über notebook/3050:F:\TC_Projekte\CSV2\Server\Datenbank.FDB als Standalone Exe funktioniert einwandfrei.

Gruß Kostas

Furtbichler 7. Nov 2013 08:50

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Ist die Port-Angabe so richtig ('laptop/3050')?
Sollte es nicht 'laptop:3050' heißen?

Kostas 7. Nov 2013 11:40

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

ich habe mit Bordmitteln von Delphi XE2 eine Testanwendung erzeugt die nur die Verbindung zur Datenbank über
IBO 5.2.0.6 öffnet und wieder schießt. Der Dienst wird danach gleich beendet.

Der Dienst wird auf der physikalischen Maschine installiert auf den lokal auf Firebird und die Dantebank installiert
ist. Dennoch bekomme ich die Fehlermeldung
"Zugriffsverletzung bei Adresse 100229DB in Modul 'fbclient.dll'. Schreiben von Adresse 00000054"

Kann mir bitte jemand sagen was ich da falsch mache.
Dankeschön
Kostas

Union 7. Nov 2013 12:04

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Dein Parameterstring scheint falsch zu sein.
Code:
SERVER=notebook/3050
Wird wohl nicht gehen. Evtl. so:
Code:
SERVER=notebook
PORT=3050

Kostas 7. Nov 2013 12:21

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
bei den IBO-Komponenten, zumindest bei meiner Version, gibt es keine Eigenschaft "Port"
Den Port kann ich auch komplett weglassen da die Defaulinstanz von Firebird eh auf 3050 hört.
Ich habe alle Varianten bereits ausprobiert. Es scheint nicht am Connectionstring zu liegen.

Irgend eine Kleinigkeit übersehe ich permanent und komme einfach nicht drauf.
Das ist mein erster Versuch auf eine Firebird 1.5 Datenbank über einen Dienst zuzugreifen.
Deshalb weis ich überhaupt nicht ob das generell geht.

Gruß Kostas

dataspider 7. Nov 2013 12:55

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Hi,

Port gibt es bei IBO nicht. Angabe Server ist so korrekt.
Ich würde dennoch versuchen, notebook durch die IP-Adresse zu ersetzen.

Dann würde ich noch sichergehen, dass die richtige fbclient.dll verwendet wird.

Bei neueren Versionen mit der Fuktion IB_GetClientLibNameFunc:

In die DPR
IB_Session (vor allen nicht zu Delphi gehörigen Units) unter uses und dann:

Delphi-Quellcode:
...
  function GetFBClientLibName: string;
  begin
    Result := ExtractFilePath(Application.ExeName) + 'fbclient.dll';
  end;

begin
  IB_GetClientLibNameFunc := GetFBClientLibName;
  if not Application.DelayInitialize or Application.Installing then
    Application.Initialize;
  Application.CreateForm(TService1, Service1);
  Application.Run;
end.
Frank

[EDIT]
Bei den Samples ist bei IBO eine NTServiceApp dabei.
Da wird das Service App Framework (IBS_BASE) verwendet.
Hab das nie gebraucht, aber vielleicht findest du ja dort einen Ansatz.^

Möglicherweise musst du auch den Dienst so konfigurieren, dass Datenaustausch mit Desktop aktiv ist.

[/EDIT]

Kostas 8. Nov 2013 00:04

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Hallo Frank,

ich habe soeben das Testprojekt umgestellt auf das IBS_Base Framework indem ich einen neuen TService abgeleitet habe von
IBS_Base. Es hat sofort funktioniert. Es funktioniert auch wenn der Service auf der VMWare virtuellen Enwicklungsmaschine Win7 Ultimate 64Bit installiert ist auf dem kein Firebird installiert ist, und der Zugriff
über das Netzwerk auf die Host Maschine (Laptop) auf dem Firebird und die Datenbank sich befinden.

Du schreibst, du hast dieses Framework nie gebraucht. Wenn ich dich richtig verstehe, hast du bereits ein Dienst
geschrieben welcher auf einer Firebirddatenbank zugreifen kann mit den Delphi Bordmitteln ohne das IBS_Base Framework zu nutzen. Ist das so?

Ich frage deshalb weil ich eigentlich die Komponente SvCom für Dienste nutzen möchte. SvCom hat für TService
ebenfalls eine eigene Abhandlung. Ich müsste also versuchen beide TService Abhandlungen zusammen zu setzen.

Das wird nicht so einfach sein schätze ich. Aber wenn du es geschafft hast, würde es ja bedeuten dass es grundsätzlich geht.

Gruß Kostas

Kostas 8. Nov 2013 17:44

AW: Firebird über NTService (Dienst) zugreifen funkt nicht
 
Hallo zusammen,

jetzt funktionierts nachdem ich den entscheidenden Hinweis über YahooGroups zufällig gelesen habe.
Es muss NUR eine TIB_Session Komponente auf die TService Form und alles ist gut. Die Komponente TIB_Connection
hat ja eine integrierte TIB_Session das ist die Default session. Für Dienste darf die nicht verwendet werden.
Also die TIB_Connection mit der TIB_Session verheiraten und schon funkts.

Ist doch wie Weihnachten.


Gruß Kostas


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 Uhr.

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 by Thomas Breitkreuz