Изменить уровень разрешений для групп программно в SharePoint 2010? - PullRequest
3 голосов
/ 07 апреля 2011

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

Мой код:

        SPSite oSiteCollection = SPContext.Current.Site;
        SPWebCollection collWebsite = oSiteCollection.AllWebs;
        foreach (SPWeb web in collWebsite)
        {
            web.AllowUnsafeUpdates = true;

            if (web.Name == "SiteName")
            {
                web.BreakRoleInheritance(true);

                string[] groups = new string[2] { "Group1", "Group2" };

                foreach (string item in groups)
                {
                    SPGroup removeGroup = web.SiteGroups[item];
                    web.RoleAssignments.Remove(removeGroup);

                    SPGroup addGroup = web.SiteGroups[item];
                    SPRoleDefinition roleDefinition = web.RoleDefinitions["Read"];
                    SPRoleAssignment roleAssignment = new SPRoleAssignment(addGroup);
                    roleAssignment.RoleDefinitionBindings.Add(roleDefinition);
                    web.RoleAssignments.Add(roleAssignment);
                }
            }

        }

, но выдает ошибку

Error changing permissions, details: There are uncommitted changes on the SPWeb object, call SPWeb.Update() to commit the changes before calling this method.

Код работает просто отлично, если я хочу сделать то же самое, но для списков вместо

            SPListCollection collList = web.Lists;

            foreach (SPList oList in collList)
            {
                //and so on

Я пытался поместить web.Update () в разные места, но безуспешно.Есть идеи?

Заранее спасибо.

Редактировать:

Я прокомментировал большую часть материала и оставил только

        if (web.Name == "SiteName")
        {
            web.BreakRoleInheritance(true);
            web.Update();
        }

но все равно выдает ту же ошибку.

Ответы [ 3 ]

1 голос
/ 18 февраля 2013

Я бы попытался сделать SPWeb.Update, а затем

using(var newWeb = site.OpenWeb(web.ID))
{
    web.BreakRoleInheritance(true);
    web.Update();
}

Кроме того, не забудьте сделать SPWeb.Dispose для всех AllWebs, открытых в цикле foreach.

1 голос
/ 18 марта 2014

Если вы используете этот код в функции, убедитесь, что вы используете функцию веб-уровня. Не просматривайте AllWebs на уровне сайта.

Измените область действия функции на Web и попробуйте следующий код

using (SPWeb oWeb = SPContext.Current.Web)
{
    web.AllowUnsafeUpdates = true;
    web.BreakRoleInheritance(true);

    string[] groups = new string[2] { "Group1", "Group2" };

    foreach (string item in groups)
    {
        SPGroup removeGroup = web.SiteGroups[item];
        web.RoleAssignments.Remove(removeGroup);

        SPGroup addGroup = web.SiteGroups[item];
        SPRoleDefinition roleDefinition = web.RoleDefinitions["Read"];
        SPRoleAssignment roleAssignment = new SPRoleAssignment(addGroup);
        roleAssignment.RoleDefinitionBindings.Add(roleDefinition);
        web.RoleAssignments.Add(roleAssignment);
    }
    web.AllowUnsafeUpdates = false;
}

Активируйте эту функцию на необходимом веб-сайте, чтобы применить разрешения.

0 голосов
/ 27 июня 2012

Я не уверен, в чем проблема.Но может случиться так, что DLL не обновляется.Это случилось со мной несколько раз.Попробуйте удалить DLL из x: / windows / assembly, а затем повторно развернуть решение, чтобы увидеть, есть ли какие-либо изменения в поведении.Также попробуйте зафиксировать изменения до этого (я уверен, что вы уже пробовали это)

С уважением,

Педро

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...