2016-04-04 12 views
1

Ich habe einige Codes zu überprüfen, ob ein Domain-Benutzer ein Mitglied der Maschinen Gruppe Administratoren:Langsam AD-Gruppenmitgliedschaft Lookup

public static bool ActiveDirectoryGroupMembershipOk(string userid, string groupName) 
{ 
    using (PrincipalContext ctx = new PrincipalContext(ContextType.Machine, "my_pc_name")) 
    { 
     using (GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "administrators")) 
     { 
      if (grp != null) 
      { 
       foreach (Principal p in grp.GetMembers(false)) 
       { 
        if (p is UserPrincipal && p.SamAccountName.Equals(userid, StringComparison.InvariantCultureIgnoreCase)) 
        { 
         return true; 
        } 
       } 
      } 
     } 
    } 
    return false; 
} 

Es funktioniert, aber die folgende Code-Zeile dauert einige Sekunden dauern:

using (GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "administrators")) 

Gibt es einen schnelleren Weg, die Mitgliedschaft zu suchen?

Ich weiß nicht, ob es wichtig ist oder nicht, aber die Benutzer-ID ist ein Domänenbenutzer und die Windows-Gruppe ist auf dem lokalen PC.

+0

AD in meiner Erfahrung ist immer langsam, so neigen ich dazu, die Ergebnisse zwischenzuspeichern. In Ihrem Fall würde ich eine globale Variable der Klasse grp verwenden und FindByidentity nur einmal anrufen – Pikoh

+0

Ich mache das pro Benutzer. So ist es meine erste Bitte, das ist langsam. Ich habe gerade einen anderen Beitrag gelesen, in dem ich die Mitgliedschaften des Benutzers und nicht die Mitglieder einer Gruppe betrachte - und das könnte schneller sein. [Link] (http://stackoverflow.com/questions/1675813/faster-way-to-find-out-if-a-user-exists-on-a-system) Aber ich konnte diesen Code nicht funktionieren. –

Antwort

0

Ich fand, dass es schneller scheint, den Benutzer nicht in einer Gruppe nachzuschlagen, sondern stattdessen die Rollenmitgliedschaft des Benutzers zu überprüfen.

Hier ist der Code, der in meiner Frage schneller als der Code ausführt:

public static bool ActiveDirectoryGroupMembershipOk(string userid, string groupName) 
{ 
    bool membershipOk = false; 
    using (var pc = new PrincipalContext(ContextType.Machine, "my_pc_name")) 
    { 
     using (var p = Principal.FindByIdentity(pc, IdentityType.SamAccountName, userid)) 
     { 
      // if user account exists, check the group membership 
      if(p != null) 
      { 
       System.Security.Principal.WindowsIdentity wi = new System.Security.Principal.WindowsIdentity(userid); 
       System.Security.Principal.WindowsPrincipal wp = new System.Security.Principal.WindowsPrincipal(wi); 
       membershipOk = wp.IsInRole(groupName); 
      } 
     } 
    } 
    return membershipOk; 
} 
0

ich einen besseren Weg gefunden, dies noch zu tun (eine AD-Domäne angenommen wird), von Mr. Blonder Antwort unter Verwendung eines Teils:

public static bool ActiveDirectoryGroupMembershipOk(String userid, String groupname) 
{ 
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 
    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, userid); 
    GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, groupname); 

    return user.IsMemberOf(group); 
}