ADS aus einem Dienst/Service adressieren [erledigt]

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
CRT
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 109
Registriert: Mo, 18. Aug 2008 9:33
Wohnort: Kärnten / Österreich
Kontaktdaten:

ADS aus einem Dienst/Service adressieren [erledigt]

Beitrag von CRT » Di, 29. Okt 2019 18:31

Hallo zusammen,

ein Dienst/service kann per Definition nur lokale Dateien öffnen. Jetzt wollte ich mit dem Dienst per ADS-Client auf, am selben Server liegende, Dateien zugreifen. Dies gelingt nicht :angry3: , obwohl der Connection-String von einem Client aus sehr wohl funktioniert (\\192.168.0.1:6262\C$\Datenordner\). Ohne ADS funktioniert der Dienst. Wie macht ihr das?

lg
CRT
Zuletzt geändert von CRT am Mo, 11. Nov 2019 17:46, insgesamt 3-mal geändert.
Zeit :: Zutritt :: Kasse
www.CRT-software.com

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1500
Registriert: Mi, 28. Jul 2010 17:16

Re: ADS aus einem Dienst/Service adressieren

Beitrag von ramses » Di, 29. Okt 2019 20:17

Den Dienst nicht unter dem lokalen Systemkonto (Vorgabe) ausführen sondern in den Eigenschaften des Dienstes unter Anmelden dem Dienst ein
vorhandenes Benutzerkonto mit den nötigen Zugriffsrechten auf die Daten zuweisen.
Evtl. ist es nötig im Dienst vor dem ADS Zugriff ein Laufwerk auf die Datenfreigabe zu mappen. (Benötige ich immer, weiss nicht ob es ohne läuft)
Verzögerten Start wählen, sonst kann es vorkommen dass beim Start deines Dienstes der ADS noch nicht bereit ist ....
Dieses Vorgehen hat seit Server 2008 bis Server 2019 immer einwandfrei funktioniert.
Valar Morghulis

Gruss Carlo

CRT
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 109
Registriert: Mo, 18. Aug 2008 9:33
Wohnort: Kärnten / Österreich
Kontaktdaten:

Re: ADS aus einem Dienst/Service adressieren

Beitrag von CRT » Mi, 30. Okt 2019 10:05

Danke Carlo. Getestet habe ich ohnehin mit dem Admin-Account, aber auf die Idee zusätzlich zum Connectionstring noch den Pfad :confused2: zu setzen kam ich nicht. Jetzt funktioniert das.

lg - Valar dohaeris :wink:
Zeit :: Zutritt :: Kasse
www.CRT-software.com

CRT
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 109
Registriert: Mo, 18. Aug 2008 9:33
Wohnort: Kärnten / Österreich
Kontaktdaten:

Re: ADS aus einem Dienst/Service adressieren

Beitrag von CRT » Di, 05. Nov 2019 17:19

Zu früh gefreut :( . Der Dienst läuft zwar, aber der Datenzugriff ist nicht möglich. Mit dem Debugger läuft alles wie es soll, ohne Debugger können aber die Tabellen nicht geöffnet werden. Vermutet habe ich Zugriffsrechte, aber der Dienst ist mit dem selben User konfiguriert mit dem auch debuggt wird. Momentan habe ich keine Idee mehr...

Der Connectionstring sieht so aus: "DBE=ADSDBE;SERVER=C:\DATENBANK\"
set path ist auch auf "C:\DATENBANK\" eingestellt.

Hat da wer Erfahrung?
Zeit :: Zutritt :: Kasse
www.CRT-software.com

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1500
Registriert: Mi, 28. Jul 2010 17:16

Re: ADS aus einem Dienst/Service adressieren

Beitrag von ramses » Fr, 08. Nov 2019 6:40

Hallo

das kann so nicht funktionieren. (Als Dienst)

Verwende einen Connect String der sich aus dem Dienst im Netzwerk auch auf eine IP-Adresse auflösen lässt.
Was als Programm läuft muss als Dienst noch lange nicht funktionieren.
Läuft das Programm als Dienst sieht es deine auf dem PC gemappten Laufwerke nicht. Der Dienst hat eine eigene
virtuelle Umgebung.

Es gibt mehrere möglichkeiten zum Connect. Aus meiner Erfahrung ist die Sorgloseste folgende:

1. Im Programm/Dienst zuerst Laufwerk mappen z.b. x: auf 192.168.10.22\daten (daten=sharenamen)
2. Prüfen ist Filezugriff auf x: möglich z.B. ist ein Datenbankfile sichtbar. if file()
3. im Connectionstring SERVER=\\192.168.10.22:6262\daten;ADS_REMOTE_SERVER verwenden
4. Verzichte auf Umgebungsvariablen

So läufts jedenfalls seit vielen Jahren als Programm oder als Dienst immer problemlos.
Valar Morghulis

Gruss Carlo

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7765
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: ADS aus einem Dienst/Service adressieren

Beitrag von Tom » Fr, 08. Nov 2019 9:18

Was Carlo sagt, stimmt (natürlich :wink: ). Ein Dienst hat einen ganz anderen Kontext als ein Programm, das unter Desktopbedingungen läuft. Es gibt grundsätzlich keine Benutzerinteraktion, es gibt keine Mappings, keine Druckertreiber, äußerst eingeschränkten Gerätezugriff. Unsere Web- und Replikationsserver, die als Dienste laufen, befinden sich lokal auf der Maschine, auf der auch die Daten oder der Datenbankserver sind. Bei allem anderen bricht man sich die Finger. Deshalb können die Programme alternativ auch als normale Programme laufen, die sich in der Systray vertecken. Dann geht alles.
Herzlich,
Tom

CRT
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 109
Registriert: Mo, 18. Aug 2008 9:33
Wohnort: Kärnten / Österreich
Kontaktdaten:

Re: ADS aus einem Dienst/Service adressieren

Beitrag von CRT » Fr, 08. Nov 2019 10:39

Hi, den erwähnten Connectionstring erstellt der ADS selbst, wenn kein Connectionstring angegeben wird.
Mit dem mappen bin ich nicht sicher wie du das meinst. Bitte um ein Beispiel.
Alternativ habe ich auch folgenden ConnString getestet: ...SERVER=\\192.168.10.22:6262\C$\Datenbank\

Ich erhalte vom ADS (11.10.0.24) folgende Fehler (ohne ADS läuft der Dienst, User etc muss also OK sein):
1 x 2310 undokumentiert
2 x 8026 error obtaining server drive info...
3 x 7078 cannot authenticate user

Ich verwende Xpp 2.0.875

lg
Zeit :: Zutritt :: Kasse
www.CRT-software.com

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1500
Registriert: Mi, 28. Jul 2010 17:16

Re: ADS aus einem Dienst/Service adressieren

Beitrag von ramses » Fr, 08. Nov 2019 10:57

Ich mach das so:

Als erstes erstelle ich mit mit hilfe der mpr.dll von Windows ein Laufwerkmapping so dass ich z.B. als Laufwerk x: meine Freigabe Mappe und dann mit normalen file Befehlen auch alle Dateien sehe.
Erst dann Connecte ich ADS.
SERVER=\\IP_ADS_SERVER:Port ADS\Sharename (Nur Sharename OHNE Pfade usw.)
Wobei du natürlich zwingend deine eigene IP Adresse des ADS Servers verwenden musst!!! Oder hat dein Server die selbe lokale IP Adresse wie meiner?

Das hat schon unter der 1.90 Version funktioniert.
Valar Morghulis

Gruss Carlo

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1500
Registriert: Mi, 28. Jul 2010 17:16

Re: ADS aus einem Dienst/Service adressieren

Beitrag von ramses » Fr, 08. Nov 2019 11:25

Hat jemand Interesse an xbase++ Sourcecode der Funktion MapDriveLetter() ?
Erstellt direkt Drivemappings aus Xbase Programm mit Windows API Aufrufen der mpr.dll ohne Shellaufrufe.
Valar Morghulis

Gruss Carlo

CRT
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 109
Registriert: Mo, 18. Aug 2008 9:33
Wohnort: Kärnten / Österreich
Kontaktdaten:

Re: ADS aus einem Dienst/Service adressieren

Beitrag von CRT » Fr, 08. Nov 2019 11:35

Ich habe einen share auf den Ordner C:\Datenbank erstellt und als Laufwerk Z: freigegeben
Dann habe ich im Dienst mit set path Z:\ eingestellt und den connect mit ..SERVER=<server_ip>:<ads_port>\datenbank\
Erfolglos, aber erwartet, da ja Dienste mit einem share nicht umgehen können.
Der connect vom client ...SERVER=<server_ip>:<ads_port>\C$\datenbank\ funktioniert tadellos.

Ratlos, glaube alles versucht zu haben. Könnte es etwas mit OEM/ANSI zu tun haben?
Zeit :: Zutritt :: Kasse
www.CRT-software.com

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1500
Registriert: Mi, 28. Jul 2010 17:16

Re: ADS aus einem Dienst/Service adressieren

Beitrag von ramses » Fr, 08. Nov 2019 11:52

Ratlos .... weil du machst es FALSCH!!!!!

Ein Programm das als Dienst startet sieht nur das Windows-Laufwerk C:
Du kannst 10 Laufwerke mappen und 50 Pfade setzten die alle auf dem Desktop sichtbar sind.
Im Dienst ist dies alles NICHT sichtbar! Er läuft in einem separaten Kontext.
Du musst IM Dienst das benötige Laufwerk mappen. Sonst geht es NICHT!!!!
Das siehts du dann umgekehrt auf dem Desktop NICHT.
Und vorallem kannst du im Dienst keine Umgebungsvariablen nutzen wie set path sondern musst mit vollständigem Pfad arbeiten.
z. B: use x:\order\unterorder\datei
oder dirchange() usw. verwenden.
Der Dienst/Kontext muss z.b. durch ein Laufwerkmapping beim Server angemeldet sein sonst ist die Verbinung grundsätzlich gar nicht möglich.
Weil du das im Dienst nicht gemacht hast funktioniert dein Connect als Programm wo du angemeldet bist aber nicht als Dienst wo du nicht angemeldet bist.
Valar Morghulis

Gruss Carlo

CRT
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 109
Registriert: Mo, 18. Aug 2008 9:33
Wohnort: Kärnten / Österreich
Kontaktdaten:

Re: ADS aus einem Dienst/Service adressieren

Beitrag von CRT » Fr, 08. Nov 2019 12:30

Natürlich öffne ich Dateien mitsamt der Pfadangabe. Deshalb funktioniert der Dienst ja auch ohne ADS.
Beim ADS sollte sich der ADS um die Dateien kümmern, funktioniert aber im Echtbetrieb nicht. Starte ich mit dem debugger, funktioniert er ja.
Sicher mache ich etwas falsch, nur was. Ich werde den ADS neu installieren, vielleicht hilft das.

lg
Zeit :: Zutritt :: Kasse
www.CRT-software.com

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1500
Registriert: Mi, 28. Jul 2010 17:16

Re: ADS aus einem Dienst/Service adressieren

Beitrag von ramses » Fr, 08. Nov 2019 13:03

Der ADS würde sich ja um das ganze kümmern.....nur musst du dazu die nötige Vorarbeit leisten.
Neu installieren hilft auch nichts.
Mir fehlen die Worte wie ich es dir sonst noch erklähren soll. Deutsch ist nicht mein Muttersprache.
Du erfüllst einfach die Voraussetzungen die für eine Verbindung nötig sind nicht.

Ich versuche es aber nochmals:

Du musst im Dienst, also aus dem Xbaseprogramm heraus welches du als Dienst ausführen willst ein Netzlaufwerk mappen!!!!
So dass das Programm als Dienst ausgeführt deine Dateien z.B. unter einem GEMAPPTEN Laufwerk z.B. X:\Daten\File sieht.
(Läuft das Programm als Dienst sieht es KEINE Mappings die du auf dem Desktop angelegt hast oder siehst.)
Ohne dieses Mapping kannst du KEINE Verbindung zum ADS Aufbauen!!!!!
Valar Morghulis

Gruss Carlo

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7765
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: ADS aus einem Dienst/Service adressieren

Beitrag von Tom » Fr, 08. Nov 2019 13:15

Was Carlo sagen will: Wenn Dein Programm glaubt, dass die Daten auf Z:\DATEN liegen, dann ist völlig egal, ob das Programm als Dienst mit dem ADS Kontakt aufzunehmen in der Lage ist oder nicht, das Programm sieht "Z:" nicht. Der ADS muss aber den konkreten Pfad von Tabellen genannt bekommen, über SET PATH, SET DEFAULT oder über das Ausführungsverzeichnis der Anwendung. Du machst das in Deiner Software irgendwie irgendwo. Dass Du den ADS jetzt konnektieren kannst, ändert daran nichts. Entweder machst Du, was Carlo vorschlägt, also Du mappst im Dienst - oder Du lässt den Dienst auf der Maschine laufen, auf der die Daten lokal liegen.
Herzlich,
Tom

CRT
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 109
Registriert: Mo, 18. Aug 2008 9:33
Wohnort: Kärnten / Österreich
Kontaktdaten:

Re: ADS aus einem Dienst/Service adressieren

Beitrag von CRT » Mo, 11. Nov 2019 11:59

Danke für eure Mühe ich war wohl nicht präzise genug beim darstellen des Sachverhalts. Also:
- der Dienst läuft lokal auf dem Server, wo sowohl die Daten liegen als auch der ADS installiert ist.
- In der Anwendung setze ich sowohl SET PATH auf den Datenordner C:\DATEN und greife zusätzlich mitsamt dem Pfad auf Dateien zu:
>> nicht USE DATEI sondern USE C:\DATEN\DATEI
- ohne ADSDBE oder mit ADSDBE und mit xppdbg app.exe gestartet tut der Dienst was er soll.
Dabei ist der Connectionstring: "DBE=ADSDBE;SERVER=C:\Program files\CRT software\AZE\"

Starte ich den Dienst aus der Diensteverwaltung, wobei der Dienst-User der Administrator ist, sehe ich im ADS Conf. Utility das eine Connection existiert, es werden jedoch keine Dateien geöffnet (also keine Verarbeitung vond Daten) und der Dienst wartet auf seinen nächsten Einsatz (verifiziert mit einem Text-Logfile). Der ADS Errorlog ist leer.

lg
Zeit :: Zutritt :: Kasse
www.CRT-software.com

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1500
Registriert: Mi, 28. Jul 2010 17:16

Re: ADS aus einem Dienst/Service adressieren

Beitrag von ramses » Mo, 11. Nov 2019 12:11

Hallo CRT

Bitte versuche obige Beiträge nochmals zu lesen.

Damit ADS in einem Dienst benutzt werden kann musst du IM Dienst ein Laufwerksmapping erstellen welches die DLL's des ADS-Clients in eine IP Adresse Auflösen können. Wenn nicht erhältst du die von dir erwahnten Fehlermeldungen die dir eigentlich genau das sagen wollen.

Es ist doch völlig egal was bei dir lokal z.b. im Debugger funktioniert.
Ein Programm als Dienst einzusetzten ist etwas völlig anderes.
Solange du dies nicht verstehst oder verstehen willst kannst du das Problem niemals lösen und auch niemand kann dir dabei helfen denn mehr als die einzig mögliche Lösung des Problems kann man dir nicht beschreiben.
Valar Morghulis

Gruss Carlo

CRT
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 109
Registriert: Mo, 18. Aug 2008 9:33
Wohnort: Kärnten / Österreich
Kontaktdaten:

Re: ADS aus einem Dienst/Service adressieren

Beitrag von CRT » Mo, 11. Nov 2019 17:43

GELÖST
Mir war aufgefallen, das Tabellen in der main() sehr wohl vom ADS geöffnet wurden, später in der ServiceApp-Klasse aber nicht mehr.
Also hatte ich mir den Inhalt des Errorobjektes angesehen und den genCode 92 (aktive Session und default DBE nicht kompatibel) sowie subCode 8062 gesehen. Meine ADS-Session war aber connected() und die Default-DBE war die ADSDBE, also eigentlich OK.

In der Alaska Newsgroup fand ich einen Beitrag welcher den genCode 92 auf ein Thread-Problem zurückführt. Da ich aber im Dienst keinen Thread anstoße, kam mir der Verdacht, dass die ServiceApp-Klasse ev. per se ein Thread ist.
Ich habe daher in der Startprozedur die Session mit oSession:setDefault(.T.) als default gesetzt und siehe da, es läuft.

In der Doku bei DacSession:setDefault() nachgesehen wurde alles klar. Seit Xpp2.0 muss eine Session als default gesetzt werden, das war unter 1.9 nicht so. Das bedeutet, schließt man einen Thread() muss man die aktuelle Session erneut als default definieren.

Na ja, das hat mich jetzt einige Tage Aufwand, einige Anläufe gekostet und an den Nerven meiner hilfsbereiten Kollegen gezerrt.

Danke euch nochmal.
Zeit :: Zutritt :: Kasse
www.CRT-software.com

UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2596
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Kontaktdaten:

Re: ADS aus einem Dienst/Service adressieren [erledigt]

Beitrag von UliTs » Mo, 11. Nov 2019 19:44

Vielen Dank auch für die Info.
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück

Antworten