在SharePoint 2010中以编程方式更改组的权限级别?

时间:2011-04-07 07:25:27

标签: sharepoint sharepoint-2010

我想遍历网站集中的所有网站,并更改某个网站的权限。

我的代码是:

        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 个答案:

答案 0 :(得分:1)

我会尝试SPWeb.Update,然后

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

另外,不要忘记在foreach循环中打开的所有SPWeb.Dispose上执行AllWebs

答案 1 :(得分:1)

如果您在功能中使用此代码,请确保使用Web级别功能。不要在站点级别功能中循环遍历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;
}

在所需网站中激活此功能以应用权限。

答案 2 :(得分:0)

我不确定问题是什么。 但可能会发生DLL没有更新。它发生在我身上好几次。 尝试从x:/ windows / assembly中删除DLL,然后重新部署解决方案以查看行为是否有任何更改。 同时尝试在此之前提交更改(我确定您已经尝试过)

此致

佩德罗