In SharePoint 2013 lassen sich Dokumente sehr einfach über das Kontextmenü mit anderen Nutzern teilen. Ein Dokument kann dabei entweder zum Anzeigen oder zum Bearbeiten freigegeben werden.
Nun zeigte sich in einigen Arbeitsräumen das Problem, dass sich Dokumente nicht mehr zum Anzeigen teilen ließen, sondern nur noch zum Bearbeiten. Das ist natürlich nicht in jedem Fall gewünscht:
Lesen Sie in diesem Beitrag, wie in SharePoint das Freigeben von Dokumenten unter der Haube funktioniert und wie sich das Problem der nicht teilbaren Dokumente (nicht) lösen lässt.
Dokumente freigeben unterbricht die Berechtigungsvererbung
Der Freigabedialog bietet die Optionen, ein Dokument zum Anzeigen und zum Bearbeiten freizugeben. Was genau passiert mit den Berechtigungen, wenn wir ein Dokument zur Anzeige freigeben?
Wir wählen Kann anzeigen und klicken auf Freigeben.
SharePoint unterbricht nun die Berechtigungsvererbung für das Dokument, oder genauer: für das entsprechende Element der Dokumentenbibliothek.
Das lässt sich prüfen, indem wir die Berechtigungsübersicht der Site öffnen. SharePoint weist uns hier bereits auf spezielle Berechtigungen hin:
Ein Klick auf Diese Elemente anzeigen öffnet einen Dialog, in dem auch die Bibliothek unseres Dokuments aufgelistet ist:
Ein weiterer Klick auf Ausnahmen anzeigen zeigt Details:
Das Dokument hat eigene Berechtigungen. Der Nutzer "Heinrich Ulbricht" wurde in die Berechtigungsliste des Dokuments aufgenommen. Die zugewiesene Berechtigungsstufe ist Lesen, da das Dokument für die Anzeige freigegeben wurde.
Eine Folge die man im Hinterkopf haben sollte: Berechtigungsänderungen auf Site-Ebene wirken sich nun nicht mehr auf das Dokument aus.
Fehlende Berechtigungsstufen
Aus dem letzten Screenshot lässt sich erahnen, woran es liegen kann, dass Dokumente nicht mehr für die Anzeige freigegeben werden können.
Was passiert, wenn die Berechtigungsstufe Lesen fehlt?
Der Test:
Wir löschen die Berechtigungsstufe Lesen. Und der Freigabedialog reagiert:
Es ist keine Freigabe zur Anzeige mehr möglich.
Unterschiede zwischen out-of-box und eigenen Berechtigungsstufen
Die gelöschte Berechtigungsstufe Lesen lässt sich ohne Probleme wieder anlegen. Das wird aber die fehlende "Kann anzeigen"-Option des Freigabedialogs nicht wieder aktivieren. Was ist der Grund? Der Typ.
Schauen wir uns die Lesen-Berechtigungsstufe an, nachdem ein Web neu angelegt wurde. Per PowerShell lesen wir folgende 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 angelegt 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 wichtigen Unterschied: der Type der Berechtigungsstufe. Und genau das ist das Problem.
SharePoint bietet die Option Kann anzeigen im Freigabedialog nur an, wenn eine Berechtigungsstufe vom Typ Reader existiert.
Selbst angelegte Berechtigungsstufen besitzen diesen Typ nicht.
Typ einer Berechtigungsstufe ändern - here be dragons
SharePoint bildet Berechtigungsstufen über den Typ SPRoleDefinition ab. Mehrere SPRoleDefinitions werden pro Web in einer SPRoleDefinitionCollection verwaltet. Neue Berechtigungsstufen für ein Web lassen sich per SPWeb.RoleDefinitions.Add hinzufügen.
Unser Ziel ist es nun, die Lesen-Berechtigungsstufe (oder eine beliebige andere) so zu erzeugen, dass deren Typ Reader ist.
Eine kurze Recherche zeigt: das Ändern des Typs einer Berechtigungsstufe scheint nicht möglich. 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 setzen. Wann also wird dieser Typ von SharePoint gesetzt?
Der Typ einer Berechtigungsstufe wird u.a. dann gesetzt, wenn diese einer SPRoleDefinitionCollection hinzugefügt wird (also genau das, was wir auch vorhaben). Dabei kommt die (private) Methode AddCore zum Einsatz, die auch von der (public) Methode Add verwendet 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 übernommen, 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 aufrufbar, so wäre der Typ setzbar, indem der Parameter allowType auf true gesetzt wird.
Die Lösung heißt: PowerShell und Zugriff auf private Methoden. Die letzten zwei Zeilen der Lösung sehen wie folgt aus:
[Object[]] $params = @([Microsoft.SharePoint.SPRoleDefinition]$roleDefinition, $true)
$addCore.Invoke($roleDefinitionColleciton, $params)
Die schmutzige Arbeit, an die Methode in der Variable $addCore heranzukommen, sei dem Leser als Übung überlassen.
Zusammenfassung
SharePoint bildet die Freigeben-Funktionalität für Dokumente auf Elementberechtigungen ab und unterbricht die Berechtigungsvererbung. Für die Freigabe werden Berechtigungsstufen mit dem richtigen Typ benötigt. Nach dem Anlegen einer Site Collection sind diese Berechtigungsstufen verfügbar (Lesen, Bearbeiten), werden sie gelöscht, lassen sie sich nicht wieder anlegen. Es sei denn, man verwendet PowerShell-Tricks.
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 freigeben und bekommt die Meldung:
"Fehler: Nur eine eingeschränkte ANzahl an Personen Inhalte gemeinsam 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önnen mir helfen.