Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden

SharePoint 2013: Wenn sich Dokumente nicht mehr freigeben lassen

In SharePoint 2013 las­sen sich Dokumente sehr ein­fach über das Kontextmenü mit ande­ren Nutzern tei­len. Ein Dokument kann dabei ent­we­der zum Anzeigen oder zum Bearbeiten frei­ge­ge­ben werden.

Nun zeigte sich in eini­gen Arbeitsräumen das Problem, dass sich Dokumente nicht mehr zum Anzeigen tei­len lie­ßen, son­dern nur noch zum Bearbeiten. Das ist natür­lich nicht in jedem Fall gewünscht:

SharePoint-2013-Dokument-Teilen-Anzeigen-Fehlt

Lesen Sie in die­sem Beitrag, wie in SharePoint das Freigeben von Dokumenten unter der Haube funk­tio­niert und wie sich das Problem der nicht teil­ba­ren Dokumente (nicht) lösen lässt.

Dokumente frei­ge­ben unter­bricht die Berechtigungsvererbung

Der Freigabedialog bie­tet die Optionen, ein Dokument zum Anzeigen und zum Bearbeiten frei­zu­ge­ben. Was genau pas­siert mit den Berechtigungen, wenn wir ein Dokument zur Anzeige freigeben?

SharePoint-2013-Dokument-Teilen-Anzeigen-Demo

Wir wäh­len Kann anzei­gen und kli­cken auf Freigeben.

SharePoint unter­bricht nun die Berechtigungsvererbung für das Dokument, oder genauer: für das ent­spre­chende Element der Dokumentenbibliothek.

Das lässt sich prü­fen, indem wir die Berechtigungsübersicht der Site öff­nen. SharePoint weist uns hier bereits auf spe­zi­elle Berechtigungen hin:

SharePoint-2013-Berechtigungsvererbung-Unterbrochen

Ein Klick auf Diese Elemente anzei­gen öff­net einen Dialog, in dem auch die Bibliothek unse­res Dokuments auf­ge­lis­tet ist:

SharePoint-2013-Berechtigungsvererbung-Unterbrochen-Details

Ein wei­te­rer Klick auf Ausnahmen anzei­gen zeigt Details:

SharePoint-2013-Elementberechtigungen

Das Dokument hat eigene Berechtigungen. Der Nutzer "Heinrich Ulbricht" wurde in die Berechtigungsliste des Dokuments auf­ge­nom­men. Die zuge­wie­sene Berechtigungsstufe ist Lesen, da das Dokument für die Anzeige frei­ge­ge­ben wurde.

Eine Folge die man im Hinterkopf haben sollte: Berechtigungsänderungen auf Site-Ebene wir­ken sich nun nicht mehr auf das Dokument aus.

Fehlende Berechtigungsstufen

Aus dem letz­ten Screenshot lässt sich erah­nen, woran es lie­gen kann, dass Dokumente nicht mehr für die Anzeige frei­ge­ge­ben wer­den können.

Was pas­siert, wenn die Berechtigungsstufe Lesen fehlt?

Der Test:

SharePoint-2013-Berechtigungsstufe-Lesen-Entfernen

 Wir löschen die Berechtigungsstufe Lesen. Und der Freigabedialog reagiert:

SharePoint-2013-Dokument-Teilen-Bearbeiten-Details

Es ist keine Freigabe zur Anzeige mehr möglich.

Unterschiede zwi­schen out-of-box und eige­nen Berechtigungsstufen

Die gelöschte Berechtigungsstufe Lesen lässt sich ohne Probleme wie­der anle­gen. Das wird aber die feh­lende "Kann anzeigen"-Option des Freigabedialogs nicht wie­der akti­vie­ren. Was ist der Grund? Der Typ.

Schauen wir uns die Lesen-Berechtigungsstufe an, nach­dem ein Web neu ange­legt wurde. Per PowerShell lesen wir fol­gende Informationen aus:

Name            : Lesen
Description     : Kann Seiten und Listenelemente anzeigen und Dokumente herunterladen.
Type            : Reader
Hidden          : False
BasePermissions : ViewListItems, OpenItems, ViewVersions, ViewFormPages, Open, ViewPages, CreateSSCSite, BrowseUserInfo, UseClientIntegration, UseRemoteAPIs, CreateAlerts
ParentWeb       :
Xml             : <Role ID="1073741928" Name="Lesen" Description="Kann Seiten und Listenelemente anzeigen und Dokumente herunterladen." Order="128" Hidden="False" Type="Reader" BasePermissions="ViewListItems, OpenItems,
                  ViewVersions, ViewFormPages, Open, ViewPages, CreateSSCSite, BrowseUserInfo, UseClientIntegration, UseRemoteAPIs, CreateAlerts" />

Und nun die Informationen für die Berechtigungsstufe Lesen, die wir selbst neu ange­legt haben:

Name            : Lesen
Description     : Kann Seiten und Listenelemente anzeigen und Dokumente herunterladen.
Type            : None
Hidden          : False
BasePermissions : ViewListItems, OpenItems, ViewVersions, ViewFormPages, Open, ViewPages, CreateSSCSite, BrowseUserInfo, UseClientIntegration, UseRemoteAPIs, CreateAlerts
ParentWeb       :
Xml             : <Role ID="1073741927" Name="Lesen_alt" Description="Kann Seiten und Listenelemente anzeigen und Dokumente herunterladen." Order="2147483647" Hidden="False" Type="None" BasePermissions="ViewListItems, OpenItems,
                  ViewVersions, ViewFormPages, Open, ViewPages, CreateSSCSite, BrowseUserInfo, UseClientIntegration, UseRemoteAPIs, CreateAlerts" />

Es gibt genau einen wich­ti­gen Unterschied: der Type der Berechtigungsstufe. Und genau das ist das Problem.

SharePoint bie­tet die Option Kann anzei­gen im Freigabedialog nur an, wenn eine Berechtigungsstufe vom Typ Reader existiert. 

Selbst ange­legte Berechtigungsstufen besit­zen die­sen Typ nicht.

Typ einer Berechtigungsstufe ändern - here be dragons

SharePoint bil­det Berechtigungsstufen über den Typ SPRoleDefinition ab. Mehrere SPRoleDefinitions wer­den pro Web in einer SPRoleDefinitionCollection ver­wal­tet. Neue Berechtigungsstufen für ein Web las­sen sich per SPWeb.RoleDefinitions.Add hinzufügen.

Unser Ziel ist es nun, die Lesen-Berechtigungsstufe (oder eine belie­bige andere) so zu erzeu­gen, dass deren Typ Reader ist.

Eine kurze Recherche zeigt: das Ändern des Typs einer Berechtigungsstufe scheint nicht mög­lich. Der Grund: SPRoleDefinition.Type ist read-only.

public SPRoleType Type { get; }

Ein JustDecompile-Blick in die Microsoft.SharePoint.dll und auf SPRoleDefinition bestä­tigt: Type lässt sich "von außen" nicht set­zen. Wann also wird die­ser Typ von SharePoint gesetzt?

Der Typ einer Berechtigungsstufe wird u.a. dann gesetzt, wenn diese einer SPRoleDefinitionCollection hin­zu­ge­fügt wird (also genau das, was wir auch vor­ha­ben). Dabei kommt die (pri­vate) Methode AddCore zum Einsatz, die auch von der (public) Methode Add ver­wen­det wird. Der Unterschied ist ein Parameter:

public void Add(SPRoleDefinition role)
private int AddCore(SPRoleDefinition role, bool allowType)

Der Parameter allowType bestimmt dar­über, ob beim Hinzufügen einer Berechtigungsstufe der Typ über­nom­men, oder auf None gesetzt wird:

     private int AddCore(SPRoleDefinition role, bool allowType)
     {
         [...]
         if (allowType)
         {
             type = (byte)role.Type;
         }
         else
         {
             type = 0;
         }
         [...]
     }

Nur ein Parameter. Wäre SPRoleDefinitionCollection.AddCore für uns auf­ruf­bar, so wäre der Typ setz­bar, indem der Parameter allowType auf true gesetzt wird.

Die Lösung heißt: PowerShell und Zugriff auf pri­vate Methoden. Die letz­ten zwei Zeilen der Lösung sehen wie folgt aus:

    [Object[]] $params = @([Microsoft.SharePoint.SPRoleDefinition]$roleDefinition, $true)
    $addCore.Invoke($roleDefinitionColleciton, $params)

Die schmut­zige Arbeit, an die Methode in der Variable $addCore her­an­zu­kom­men, sei dem Leser als Übung überlassen.

Zusammenfassung

SharePoint bil­det die Freigeben-Funktionalität für Dokumente auf Elementberechtigungen ab und unter­bricht die Berechtigungsvererbung. Für die Freigabe wer­den Berechtigungsstufen mit dem rich­ti­gen Typ benö­tigt. Nach dem Anlegen einer Site Collection sind diese Berechtigungsstufen ver­füg­bar (Lesen, Bearbeiten),  wer­den sie gelöscht, las­sen sie sich nicht wie­der anle­gen. Es sei denn, man ver­wen­det PowerShell-Tricks.

7. Januar 2014

1 Kommentar

Super Beitrag.

ich hätte da an den Profikenner eine Frage, die glzt. ein Problem bei uns mit dem Freigeben ist: Eine Koll die volle Bearbeitungsrechte hat( aber eigene Rechtegruppe mit den Bearbeiten Rechten) will ein Dokument frei­ge­ben und bekommt die Meldung:
"Fehler: Nur eine ein­ge­schränkte ANzahl an Personen Inhalte gemein­sam nutzen" 🙁
was ist das für Fehlermeldung. Schon nach dem Aufruf von Freigeben für kommt diese Meldung. Finde im WWW nichts dazu. Hoffe sie kön­nen mir helfen.

Comments are closed.

Pin It on Pinterest