Domino 9 und frühere Versionen > Entwicklung

CanDeleteDocuments=True, trotzdem keine Berechtigung

(1/3) > >>

Moni:
Hallo an alle!

Folgendes Problem:
Ich habe eine DB in der die User eigentlich keine Dokumente löschen dürfen. Jetzt habe ich aber einen Agenten gestrickt, der nach vielen anderen Dingen den User in die ACL einträgt mit der Berechtigung Dokumente zu löschen, dann soll ein Dokument gelöscht werden und dann wird der User wieder aus der ACL gelöscht. Leider scheitert das ganze am löschen des Dokumentes.

Habe mal das Problem in folgendem Code zusammengefaßt:

Sub Initialize
   
On Error Goto ErrHandler
Dim session As New Notessession
Dim DB As NotesDatabase
Dim doc As NotesDocument
Dim collection As NotesDocumentCollection
   
Set DB = session.currentdatabase
Set collection =DB.unprocesseddocuments
Set doc = collection.GetFirstDocument
   
Do While Not (doc Is Nothing)
Dim acl As NotesACL
Dim entry As NotesACLEntry
Set acl = db.ACL
Set entry = New NotesACLEntry (acl, session.username, ACLLevel_Manager)
entry.CanDeleteDocuments = True
Call acl.save

If ( doc.Remove( True ) = False ) Then
Set doc=collection.GetNextDocument(doc)
   
Loop
   
ErrHandler:
Print " Error #" & Cstr(Err) & ": " & Error$ & " (" & Erl & ")"
End Sub


Das ich das gelöschte Dokument nachher nicht mehr als Parameter für die Collection verwenden kann ist mir klar. Ich verstehe nur nicht, warum er beim "Remove" immer in den ErrHandler springt, obwohl ich doch das Recht habe, Dokumente zu löschen. Ich erhalte folgende Ausgabe:

Error #4000: Notes error: Sie sind zur Durchführung dieser Operation nicht berechtigt (30)

Zieht das Recht nicht sofort?

Semeaphoros:
Aus 2 Gründen geht das nicht:

a) die Rechte ziehen tatsächlich nicht sofort. Der Server cached die Rechte und es kann ziemlich lange dauern, dass der Access-Cache neu aufgebaut wird.

b) um eine ACL zu ändern, benötigt der Benutzer Manager-Rechte, sonst werden die Rechte nicht rausgeschrieben.

Heisst: da braucht es eine völlig andere Strategie, dafür gibt es ein Datenbank-Event "QueryDocumentDelete", damit lässt sich das Löschen dann auf ganz bestimmte Fälle begrenzen.

Axel:
Hi,

meines Wissens zieht eine Berechtigungsänderung in der ACL erst nach der Neuanmeldung des Users. Unter Umständen ist es manchmal sogar notwendig, den Client neu zu starten.

Frage:   ???  ??? Wo liegt der Sinn den User in die ACL einzutragen wenn er ein Dokument löschen will und dann wieder zu löschen? Trage den oder die User doch gleich fest in die ACL ein. Das spart jede Menge Ärger?

Axel

koehlerbv:
Hallo, Moni,

ACL-Änderungen werden erst nach Neuanmeldung durch den Client wirksam - wie Semeaphoros und Axel schon geschrieben haben. Von den erforderlichen Manager-Rechten für ACL-Änderungen wollen wir mal gar nicht reden ;-)

Ein unkonventioneller Vorschlag: Lass Deine User doch Dokumente "löschen", aber nicht wirklich ;-)
- Stell Deine Ansichten um, daß sie nur die Forms Deiner Wahl anzeigen
- Wenn ein User "löschen" will (via Script: QueryDocumentDelete, mit @functions geht das so nicht, dann muss Du einen "Lösch"-Button einbauen), änderst Du das "Form"-Item um auf "Deleted" + Form
- In einer eigenen Ansicht (mit der Auswahl @Left (Form; 7) != "Deleted) siehst Du nun die "gelöschten Doks und kannst sie bei Fehlverhalten der User über eine entsprechende Aktion wieder restaurieren.

HTH,
Bernhard

Moni:
Erstmal danke für eure schnelle Hilfe.

@Axel
Der Sinn ist leider super kompliziert. Ich habe eine DB, in der die Anwender nur bestimmte Dokumente löschen dürfen. Daher haben Sie in der ACL nicht grundsätzlich das Recht zum löschen, sondern ich habe einen Button eingebaut, über den die User löschen dürfen. (QueryDocumentDelete) ;-)

Seit einiger Zeit habe ich allerdings das Problem, dass beim Lauf eines Agenten beim Call doc.save(true,true) der Fehler auftaucht "Element des Dokumentes nicht gefunden". Den Fehler habe ich mit allen Mitteln versucht zu beheben, aber keine Chance. (Absolut kuriose Sache, passiert nämlich nicht bei allen Anwendern)
Jetzt versuche ich das Speichern zu umgehen, indem ich in der DB eine Kopie des Dokumentes anlege, da ich die Kopie nicht extra speichern muß und muß das alte Dokument löschen, da auf keinen Fall zwei gleiche Dokumente drin sein dürfen.
Der Agent wird vom Benutzer auf dem Client gestartet und daher benötigt er für einen kurzen Moment das Recht, Dokumente zu löschen.

Tja, muß mir aber wohl etwas anderes einfallen lassen. Wäre ja auch zu einfach gewesen.  :'(

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln