C# - 如何为子网站下的用户设置SharePoint权限而不是根级别

时间:2011-08-31 07:04:09

标签: c# sharepoint permissions

我正在尝试为SharePoint中的子网站下的用户添加权限。我能够在根级别成功设置用户的权限,但我不知道如何解决较低级别子网站的问题。下面是我现在所拥有的但它崩溃了虽然它没有显示VS中的错误构建。任何想法都会很棒

        foreach (SPWeb subSite in spSite2.RootWeb.GetSubwebsForCurrentUser())
        {
            if (subSite.Name == "templates")
            {
                Console.WriteLine("\nTEMPLATES SITE");
                Console.Write("\nApplying 'Read' permission to App_user Account");
                spRoleAssignment = new SPRoleAssignment(SPContext.Current.Web.Users[appUserAccount]);
                spRoleAssignment.RoleDefinitionBindings.Add(SPContext.Current.Web.RoleDefinitions["Read"]);
                SPContext.Current.Web.RoleAssignments.Add(spRoleAssignment);
                SPContext.Current.Web.Update();
                Console.ForegroundColor = ConsoleColor.Green;
                Console.CursorLeft = Console.BufferWidth - 16; Console.WriteLine("Applied");
                Console.ForegroundColor = ConsoleColor.Gray;
            }
        }

2 个答案:

答案 0 :(得分:1)

我不完全确定您要实现的目标,也不确定您的代码应该在何处执行(控制台应用程序或计时器作业或Web部件?)。

我看到以下问题:

  1. 您登录到控制台(让我假设您的代码在控制台应用程序中运行),但您访问SPContext.Current,这只有在您的代码在HTTP请求中运行时才可用。

  2. 您正在迭代一组网络。但是在你的每个机构中,SPContext.Current.Web都会更新。

  3. 您可以通过web.GetSubwebsForCurrentUser()检索您的网络集,但随后会更改这些对象的权限。这有点气味,因为更新权限是“管理任务”,方法GetSubwebsForCurrentUser更有可能用于低级用户上下文以避免访问被拒绝的异常。例如,要安全地显示网络列表。

  4. 您确实更新了网络上的权限/角色,但检查网络是否具有唯一的角色分配。

  5. 您检查名为“templates”的网站。由于GetSubwebsForCurrentUser不是递归的,因此此集合中只能有一个名为“templates”的Web。这个网站可以打开direclty =>不需要通过打开每个子网来浪费资源。

  6. 如果您的任务是在给定的网络“模板”(这是您的根网站的第一级子网站)上设置角色权限,您可以使用以下代码:

    // Open the web directly since it is a direct child of the site collection.
    // Use a using to properly release the resources
    using (SPWeb web = spSite2.Open("templates"))
    {
      SPUser user = web.SiteUsers[appUserAccount];
      SPRoleDefinition roleDef = web.RoleDefinitions.GetByType(SPRoleType.Reader);
    
      if (!web.HasUniqueRoleAssignments)
      {
        web.BreakRoleInheritance(true);
      }
    
      spRoleAssignment = new SPRoleAssignment(user);
      spRoleAssignment.RoleDefinitionBindings.Add(roleDef);
      web.RoleAssignments.Add(spRoleAssignment);
    
      // No need to update the web when changing the permissions
    }
    

答案 1 :(得分:0)

尝试更新subSite中的角色,而不是来自SPContext的当前网页?

AFAIK每个SPWeb对象都有自己的角色分配。