首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SharePoint RoleAssignment不会添加

SharePoint RoleAssignment不会添加
EN

Stack Overflow用户
提问于 2011-10-19 21:50:48
回答 2查看 2.1K关注 0票数 1

我试图操作文档库中文件夹的SPListItem权限,但我似乎无法添加任何新权限,尽管删除安全性继承非常有效。

为了测试目的,我已经尽力创建了一个精简的代码版本。函数GetListItem根据URL返回我们正在使用的SPListItem。item.BreakRoleInheritance(False)工作得很好,我已经验证了正确地破坏继承和清除任何权限,我还使用True标志进行了尝试,并验证了所有原始权限都是从父级复制的。

下面的代码不会抛出任何异常,据我所知,在我检查文档库中文件夹的实际权限并没有列出“查看器”之前,它似乎运行良好。

代码:

代码语言:javascript
复制
    Dim item As SPListItem = GetListItem(URL)

    If item Is Nothing Then
        Exit Sub
    End If

    Dim spGrp = SharePointWeb.SiteGroups("Viewers")
    Dim spRole As SPRoleDefinition = SharePointWeb.RoleDefinitions("Read")

    Dim roleAssignment As New SPRoleAssignment(spGrp)
    roleAssignment.RoleDefinitionBindings.Add(spRole)

    SharePointWeb.AllowUnsafeUpdates = True

    item.BreakRoleInheritance(False)
    item.RoleAssignments.Add(roleAssignment)
    item.Update()

    SharePointWeb.AllowUnsafeUpdates = False

我尝试过用调用SPSecurity.RunWithElevatedPrivileges来包装这段代码,但没有产生任何区别。我的SPSite/SPWeb对象的创建封装在对SPSecurity.RunWithElevatedPrivileges的调用中,而且我还有其他运行的代码,它在文件夹/等等上查找/删除/更新属性。使用此现有代码;只是权限不想工作。

参考文献:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-21 13:57:36

通过对这个问题的研究,并尝试对不同的方法进行验证,我遇到了一个异常,即SPWebEnsureSPControl中发生的“操作由于对象的当前状态而无效”。

我做了一些谷歌,并发现这个论坛帖子http://social.msdn.microsoft.com/forums/en-US/sharepointdevelopment/thread/32869ac6-4f47-46b8-accf-f56966ac9581,引导我修改我的代码。在调用System.Web.HttpContext.Current = Nothing之后,我将SPSecurity.RunWithElevatedPrivileges作为第一行代码,一切都开始工作了。

因此,我的代码看起来类似于(使用非命名委托):

代码语言:javascript
复制
    SPSecurity.RunWithElevatedPrivileges(Sub()
                                             System.Web.HttpContext.Current = Nothing
                                             ........
                                         End Sub)

根据我所读到的,System.Web.HttpContext.Current仍然可以连接到您的非高架帐户,通过将其设置为null,可以解决问题。

票数 0
EN

Stack Overflow用户

发布于 2011-11-02 12:17:55

像这样试试。如果由于权限的原因,这些方法仍然有问题,请不要使用提升的私密性,而是使用模拟。为此,我在权限方法下面发布了一个方法:

代码语言:javascript
复制
 public static void SetPermissions(SPListItem item, IEnumerable<SPPrincipal> principals)
        {
            try
            {
                if (item != null)
                {
                    foreach (SPPrincipal principal in principals)
                    {
                        SPRoleDefinition roleDefinition = item.Web.RoleDefinitions[Constants.SiteCollection.SecurityTypeNames.contribute];
                        SetPermissions(item, principal, roleDefinition);
                    }
                }
            }
            catch (SPException exc)
            {
                //catch exception
            }
        }

        /// <summary>
        /// setpermissions method for one group
        /// </summary>
        /// <param name="item"></param>
        /// <param name="principal"></param>
        /// <param name="roleType"></param>
        public static void SetPermissions(SPListItem item, SPPrincipal principal)
        {
            if (item != null)
            {
                SPRoleDefinition roleDefinition = item.Web.RoleDefinitions[Constants.SiteCollection.SecurityTypeNames.contribute];
                SetPermissions(item, principal, roleDefinition);
            }
        }

        /// <summary>
        /// permission setting method used by previous two setpermissions method
        /// </summary>
        /// <param name="item"></param>
        /// <param name="principal"></param>
        /// <param name="roleDefinition"></param>
        public static void SetPermissions(SPListItem item, SPPrincipal principal, SPRoleDefinition roleDefinition)
        {

            if (item != null)
            {
                item.Web.AllowUnsafeUpdates = true;

                SPRoleAssignment roleAssignment = new SPRoleAssignment(principal);
                roleAssignment.RoleDefinitionBindings.Add(roleDefinition);
                item.RoleAssignments.Add(roleAssignment);

                item.Web.AllowUnsafeUpdates = false;
            }

        }

模拟方法:

代码语言:javascript
复制
public static SPWeb GetImpersonatedWeb(SPSite impSite, string impWebUrl)
        {
        ILogger logger = SharePointServiceLocator.GetCurrent().GetInstance<ILogger>();

        try
        {
            SPUserToken systoken = impSite.SystemAccount.UserToken;
            using (SPSite site = new SPSite(impSite.Url, systoken))
            {
                SPWeb web = site.AllWebs[GetServerRelUrlFromFullUrl(impWebUrl)];
                return web;
            }
        }
        catch (SPException exc)
        {
            //catch exception
        }
    }

    public static SPSite GetImpersonatedSite()
    {
        try
        {
            SPSite impSite = SPContext.Current.Site;

            SPUserToken systoken = impSite.SystemAccount.UserToken;
            SPSite site = new SPSite(impSite.Url, systoken);
            return site;
        }
        catch (SPException exc)
        {
            //catch exception
        }
    }

public static string GetServerRelUrlFromFullUrl(string url)
        {
        int index = url.IndexOf("//");
        if ((index < 0) || (index == (url.Length - 2)))
        {
            throw new ArgumentException();
        }
        int startIndex = url.IndexOf('/', index + 2);
        if (startIndex < 0)
        {
            return "/";
        }
        string str = url.Substring(startIndex);
        if (str.IndexOf("?") >= 0)
            str = str.Substring(0, str.IndexOf("?"));

        if (str.IndexOf(".aspx") > 0)
            str = str.Substring(0, str.LastIndexOf("/"));

        if ((str.Length > 1) && (str[str.Length - 1] == '/'))
        {
            return str.Substring(0, str.Length - 1);
        }
        return str;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7828646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档