Posts mit dem Label RunWithElevatedPrivileges werden angezeigt. Alle Posts anzeigen
Posts mit dem Label RunWithElevatedPrivileges werden angezeigt. Alle Posts anzeigen

Mittwoch, 1. Februar 2012

SPSecurity.RunWithElevatedPrivileges vs. SPUserToken.SystemAccount

Die Verwendung von RunWithElevatedPrivileges  erzeugt komplexen Code der die einen oder anderen Probleme mitbringt. Auch erhält man dadurch SiteCollectionAdmin-Berechtigung auf allen SiteCollections der aktuellen WebApplication.
Einfacher und eleganter kommt man in den meisten Fällen mit dem SystemAccount Token zum Ziel, der sich nur auf eine SPSite bezieht.

Die Ausnahme:
Zum ermitteln des SystemAccount Tokens braucht der aktuelle User eine Berechtigung auf der entsprechenden SPSite. Ist dies nicht gegeben führt kein Weg an RunWithElevatedPrivileges vorbei.
Dabei sollte dann aber nur der SystemAccount Token ermittelt werden und dann der Bereich wieder verlassen werden. Da der UserToken lediglich ein ByteArray ist, kann man diesen  aus dem elevated-Block heraus zurückgeben, ohne sich über mögliche Referenzen Gedanken zu machen.

Laut Microsoft ist SPUserToken.SystemAccount  einem site.SystemAccount vorzuziehen.
Möchte man allerdings die AccessDeniedException selbst behandeln um z.B mit RunWithElevatedPrivileges darauf zu reagieren, kann man eine SPSite-Instanz verwenden, .CatchAccessDeniedException = false setzen und im catch Block entsprechend reagieren.

Eine schöne Lösung die mit einer Extension-Method umgesetzt hat Keith Dahlby zur Verfügung gestellt.