Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Einem User kurzzeitig per VBA schreibrechte zuweisen

60 views
Skip to first unread message

Oliver Vincenz

unread,
Sep 9, 2009, 11:41:01 AM9/9/09
to
Hallo,

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

Mark Doerbandt

unread,
Sep 9, 2009, 12:29:02 PM9/9/09
to
Hallo, 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.

Karl Donaubauer

unread,
Sep 9, 2009, 1:25:31 PM9/9/09
to
Oliver Vincenz wrote:
> 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.
> ...

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

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


micmen

unread,
Sep 10, 2009, 9:00:01 AM9/10/09
to
Hallo,
leider wurde dieser Thread verstümmelt, ich sehe hier nur den Beitrag von
gestern 9:31h.
Daher habe ich auch nicht die Problembeschreibung, ich beziehe mich nur auf
den Betreff "Einem User kurzzeitig per VBA schreibrechte zuweisen"...

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

Oliver Vincenz

unread,
Sep 10, 2009, 4:04:54 PM9/10/09
to
Hallo 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!

Oliver Vincenz

unread,
Sep 10, 2009, 4:25:56 PM9/10/09
to
Hallo,

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

0 new messages