none
Не могу изменить уровни разрешений для группы пользователей RRS feed

  • Вопрос

  • Добрый день!

    Никак не могу изменить разрешения для группы пользователей. Что я хочу сделать:

    Есть список заявок. Есть группы пользователей. Пользователь из группы А может создать только 1 заявку. Я делаю ресивер на Added, который определяет по пользователю группу и меняет уровень разрешения. (для теста меняю на "чтение").

    SPSecurity.RunWithElevatedPrivileges(delegate()
               {
                   using (SPSite site = new SPSite("http://mysite/mycollection"))
                   {  using (SPWeb web = site.OpenWeb())
                   {
                       SPList list = web.Lists["Мой список"];

                       if (list.Title == "Название списка")
                       {

    //получаю пользователя из поля "Кем создано"

                          var field = properties.ListItem[SPBuiltInFieldId.Author] as string;
                           var userName = field.Split('#')[1];
                           SPUser user = properties.Web.EnsureUser(userName);
    //узнаю его группу
                           SPGroupCollection groupColl = user.Groups;

                           web.AllowUnsafeUpdates = true;

                           SPRoleAssignmentCollection roleAssignments = properties.Web.RoleAssignments;

                           SPRoleAssignment roleAssignment = new SPRoleAssignment(groupColl[0]);
                           SPRoleDefinition roleDefinition = web.RoleDefinitions.GetByType(SPRoleType.Reader);
                           roleAssignment.RoleDefinitionBindings.Add(roleDefinition);
                           roleAssignments.Add(roleAssignment);
                           list.BreakRoleInheritance(true);
                           list.RoleAssignments.Add(roleAssignment);
                           list.Update();
                       }
                       }
                   }
               });
                base.ItemAdded(properties);

    Эксепшен вылетает на  roleAssignments.Add(roleAssignment) с формулировкой, что операция не может быть выполнена.

    На многих форумах находил именно такую реализацию, но у меня не работает :(
    Еще не могу понять: создание элемента инициирую от пользователя user1, а метод пытается выполниться и от user1 и от sp_admin. Почему так??

    Подскажите пожалуйста! Я - новичок, возможно, что-то упустил.

    1 октября 2015 г. 9:34

Ответы

  • Спасибо за ответы - разобрался, кажется. Проблема была в том, что веб нужно было получать заново и работать с его списками , юзерами и разрешениями, а не с полученными от properties. 

    http://blogs.msdn.com/b/sasohail/archive/2010/10/31/access-denied-within-spsecurity-runwithelevatedprivileges.aspx - похожий пример и его решение

    • Помечено в качестве ответа Ivan.T 7 октября 2015 г. 14:05
    7 октября 2015 г. 14:05
  • Добрый день,

    при имперсонализации site и web всегда необходимо переоткрывать!

    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
     using (SPSite site = new SPSite("http://mysite/mycollection"))
    {
       using (SPWeb web = site.OpenWeb())
       {
         \\ делаем
       }
    }

    • Помечено в качестве ответа Ivan.T 8 октября 2015 г. 12:36
    8 октября 2015 г. 9:57

Все ответы

  • Добрый день,

    list.BreakRoleInheritance(true); // !
    SPRoleAssignment roleAssignment = new SPRoleAssignment((SPPrincipal)groupColl[0]);
    SPRoleDefinition roleDefinition = web.RoleDefinitions.GetByType(SPRoleType.Reader);
    roleAssignment.RoleDefinitionBindings.Add(roleDefinition);roleAssignments.Add(roleAssignment);
    list.RoleAssignments.Add(roleAssignment);
    list.Update();

    1 октября 2015 г. 9:47
  • а метод пытается выполниться и от user1 и от sp_admin

    Проверьте значение пользователя внутри RunWithElevatedPrivileges:

    SPUser user = web.CurrentUser;

    Должен быть sp_admin, текущего получаем из properties.Web.CurrentUser.

    1 октября 2015 г. 9:54
  • Не помогло :( 
    2 октября 2015 г. 13:49
  • У вас ошибка - нет доступа на данную операцию. Почему-то код не поднимает привилегии.
    5 октября 2015 г. 1:57
  • Спасибо за ответы - разобрался, кажется. Проблема была в том, что веб нужно было получать заново и работать с его списками , юзерами и разрешениями, а не с полученными от properties. 

    http://blogs.msdn.com/b/sasohail/archive/2010/10/31/access-denied-within-spsecurity-runwithelevatedprivileges.aspx - похожий пример и его решение

    • Помечено в качестве ответа Ivan.T 7 октября 2015 г. 14:05
    7 октября 2015 г. 14:05
  • Добрый день,

    при имперсонализации site и web всегда необходимо переоткрывать!

    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
     using (SPSite site = new SPSite("http://mysite/mycollection"))
    {
       using (SPWeb web = site.OpenWeb())
       {
         \\ делаем
       }
    }

    • Помечено в качестве ответа Ivan.T 8 октября 2015 г. 12:36
    8 октября 2015 г. 9:57