![]() |
Datenbank: Access • Version: 97 • Zugriff über: ADO-Komponenten
Datenbankzugriff mit Dienst übers Netzwerk funtioniert nicht
Hallo Leute,
ich bin echt am verzweifeln. Seit Tagen habe ich folgendes Problem: Ich habe einen Server S auf dem ein von mir geschriebener Dienst läuft. Dieser Dienst soll mit ADO-Komponenten auf eine Access Datenbank auf einem Rechner A zugreifen. Der Dienst meldet sich an dem Server unter dem Benutzernamen paz an. Der Benutzername unter dem der Rechner A läuft lautet KR. Die Access-Datenbank ist nicht von mir. Ich kann sie auch nicht anpassen. Der Datenbank-User heißt admin. Ein Passwort ist nicht vergeben. Der Verbindungsaufbau läuft folgendermaßen:
Delphi-Quellcode:
Der Verbindungsaufbau scheitert. Ich erhalte folgende Fehlermeldung:
ADOConnection.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;User=admin;DataSource=\\IP_Rechner_A\mdhprogs\KR_HOST.mdb;Mode=Share Deny None;Persist Security Info=False;';
ADOConnection.LoginPromt:=false; ADOConnection.Connected:=true; Das Microsoft Jet-Datenbankmodul kann die Datei '\\IP_Rechner_A\mdhprogs\KR_HOST.mdb' nicht öffnen. Sie ist bereits von einem anderen Benutzer exclusiv geöffnet, oder Sie benötigen eine Berechtigung, um die Daten lesen zu können. Prinzipiell sollte es jedoch funktionieren. Ich habe den Datenbankzugriff so bereits in einem normalen Programm (kein Dienst) realisiert und er hat super funktioniert. Weiterhin läuft der Datenbankzugriff, wenn ich den Dienst beim Server unter dem User Administrator anmelde. Hat jemand von euch eine Ahnung wie ich mein Problem lösen kann? |
Re: Datenbankzugriff mit Dienst übers Netzwerk funtioniert n
Hallo,
Dienste laufen normalerweise unter einem entsprechenden Konto, dass nicht über alle möglichen Rechte verfügt. Um auf Resourcen im Netz zugreifen zu können, solltest Du den Dienst unter einem Konto laufen lassen, dass auf die benötigten Resourcen Zugriff hat. Alternativ könntest Du dem Dienstekonto die entsprechenden Rechte einräumen. Hier musst Du für Dich entscheiden, welcher Weg der sicherste und am einfachsten zu handhabende Weg ist. Bei Deiner Konstellation solltest Du darauf achten, dass auf Laufwerksebene bereits ein Zugriff für den Dienst möglich ist, eventuell könntest Du mit dem Dienst eine eigene Laufwerksverbindung mit Net Use herstellen. Wie das mit Delphimitteln geht, solltest Du hier im Forum finden. |
Re: Datenbankzugriff mit Dienst übers Netzwerk funtioniert n
Hallo nahpets,
der Benutzer paz ist auch Administrator an meinem Server. Damit sollte mein Dienst also alle notwendigen Rechte haben. Ich kann auch mit dem Nutzer paz auf das Verzeichnis zugreifen in dem die Access-DB liegt. Meinst du wirklich, dass das an dem UNC-Pfad liegt? Unter der gleichen Konstellation nur eben mit dem Administrator-Konto funktioniert der Zugriff ja auch. Ich habe aber auch schon überlegt ein Netzlaufwerk zu verbinden, so weit ich mich schlau gemacht habe, funktioniert das aber erst nach einer Benutzeranmeldung. Ich möchte zukünftig aber, dass der Dienst funktioniert auch ohne das sich jemand an meinem Server anmeldet. Das ist eine echt verzwickte Sache. |
Re: Datenbankzugriff mit Dienst übers Netzwerk funtioniert n
Hey Leute,
hab gerade in meinen Dienst eine Abfrage auf FileExists eingebaut, die prüft, ob mein Dienst die \\IP_Rechner_A\mdhprogs\KR_HOST.mdb überhaupt sieht. Und ich bin ja aus allen Wolken gefallen. Obwohl sowohl Administrator als auch paz beide in der Administratorengruppe sind, sieht der Dienst die Datei nur, wenn er unter dem Administratorenkonto läuft. Scheinbar haben meine beiden Nutzer also trotz allem unterschiedliche Rechte. Weiß jemand von euch, welches Recht meinem paz fehlt und wie ihm dieses Recht geben kann? |
Re: Datenbankzugriff mit Dienst übers Netzwerk funtioniert n
Hallo Leute,
neue Woche neues Glück. Hat jemand eine Idee wie ich mein Problem lösen kann? |
Re: Datenbankzugriff mit Dienst übers Netzwerk funtioniert n
Hi,
versuche mal dies: Im Explorer Datenbankeigenschaften->Sicherheit->Hinzufügen Domänencomputer/Netzwerkdienst, Rechte auf Ändern. Auf dem Server S, den Dienst als Lokaler Dienst/Netzwerkdienst laufen lassen. Den Benutzernamen usw. kannst du dann weglassen. Was nun besser geht Domänencomputer oder Netzwerkdienst musst du sehen, da ich es im Moment nicht prüfen kann. Sollte aber klappen. Viele Grüße |
Re: Datenbankzugriff mit Dienst übers Netzwerk funtioniert n
Hallo Alter Mann!
Wie meinst du das? Zitat:
|
Re: Datenbankzugriff mit Dienst übers Netzwerk funtioniert n
Hallo,
habe bei einem Dienst mal eine Lösung der folgenden Art eingebaut:
Delphi-Quellcode:
Der Aufruf im Dienst kann dann in der folgenden Form erfolgen:
function NetzlaufwerkVerbinden(Laufwerk: string;
Pfad: string; Username: string; Password: string; RestoreAtLogon: Boolean) : DWORD; var NetResource: TNetResource; dwFlags: DWORD; begin with NetResource do begin dwType := RESOURCETYPE_DISK; lpLocalName := PChar(Laufwerk); lpRemoteName := PChar(Pfad); lpProvider := nil; end; if (RestoreAtLogon) then dwFlags := CONNECT_UPDATE_PROFILE else dwFlags := 0; Result := WNetAddConnection2(NetResource, PChar(Password), PChar(Username), dwFlags); end; function NetzlaufwerkTrennen(Laufwerk : String) : DWord; begin Result := WNetCancelConnection(PChar(Laufwerk),true); end;
Delphi-Quellcode:
Hierbei wird davon ausgegangen, dass der Laufwerksbuchstabe B: frei ist und uneingeschränkt für eigene Zwecke genutzt werden kann.
Var
ini : TIniFile; sFreigabe : String; sUsername : String; sPassword : String; bNetUse : Boolean; begin ini := TIniFile.Create(ChangeFileExt(ParamStr(0),'.ini')); sFreigabe := ini.ReadString('Netzverbindung','Freigabe',''); sUsername := ini.ReadString('Netzverbindung','Username',''); sPassword := ini.ReadString('Netzverbindung','Password',''); // Prüfen, ob die gewünschte Laufwerksverbindung schon existiert. bNetUse := FileExists('b:\nul'); if Not bNetUse then begin // Wenn nein bNetUse := NetzlaufwerkVerbinden('b:',sFreigabe,sUsername,sPassword,false) = 0; Case bNetUse of true : Logger.Log('Laufwerksverbindung konnte erstellt werden.'); else Logger.Log('Es konnte keine Laufwerksverbindung nach ' + sFreigabe + ' erstellt werden.'); End; end else begin Logger.Log('Es wird die bereits existierende Laufwerksverbindung zu Laufwerk b: genutzt.'); end; if bNetUse then begin // Das, was Dein Programm machen soll ... Bei dieser Methode muss der Benutzer, unter dessen Anmeldung der Dienst läuft, keine Rechte im Netz haben. Die für die Laufwerksverbindung erforderlichen Benutzerinformationen werden einer INI-Datei entnommen. Das Verzeichnis mit der Accessdatenbank muss über eine Freigabe verfügen, z. B.: "\\Datenbankrechner\Accessverzeichnis" und es muss einen Benutzer mit für die Arbeit ausreichenden Rechte geben. Freigabe, Benutzer und Passwort sind in der INI-Datei zu hinterlegen. |
Re: Datenbankzugriff mit Dienst übers Netzwerk funtioniert n
Hi
Zitat:
|
Re: Datenbankzugriff mit Dienst übers Netzwerk funtioniert n
So Leute,
ich hatte jetzt endlich Zeit mich wieder mit dem Problem zu beschäftigen. Ich habe davon abgesehen, meinen Quellcode zu ändern und stattdessen, den Nutzer paz auch auf dem Rechner A eingerichtet. Nun kann ich meinen Dienst auf dem Server unter diesem Benutzernamen starten und es funktioniert. Vielen Dank für eure Hilfe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 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-2025 by Thomas Breitkreuz