Rechte sind im SharePoint einer der wichtigsten Bereiche. Deshalb folgt hier ein How-To, wie die erhöhte Rechte im SharePoint für Zugriffe richtig verwendet werden. Die Standardmethode, um Funktionen oder Codeabschnitte mit erhöhten Rechten auszuführen, ist die Funktion „SPSecurity.RunWithElevatedPrivileges“. Sie änderte die Rechte des aktuellen Users zum Application Pool Account.
Es wird bei dieser Funktion auch kein wirklich neuer Thread im Hintergrund angelegt, sondern nur eine Personifikation mit der Identity des Application Pool Accounts durchgeführt. Diese wird beim Verlassen zurückgesetzt.
01. SPSecurity.RunWithElevatedPrivileges(delegate()
02.{
03. using (SPSite site = new SPSite(siteID))
04. {
05. using (SPWeb web = site.OpenWeb(webID))
06. {
07. // Funktion zur Interaktion mit SharePoint
08. }
09. }
10.});
Wahlweise für die Rootwebsite:
01.SPSecurity.RunWithElevatedPrivileges(delegate()
02.{
03. using (SPSite site = new SPSite(siteID))
04. {
05. using (SPWeb web = site.OpenWeb())
06. {
07. // Funktion zur Interaktion mit SharePoint
08. }
09. }
10.});
ZU BEACHTEN: Um diese Funktion nutzen zu können, muss der „SPContext“ vorhanden sein, ansonsten wird keine Änderung der Rechte durchgeführt. Zudem müssen eventuelle Site- und Web-Objekte neu geöffnet werden. Bereits vorhandene Objekte werden keine neuen Rechte zugeordnet.
Sollte keine ID zum Öffnen der Site vorhanden sein, kann auch eine Url verwendet werden. „OpenWeb“ braucht in diesem Fall keine zusätzlichen Parameter.
01.SPSecurity.RunWithElevatedPrivileges(delegate()
02.{
03. using (SPSite site = new SPSite(siteUrl))
04. {
05. using (SPWeb web = site.OpenWeb())
06. {
07. // Funktion zur Interaktion mit SharePoint
08. }
09. }
10.});
ZU BEACHTEN: Je nach SiteUrl die verwendet wurde, wird das entsprechende Web geöffnet, was nicht zwangsläufig die Rootwebsite sein muss.
Durch das Vorhandensein des „SPContext“ eignet sich diese Methode nicht überall. Ein zusätzlicher „SPUserToken“ hilft in diesem Fall:
01.using (SPSite site = new SPSite(siteUrl, userToken))
02.{
03. using (SPWeb web = site.OpenWeb())
04. {
05. // Funktion zur Interaktion mit SharePoint
06. }
07.}
Eine weitere Möglichkeit ist, den UserToken einer Site direkt zu ändern, sollte bereits ein Site-Objekt vorhanden sein. Allerdings sollte dies nur wenn unbedingt notwendig eingesetzt werden.
site.UserToken= userToken;
Der Usertoken kann auf unterschiedliche Weise erhalten werden. Es kommt in den folgenden Alternativen darauf an, welche Rechte benötigt werden. Im ersten Fall wird der System Account verwendet. Der Token wird dazu vorher aus einer beliebigen Site geholt.
01.using (SPSite siteHelper = new SPSite(siteUrl))
02.{
03. SPUserToken userToken = siteHelper.SystemAccount.UserToken;
04. using (SPSite site = new SPSite(siteUrl, userToken))
05. {
06. // Funktion zur Interaktion mit SharePoint
07. }
08.}
Die zweite Möglichkeit erlaubt es einen User mit gewünscht gesetzten Rechten zu verwenden. Dazu muss sowohl eine Site als auch ein Web geöffnet werden, in denen der User vorhanden ist.
01.using (SPSite siteHelper = new SPSite(siteUrl))
02.{
03. using (SPWeb webHelper = site.OpenWeb())
04. {
05. SPUserToken userToken = webHelper.AllUsers[userName].UserToken;
06. using (SPSite site = new SPSite(siteUrl, userToken))
07. {
08. // Funktion zur Interaktion mit SharePoint
09. }
10. }
11.}
Der Token kann auch über die using-Bereich hinaus verwendet werden, ohne seine Gültigkeit zu verlieren. Für das Web-Objekt und andere SP-Objekte gilt dies nicht.
01.SPUserToken userToken;using (SPSite siteHelper = new SPSite(siteUrl))
02.{
03. using (SPWeb webHelper = site.OpenWeb())
04. {
05. userToken = webHelper.AllUsers[userName].UserToken;
06. }
07.}
01.using (SPSite site = new SPSite(siteUrl, userToken))
02.{
03.// Funktion zur Interaktion mit SharePoint
04.}
Zudem kann er in ein Binary umgewandelt werden, um ihn zu übertragen. Die Umwandlung wird wie folgt durchgeführt:
SPUserToken tokenInside = webHelper.AllUsers[userName].UserToken;
byte[] binaryToken = tokenInside.BinaryToken;
SPUserToken tokenOutside = new SPUserToken(binaryToken);
Um festzustellen, welcher Account nun tatsächlich gerade die Funktionen ausführt, muss die „WindowsIdentity“ verwendet werden. Den „CurrentUser“ abzufragen, bringt im Falle von System Accounts wenig, da bei diesen nur ein für alle gleicher Platzhalter ausgegeben wird.
string userName = tokenWeb.CurrentUser.Name;
string userName = WindowsIdentity.GetCurrent().Name;