web-dev-qa-db-fra.com

Sharepoint: vérifier si un utilisateur est membre d'un groupe

comment puis-je vérifier si un utilisateur (pas celui qui est actuellement connecté) est membre d'un certain groupe? Essayer de récupérer un utilisateur d'un groupe dont il n'est pas membre mène à une exception SPException, la vérification de null n'est donc pas possible.

Alors, comment résoudriez-vous ce problème? Pour le moment, je pense à rechercher dans le chaîne SPGroup.Users.XML le nom de l'utilisateur ou à parcourir tous les membres du groupe et à vérifier les noms de connexion.

Mise à jour: J'ai oublié de mentionner que je souhaite éviter l'utilisation de la gestion des exceptions pour vérifier l'appartenance de l'utilisateur.

15
Flo

J'ai fait cela en écrivant une méthode d'extension en utilisant LINQ. SPGroup hérite de SPPrincipal, vous devriez donc pouvoir le transmettre au paramètre 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);
}
6
Alex Angas

Créez une classe d'extension pour SPUser et une méthode statique :

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

Puis appelez cette méthode sur votre objet SPUser:

SPUser user;
SPGroup group;
//...
bool isMember = user.InGroup(group);
17
Anatoly Mironov

Deux façons. Le groupe SharePoint a une option qui permet uniquement au propriétaire du groupe de voir les détails de l'appartenance ou de permettre à tout le monde de voir les détails de l'appartenance. Si tout le monde est autorisé, vous n'obtiendrez pas la restriction de sécurité. Sinon, vous devez exécuter RunWithElevatedPrivileges et vous assurer d'obtenir une nouvelle instance de SPSite & SPWeb à l'intérieur de celle-ci.

Cela dit, voici les options:

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

    }

Une autre façon est de

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
Kusek

Avez-vous essayé d'utiliser RunWithElevatedPrivileges ?

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

J'ai mis en place un moyen simple de vérifier si un utilisateur spécifique existe dans un groupe SharePoint spécifique. Une simple déclaration avec linq sur l'objet SPUser.

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

Retrouvez le message détaillé sur SharePoint Core Solutions .

0
user21394

Pour que SPSecurity.RunWith .. fonctionne, vous devez disposer d'une nouvelle instance de l'objet SPSite et/ou SPWeb et ne pas utiliser le contexte, sinon cela ne fonctionnera pas.

Avez-vous l'objet SPUser à utiliser? Si tel est le cas, vous pouvez simplement utiliser la collection SPUser.Groups.

0
Robin Meuré