2009-06-30 124 views
15

如何检查用户(而不是当前登录的用户)是否为某个组的成员?试图从他不是成员的组中检索用户会导致SPException,因此检查null是不可能的。Sharepoint:检查用户是否为组的成员

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

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

回答

6

我已经通过使用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); 
} 
1

您是否尝试过使用RunWithElevatedPrivileges

SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
      //put your code here to get the group and test for the user 
     }); 
+0

不,这不会改变任何东西。索引器仍然会引发异常。 – Flo 2009-06-30 15:00:30

+3

这应该是一个评论,而不是回答...你'回答'与另一个问题。 – trgraglia 2011-10-27 12:52:59

4

几种方法。 SharePoint组具有一个选项,只允许组所有者查看成员详细信息或允许每个人查看成员详细信息。如果每个人都被允许,你不会得到安全限制,否则你需要RunWithElevatedPrivileges,并且一定要得到一个SPSite的新实例。

虽这么说,下面是选项:

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; 

    } 
+2

请注意,AllUsers集合可能不包含成员,除非用户浏览了该网站。 – 2009-10-06 21:14:05

0

为了使SPSecurity.RunWith ..工作,你需要有一个新的实例SPSite和/或SPWeb对象,并且不使用上下文,否则它将不起作用。

您是否有要使用的SPUser对象?如果是这样,您可以使用SPUser.Groups集合。

17

创建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); 
0

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

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

查找SharePoint Core Solutions的详细帖子。

相关问题