none
Помогите с обработчиком событий для sharepoint foundation 2010 RRS feed

  • Вопрос

  • Добрый день! У меня есть список в котором есть столбцы "ФИО"(поле пользователь, где берем пользователя из AD) и "права доступа"(пример: уровень1, уровень2 и т.д.) и есть библиотека документов в которой я тоже создал столбец "права доступа" и устанавливаю их на документы. Я пытаюсь сделать обработчик событий который проверяет все библиотеки и меняет у всех документов права согласно списку. Как это сделать? Помогите с кодом?
    3 сентября 2012 г. 10:22

Ответы

  • Добрый день, готовый код есть

    public override void ItemAdded(SPItemEventProperties properties)
         {
             base.ItemAdded(properties);
    
             SPSecurity.RunWithElevatedPrivileges(() =>
             {
                 using (SPSite site = new SPSite(properties.SiteId))
                 {
                     using (SPWeb web = site.OpenWeb(properties.Web.ID))
                     {
                         SPList list = web.Lists[properties.ListId];
                         SPListItem item = list.GetItemById(properties.ListItem.ID);
    
                         //Specify that we want cuystom permssions for this list item
                         if (!item.HasUniqueRoleAssignments)
                         {
                             item.BreakRoleInheritance(true);
                         }
    
                         List<SPRoleAssignment> listRoleAssignment = new List<SPRoleAssignment>();
    
                         //Find all the administrative role assignents
                         //Remove all role assignments
                         //Add ONLY the administrative role asssigments back in
                         //Add specified user in as contributor
                         
                         while (item.RoleAssignments.Count > 0)
                         {
                             SPRoleAssignment roleAssignment = item.RoleAssignments[0];
                             foreach (SPRoleDefinition roleDefinition in roleAssignment.RoleDefinitionBindings)
                             {
                                 if (roleDefinition.Type == SPRoleType.Administrator)
                                 {
                                     listRoleAssignment.Add(roleAssignment);
                                 }
                             }
    
                             item.RoleAssignments.Remove(0);
                         }
    
                         SPUser itemOwner = item.GetSPUserFromSPFieldUser("List Item Owner");
    
                         if (itemOwner != null)
                         {
                             SPRoleAssignment roleAssignmentForUser = new SPRoleAssignment(itemOwner as SPPrincipal);
                             SPRoleDefinition roleDefinitionForUser = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                             roleAssignmentForUser.RoleDefinitionBindings.Add(roleDefinitionForUser);
                             listRoleAssignment.Add(roleAssignmentForUser);
                         }
    
                         foreach (SPRoleAssignment addRoleAssignment in listRoleAssignment)
                         {
                             item.RoleAssignments.Add(addRoleAssignment);
                         }
    
    
                     }
    
    
                 }
             });
    
         
         }
    
    
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.SharePoint;
    
    namespace AssignCustomItemPermissions.Extensions
    {
        public static class ListExtensions
        {
    
            public static SPUser GetSPUserFromSPFieldUser(this SPListItem item, string fieldName)
            {
                SPUser itemOwner = null;
                try
                {
                    SPFieldUser itemOwnerField = (SPFieldUser)item.Fields[fieldName];
                    SPFieldUserValue user = (SPFieldUserValue)itemOwnerField.GetFieldValue(item[fieldName].ToString());
                    itemOwner = user.User;
                }
                catch { };
                return itemOwner;
    
            }
        }
    }
    
    
    

     


    LinkedIn Profile
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    • Помечено в качестве ответа Ruslan P 4 сентября 2012 г. 12:59
    4 сентября 2012 г. 10:44

Все ответы

  • 

    Ruslan, добрый день.
    у меня возникает такое странное чувство, что вы пытаетесь в Sharepoint создать функционал управления правами, который выполняет тоже самое, что делает стандартный функционал.

    Я думаю, что данную задачу можно решить на уровне распределения прав доступа к документам:
    1. создать группы уровень1, уровень2, уровень3 (вместо прописывания каждому пользователю списка необходимых прав)
    2. в настройках доступа к документу выдавать права созданным группам (вместо заполнения столбца "права доступа")


    • Изменено Mokronos 3 сентября 2012 г. 12:22
    3 сентября 2012 г. 12:22
  • Но мне надо, что бы пользователь мог установить на документ уровень доступа из выпадающего списка столбца "права доступа". А обработчик посмотрит у кого есть необходимый уровень доступа к документу. Группа не подходит так как она может меняться очень много раз, а с обработчиком будет проще.

    3 сентября 2012 г. 13:32
  • "Группа может меняться много раз" это то же самое, что и действия по добавлению-удалению прав в списке. Не думаю, что массовое редактирование данных списка или множественное назначение прав (на примере человека с нескольколькими правами) можут тягаться со стандартным разграничением прав.

    Но, если нужно сделать именно так как описано в первом сообщении, то вам поможет статья про создание Event Receiver и назначение прав. Вот еще похожий пример.

    3 сентября 2012 г. 14:45
  • А как просто задать обработчику сравнить столбец «права доступа» и если он совпадает в библиотеке у документа и в списке у пользователя, то тогда назначить этому документу права на доступ совпавшего пользователя???

    Просто я начинающий программист :)
    • Изменено Ruslan P 4 сентября 2012 г. 7:07
    4 сентября 2012 г. 6:28
  • Вам нужен готовый программный код?

    С чего вы начали? есть ли общее понимание того с чего следует начать?

    есть ли примерный набросок кода?

    1. Прочитать как работать с Event Receiver

    2. Почитать о назначении прав

    Ссылки вам скинули выше, можно еще погуглить )


    БЛОГ

    4 сентября 2012 г. 7:06
  • А есть готовый код? Я сделал обработчик событий который проверяет библиотеку и список на изменение и добавление элементов, а вот дальше на сравнении и назначении прав я застрял. :(


    4 сентября 2012 г. 7:16
  • Добрый день, готовый код есть

    public override void ItemAdded(SPItemEventProperties properties)
         {
             base.ItemAdded(properties);
    
             SPSecurity.RunWithElevatedPrivileges(() =>
             {
                 using (SPSite site = new SPSite(properties.SiteId))
                 {
                     using (SPWeb web = site.OpenWeb(properties.Web.ID))
                     {
                         SPList list = web.Lists[properties.ListId];
                         SPListItem item = list.GetItemById(properties.ListItem.ID);
    
                         //Specify that we want cuystom permssions for this list item
                         if (!item.HasUniqueRoleAssignments)
                         {
                             item.BreakRoleInheritance(true);
                         }
    
                         List<SPRoleAssignment> listRoleAssignment = new List<SPRoleAssignment>();
    
                         //Find all the administrative role assignents
                         //Remove all role assignments
                         //Add ONLY the administrative role asssigments back in
                         //Add specified user in as contributor
                         
                         while (item.RoleAssignments.Count > 0)
                         {
                             SPRoleAssignment roleAssignment = item.RoleAssignments[0];
                             foreach (SPRoleDefinition roleDefinition in roleAssignment.RoleDefinitionBindings)
                             {
                                 if (roleDefinition.Type == SPRoleType.Administrator)
                                 {
                                     listRoleAssignment.Add(roleAssignment);
                                 }
                             }
    
                             item.RoleAssignments.Remove(0);
                         }
    
                         SPUser itemOwner = item.GetSPUserFromSPFieldUser("List Item Owner");
    
                         if (itemOwner != null)
                         {
                             SPRoleAssignment roleAssignmentForUser = new SPRoleAssignment(itemOwner as SPPrincipal);
                             SPRoleDefinition roleDefinitionForUser = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
                             roleAssignmentForUser.RoleDefinitionBindings.Add(roleDefinitionForUser);
                             listRoleAssignment.Add(roleAssignmentForUser);
                         }
    
                         foreach (SPRoleAssignment addRoleAssignment in listRoleAssignment)
                         {
                             item.RoleAssignments.Add(addRoleAssignment);
                         }
    
    
                     }
    
    
                 }
             });
    
         
         }
    
    
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.SharePoint;
    
    namespace AssignCustomItemPermissions.Extensions
    {
        public static class ListExtensions
        {
    
            public static SPUser GetSPUserFromSPFieldUser(this SPListItem item, string fieldName)
            {
                SPUser itemOwner = null;
                try
                {
                    SPFieldUser itemOwnerField = (SPFieldUser)item.Fields[fieldName];
                    SPFieldUserValue user = (SPFieldUserValue)itemOwnerField.GetFieldValue(item[fieldName].ToString());
                    itemOwner = user.User;
                }
                catch { };
                return itemOwner;
    
            }
        }
    }
    
    
    

     


    LinkedIn Profile
    SharePoint Advanced Visibility Options project
    SharePoint Managed Metadata Claims Provider project

    • Помечено в качестве ответа Ruslan P 4 сентября 2012 г. 12:59
    4 сентября 2012 г. 10:44