2009-06-30 15 views
15

Wie kann ich überprüfen, ob ein Benutzer (nicht der derzeit angemeldete) Mitglied einer bestimmten Gruppe ist? Der Versuch, einen Benutzer aus einer Gruppe, zu der er kein Mitglied ist, abzurufen, führt zu einer SPException, sodass eine Überprüfung auf null nicht möglich ist.Sharepoint: Überprüfen, ob ein Benutzer Mitglied einer Gruppe ist

Also, wie würdest du dieses Problem lösen. Im Moment denke ich darüber nach, in der SPGroup.Users.XML-Zeichenfolge nach dem Benutzernamen zu suchen oder über alle Gruppenmitglieder zu iterieren und die Login-Namen zu überprüfen.

Update: Ich habe vergessen zu erwähnen, dass ich die Verwendung der Ausnahmebehandlung vermeiden möchte, um die Mitgliedschaft des Benutzers zu überprüfen.

Antwort

6

Ich habe dies getan, indem ich eine Erweiterungsmethode mit LINQ geschrieben habe. SPGroup erbt von SPPrincipal so sollten Sie in der Lage sein, es zu dem principal Parameter durchlaufen:

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); 
} 
+0

Danke für Ihre Lösung. Obwohl ich nicht sicher war, was Sie mit "SPrac" meinen, schrieb ich eine Erweiterungsmethode für die SPGroup-Klasse, die die SPGroup.Users.Xml-Eigenschaft für die Anmeldung eines Benutzers überprüft. – Flo

+0

Sorry, finden und ersetzen gegangen schief. Jetzt behoben. –

1

Haben Sie versucht, RunWithElevatedPrivileges zu verwenden?

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

Nein, das ändert nichts. Der Indexer löst immer noch eine Ausnahme aus. – Flo

+3

Dies sollte ein Kommentar sein und nicht beantworten ... Sie haben mit einer anderen Frage "geantwortet". – trgraglia

4

Ein paar Wege. Die SharePoint-Gruppe verfügt über eine Option, mit der nur der Gruppeneigentümer die Mitgliedschaftsdetails anzeigen oder jedem die Mitgliedschaftsdetails anzeigen kann. Wenn jeder erlaubt ist, erhalten Sie nicht die Sicherheitseinschränkung, ansonsten müssen Sie RunWithElevatedPrivileges ausführen und sicherstellen, dass eine neue Instanz der SPSite & SPWeb dazu verwendet wird.

Sein sagte, unten sind die Optionen:

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

    } 

Ein anderer Weg ist zu

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

Bitte beachten Sie, dass die AllUsers-Sammlung das Mitglied möglicherweise nur enthält, wenn der Benutzer die Website durchsucht hat. –

+0

Warum nicht einfach oUser.ID anstelle von UserToken verwenden? – Chaulky

0

Um die SPSecurity.RunWith zu machen .. Arbeit, müssen Sie eine neue Instanz haben das SPSite- und/oder SPWeb-Objekt und nicht den Kontext, sonst wird es nicht funktionieren.

Haben Sie das SPUser-Objekt zu verwenden? In diesem Fall können Sie einfach die SPUser.Groups-Auflistung verwenden.

17

ein erstellen 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); 
     } 
    } 
} 

Dann diese Methode auf das SPUser Objekt aufrufen:

SPUser user; 
SPGroup group; 
//... 
bool isMember = user.InGroup(group); 
0

Ich habe eine einfache Möglichkeit implementiert, um zu überprüfen, ob ein bestimmter Benutzer in einer bestimmten SharePoint-Gruppe existiert. Eine einfache Anweisung mit linq im SPUser-Objekt.

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

Finden Sie die detaillierte Beitrag auf SharePoint Core Solutions.

Verwandte Themen