代码之家  ›  专栏  ›  技术社区  ›  Flo

SharePoint:检查用户是否为组的成员

  •  15
  • Flo  · 技术社区  · 15 年前

    如何检查用户(不是当前登录的用户)是否是某个组的成员?如果试图从一个用户组(该用户组不是其成员)中检索用户,则会导致异常,因此无法检查空值。

    那么你如何解决这个问题呢?目前,我考虑在spgroup.user s.xml字符串中搜索用户名,或者遍历所有组成员并检查登录名。

    更新: 我忘记提到我想避免使用异常处理来检查用户的成员资格。

    6 回复  |  直到 7 年前
        1
  •  6
  •   Alex Angas    15 年前

    我通过使用LINQ编写一个扩展方法来实现这一点。SPGroup继承自SPPrincipal,因此您应该能够将其传递给 principal 参数:

    public static bool Contains(this SPRoleAssignmentCollection rac, SPPrincipal principal)
    {
        XElement racXml = XElement.Parse(rac.Xml);
        return racXml.Elements("permission").Any(vw => (int)vw.Attribute("memberid") == principal.ID);
    }
    
        2
  •  17
  •   Anatoly Mironov    13 年前

    创建一个 Extension class for SPUser and static method :

    public static class SPUserExtension {
       public static bool InGroup(this SPUser user, SPGroup group)
          {
            return user.Groups.Cast<SPGroup>()
              .Any(g => g.ID == group.ID);
          }
       }
    }
    

    然后对spuser对象调用此方法:

    SPUser user;
    SPGroup group;
    //...
    bool isMember = user.InGroup(group);
    
        3
  •  4
  •   Alex Angas    15 年前

    两种方式。SharePoint组有一个选项,该选项只能允许组所有者查看成员身份详细信息或允许所有人查看成员身份详细信息。如果每一个都被允许,您将无法获得安全限制,否则您需要使用提升的特权运行,并确保在其中使用spsite&spweb的新实例。

    有人说,以下是选择:

    private Boolean isUserInGroup(SPGroup oGroupToTestFor,String sUserLoginName)
        {   
            Boolean bUserIsInGroup = false;
            try
            {
                SPUser x = oGroupToTestFor.Users[sUserLoginName];
                bUserIsInGroup = true;
            }
            catch (SPException)
            {
                bUserIsInGroup = false;
            }
            return bUserIsInGroup;
    
        }
    

    另一种方法是

    private Boolean isUserInGroup(SPGroup oGroupToTestFor, String sUserLoginName)
        {   
            Boolean bUserIsInGroup = false;
    
                SPUser oUser =null;
                try{
                    oUser = SPContext.Current.Web.AllUsers[sUserLoginName];
                    }
                catch{}
                if(oUser!=null){
                foreach (SPUser item in oGroupToTestFor.Users)
                {
                    if (item.UserToken == oUser.UserToken)
                    {
                        bUserIsInGroup = true;
                        break;
                    }                    
                }
                }
    
            return bUserIsInGroup;
    
        }
    
        4
  •  1
  •   cjuk    15 年前

    你试过用吗 RunWithElevatedPrivileges ?

    SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                 //put your code here to get the group and test for the user
            });
    
        5
  •  0
  •   Robin Meuré    15 年前

    为了使spsecurity.runwith..工作时,您需要有一个spsite和/或spweb对象的新实例,并且不要使用上下文,否则它将无法工作。

    您有要使用的spuser对象吗?如果是这样,您可以使用spuser.groups集合。

        6
  •  0
  •   user21394    11 年前

    我实现了一种简单的方法来检查特定的用户是否存在于特定的SharePoint组中。对spuser对象使用linq的简单语句。

    bool userExsists = spUser.Groups.Cast<SPGroup>().Any(g => g.Name.ToLower() == spGroup.Name.ToLower());
    

    在上找到详细的帖子 SharePoint Core Solutions .