SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




ItemAdding und RunWithElevatedPrivileges ?

Geprüfte Antwort Dieser Beitrag hat 3 Antworten

Ohne Rang
508 Beiträge
Tom Scheuermann erstellt 15 Nov. 2013 13:13
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Community,

ich muss in einem EventReceiver überprüfen, ob sich der Wert eines Feldes geändert hat.
Das Feld ist vom Typ "Person oder Gruppe" (SPFieldType.User).

Wurde der Wert des Feldes geändert, dann

- sollen die Berechtigungen für das Element für den "alten" Benutzer entzogen werden
  Demnach muss ich den Wert des Feldes vor dem Update wissen

- sollen Berechtigungen für das Element für den "neuen" Benutzer hinzugefügt werden

Im Prinzip ist mir klar wie das geht:

- EventReceiver-Klasse erstellen und Registrieren

- ItemUpdating-Event triggern

- mit "BeforeProperties" den alten Wert ermitteln

- mit "AfterProperties" den neuen Wert ermitteln

ABER:

Ich kann nicht sicherstellen, das der User der den Event auslöst auch Berechtigungen verändern darf. Demnach muss ich den Code in "RunWithElevatedPriviliges" packen. Das funktioniert nur aber nur, wenn innerhalb des Elevated-Blocks eine neue Instanz auf das ListItem aufmache und es dann Update.

Nach meinem Gefühl ist es keine gute Idee, innerhalb eines ItemUpdatING Events eine neue Instanz auf das ListElement zu erstellen und dieses zu aktualisieren.

Welche Erfahrungswerte habt ihr - wie würdet ihr das lösen ?

THX

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 15 Nov. 2013 13:29
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Tom,

das Problem kenne ich nur zu gut.

[quote user="Tom Scheuermann"]Nach meinem Gefühl ist es keine gute Idee, innerhalb eines ItemUpdatING Events eine neue Instanz auf das ListElement zu erstellen und dieses zu aktualisieren.[/quote]

Das ist nicht nur Dein Gefühl, der Versuch wird sogar mit einer Exception belohnt ;-)

Du kannst Dir aber in der EventReceiver-Klasse ein statisches Feld vom Typ List<int> anlegen. Wenn Du beim Updating erkennst, daß etwas getan werden muß, speicherst Du dort die properties.ListItemId. Im Updated prüfst Du dann einfach, ob die aktuelle Element-ID gespeichert wurde. Falls ja entfernst Du sie wieder und machst Deine Arbeit.

Ich habe diese Methode schon öfter erfolgreich angewendet. Man kann dabei sogar mit mehreren statischen Listen arbeiten und so verschiedene Änderungen von -ing nach -ed weitergeben. Und auch von Deleting nach Deleted.

Aber Achtung: sämtliche Zugriffe auf die statischen Felder müssen threadsicher gemacht werden. Wie das geht, weißt Du ja sicher :-)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
508 Beiträge
Tom Scheuermann Als Antwort am 15 Nov. 2013 13:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi Andi,

danke für Dein schnelles Statement und die darin enthaltene Lösung.

So dachte ich mir das schon - man fühlt sich halt wohler, wenn noch jemand der gleichen Meinung ist, und genau dafür gibt's ja die Community :-)

Greets

Tom

ts (-at-) computer-kreativ.de

Microsoft Certified IT Professional: SharePoint 2010 Administration
Microsoft Certified Technoligie Specialist: SharePoint 2010 Configuring

Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 15 Nov. 2013 13:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ein andere Möglichkeit wäre die Information im Updating über properties.AfterProperties["MetaInfo#Key"] = "Wert" im PropertyBag des Elements zu hinterlegen. Diese müssen dann immer gesetzt werden so das sie auch bei "null" wieder gelöscht werden. Im Updated prüfst du dann die Property.

Was ich noch empfehlen würde wäre Updated Synchrone auszuführen, dann hast du die Möglichkeit die Information über das Attribute [ThreadStatic] zu Variablen im selben Thread zu speichern.