Sperren eines Dokuments in einer WSS Dokumentenbibliothek


Oft hat man innerhalb eines Workflows die Anforderung ein Dokument in einer Dokumentenbibliothek in WSS nach bestimmten Aktionen zu sperren und nur noch Lesezugriff auf das Dokument zuzulassen.

Dies macht einem in mehreren Punkten Kopfzerbrechen

  • Ein Account muss Full-Control behalten, das "Selbst-Aussperren" lässt SharePoint nicht zu
  • Das Handling der Security-Objekte in WSS ist nicht ganz einfach.

Das untenstehende Codeschnipsel ist aus einem Workflow und tut folgendes:

  • Ermitteln der aktuellen Security Einstellungen
  • Aktivieren der Item-Level Security für das aktuelle Dokument (welches den Workflow gefeuert hat)
  • Löschen aller Rechte auf dem Dokument
  • Übertragen der Rechte des Parent-Objekts (kann ein Ordner oder eine Dokumentenbiliothek sein) jedoch nur mit Lese-Zugriff
  • Berechtigen der Gruppe "Document Admins" mit vollem Zugriff.


SPFile docFile = thisitem.File;
SPRoleAssignmentCollection spra = thisitem.RoleAssignments;

...   

SPRoleAssignmentCollection spraParent;
if (docFile.ParentFolder.Item != null)
{
    spraParent = docFile.ParentFolder.Item.RoleAssignments;
}
else
{
    spraParent = thisitem.ParentList.RoleAssignments;
};
foreach (SPRoleAssignment spr in spra)
{
    if (spr.Member.Name.ToString() != "Document Admins")
    {
        spr.RoleDefinitionBindings.RemoveAll();
    };
    spr.Update();
}
foreach (SPRoleAssignment spr1 in spraParent)
{
    SPGroup spnewGroup;
    SPUser spnewUser;
    spnewGroup = null;
    spnewUser = null;
    if (spr1.Member.Name.ToString() != "Document Admins")
    {
        String strgroup = spr1.Member.Name.ToString();
        int i;
        for (i = 0; i < thisWeb.Users.Count; i++)
        {
            if (thisWeb.Users[i].Name == strgroup)
            {
                spnewUser = thisWeb.Users[i];
                break;
            };
        };
        if (spnewUser == null)
        {
            for (i = 0; i < thisWeb.Groups.Count; i++)
            {
                if (thisWeb.Groups[i].Name == strgroup)
                {
                    spnewGroup = thisWeb.Groups[i];
                    break;
                };
            };
        };
        if (spnewGroup != null)
        {
            SPRoleDefinition RoleDefReader = thisWeb.RoleDefinitions.GetByType(SPRoleType.Reader);
            SPRoleAssignment RoleAssReader = new SPRoleAssignment((SPPrincipal)spnewGroup);
            RoleAssReader.RoleDefinitionBindings.Add(RoleDefReader);
            thisitem.RoleAssignments.Add(RoleAssReader);
        };
        if (spnewUser != null)
        {
            SPRoleDefinition RoleDefReader = thisWeb.RoleDefinitions.GetByType(SPRoleType.Reader);
            SPRoleAssignment RoleAssReader = new SPRoleAssignment((SPPrincipal)spnewUser);
            RoleAssReader.RoleDefinitionBindings.Add(RoleDefReader);
            thisitem.RoleAssignments.Add(RoleAssReader);
        };
        thisitem.Update();
    };
};
thisitem.Update();
...
 

Viel Spaß beim Ausprobieren

Sven


Skip to main content