ich möchte einem User mit Leserechten auf meiner DB kurzzeitig Schreibrechte
zuweisen und sie anschliessend wieder entziehen. Leider funktioniert meine
Lösung nicht. Es wäre schön, wenn mir jemand helfen könnte.
Die DB liegt im A2003-Dateiformat als MDB vor. Sie ist kompatibel zu A2007
und die Lösung muß es natürlich auch sein.
Mit der Access-Benutzreverwaltung wurden mehrere Gruppen eingerichtet, u.a.
die Gruppen grpNurLesen und grpAlleRechte. Weiter wurden Benutzer
eingerichtet, z.B. die Benutzer usrLeser und usrAlleRechte. Der Benutzer
usrLeser ist natürlich mitglied der Gruppe grpNurLesen und hat entsprechende
Rechte.
Unter bestimmten Umständen kann es nun aber notwendig sein, daß usrLeser auf
der Tabelle tabXYZ schreiben muß. Die Gruppe grpAlleRechte hat das Recht auf
dieser Tabelle zu schreiben.
Meine Lösung sieht nun vor, daß ich den usrLeser für diese Aktion kurzzeitig
in die Gruppe grpAlleRechte aufnehme und ihn anschließend wieder entferne.
Wenn's denn funktionieren würde.
Der Code sieht ungefähr (abgekürzt) so aus:
Set ws = DBEngine(0)
Set Gruppe = ws.Groups("grpAlleRechte")
Set Benutzer = ws.Users("usrLeser")
Gruppe.Users.Append Gruppe.CreateUser(CurrentUser())
Gruppe.Users.Refresh
Benutzer.Groups.Refresh
Im Debugger kann ich nun sehen, daß usrLeser einen Verweis auf die Gruppe
grpAlleRechte hat und die Gruppe grpAlleRechte den usrLeser enthält.
Trotzdem funktioniert das Schreiben auf der Tabelle nicht.
Anstelle der Anweisung Gruppe.CreateUser(CurrentUser()) habe ich noch einige
andere Varianten ausprobiert, weil ich ja eigentlich keinen User "createn"
will, sondern einen existierenden verwenden möchte. Das hat aber auch alles
nicht funktioniert.
Kann mir bitte jemand helfen / sagen ob ich auf dem richtigen oder völlig
falschen weg bin?!
Vielen Dank im Voraus,
Oliver
Oliver Vincenz:
> Set ws = DBEngine(0)
> Set Gruppe = ws.Groups("grpAlleRechte")
> Set Benutzer = ws.Users("usrLeser")
>
> Gruppe.Users.Append Gruppe.CreateUser(CurrentUser())
> Gruppe.Users.Refresh
> Benutzer.Groups.Refresh
hmm - einen neuen Benutzer anlegen solltest Du nicht m�ssen.
Was ich aber grunds�tzlich vermute, ist dass die Rechte beim Start der
Datenbank gelesen werden und dann f�r diese Sitzung g�ltig sind. Hast
Du mal Deinen Code (den mit dem vorhandenen Benutzer) probiert, die DB
geschlossen und wieder ge�ffnet? Hat der Benutzer dann die neuen
Rechte?
Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm
Bitte keine eMails auf Newsgroup-Beitr�ge senden.
Hast du versucht, einfach die Rechte des Users an der Tabelle
zu �ndern. Das geht z.B. per DAO wie im Punkt 37 der
Security FAQ beschrieben (Link in www.donkarl.com?FAQ1.18).
Eine andere Variante w�re SQL per ADO, also
CurrentProject.Connection.Execute _
"GRANT SELECT, INSERT, UPDATE, DELETE" & _
" ON TABLE tabXYZ TO usrLeser"
Das Gegenst�ck ist dann:
"REVOKE SELECT, INSERT, UPDATE, DELETE" & _
" ON TABLE tabXYZ FROM usrLeser"
Ich habe das lange nicht mehr gemacht und bin daher nicht
ganz sicher, ob der User sich neu einloggen muss oder nicht.
Ich glaube aber schon. Probier's halt.
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com + Anmeldung und Info zur
Access-Entwickler-Konferenz (AEK12), Oktober 2009, N�rnberg
Als der aktuelle User hat jeder auch per VB nur die Rechte, die diesem User
und seiner Gruppe gegeben wurden. Wenn das Recht zum Ändern von Rechten
vorhanden ist, kann man die kurzzeitig per VB ändern, aber das könnte der
User dann auch selbst machen und den ganzen Schreibschutz komplett umgehen...
Was per VB geht, ist, parallel als ein weiterer User auf die Datenbank
zuzugreifen. Wenn es also in der verwendeten Arbeitsgruppen-Informationsdatei
einen weiteren User gibt, der die erforderlichen Rechte hat, dessen
Zugangsdaten dem aktuellen User aber nicht bekannt sind, kannst Du das
einbauen:
Dim ws As Workspace, db As Database
Set ws = DBEngine.CreateWorkspace("irgendeinName", "Benutzername",
"Kennwort", dbUseJet)
Set db = ws.OpenDatabase(CurrentDb.Name)
Jetzt kannst Du mit Recordsetobjekten über db.OpenRecordset auf Tabellen
zugreifen lassen und man hat dabei "unsichtbar" die Rechte des Users
Benutzername. Wenn die Anwendung keine Quelltextansicht zuläßt, ist das
soweit auch sicher...
Gruß, Michael
> Dim ws As Workspace, db As Database
> Set ws = DBEngine.CreateWorkspace("irgendeinName", "Benutzername",
> "Kennwort", dbUseJet)
> Set db = ws.OpenDatabase(CurrentDb.Name)
das funktioniert prima. Vielen Dank!
micman hatte die passende Lösung.
@Marc: Die Einstellungen wurden zwar sofort geschrieben (im Debugger
geprüft), aber erst nach einem Neustart wirksam. Das löst das Problem
leider nicht.
@Karl: Ich habe zwar an den Rechten der Tabelle rumpfuschen können, aber
eine Wirkung habe ich weder vor, noch nach einem Neustart feststellen
können. Vielleicht habe ich etwas falsch gemacht...
Noch eine Idee (von einem Kollegen):
Ein Benutzer mit Schreibrechten erstellt eine Query zur manipulation der
tabXYZ und stellt in den Query-Eigenschaften ein, daß sie immer mit
seinen Rechten ausgeführt wird. Da micmans Lösung funktioniert habe ich
diesen Weg nicht getestet / weiter verfolgt.
Vielen Dank an alle und Gruß,
Oliver