2011-08-30 3 views

Odpowiedz

30

Jeśli korzystasz z .NET 3.5 lub nowszego, powinieneś sprawdzić przestrzeń nazw System.DirectoryServices.AccountManagement (S.DS.AM). Przeczytać o tym tutaj:

Zasadniczo, można określić kontekst domeny i łatwo znaleźć użytkowników i/lub grupy w AD:

// set up domain context 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 

// find the group in question 
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "YourGroupNameHere"); 

// if found.... 
if (group != null) 
{ 
    // iterate over members 
    foreach (Principal p in group.GetMembers()) 
    { 
     Console.WriteLine("{0}: {1}", p.StructuralObjectClass, p.DisplayName); 

     // do whatever you need to do to those members 
     UserPrincipal theUser = p as UserPrincipal; 

     if(theUser != null) 
     { 
      if(theUser.IsAccountLockedOut()) 
      { 
       ... 
      } 
      else 
      { 
       ... 
      } 
     } 
    } 
} 

nowy S.DS.AM ułatwia zabawę z użytkownikami i grupami w AD!

+0

Dzięki, sprawdzę to. –

+2

Uwaga dla każdego, kto tego używa: to nie działa z członkami grup przechodnich, tj. Jeśli grupa B jest członkiem grupy A, a użytkownik C jest członkiem grupy B, użytkownik C nie pojawi się w wynikach. –

+0

Gdzie podać domenę, nazwę użytkownika i pswd? – Shesha

1

Proszę, wypróbuj poniższy kod. używa on Search Filter Syntax, aby uzyskać to, co chcesz, w jednym zapytaniu LDAP i rekursywnie. Interesujące jest to, że zapytanie jest wykonywane na serwerze. Nie jestem pewien, czy jest szybszy niż rozwiązanie @marc_s, ale istnieje i działa na platformie .NET 2.0 (początek W2K3 SP2).

string sFromWhere = "LDAP://WM2008R2ENT:389/dc=dom,dc=fr"; 
DirectoryEntry deBase = new DirectoryEntry(sFromWhere, "dom\\jpb", "test.2011"); 

/* To find all the users member of groups "Grp1" : 
* Set the base to the groups container DN; for example root DN (dc=societe,dc=fr) 
* Set the scope to subtree 
* Use the following filter : 
* (member:1.2.840.113556.1.4.1941:=CN=Grp1,OU=MonOu,DC=X) 
* coupled with LDAP_MATCHING_RULE_BIT_AND on userAccountControl with ACCOUNTDISABLE 
*/ 
DirectorySearcher dsLookFor = new DirectorySearcher(deBase); 
dsLookFor.Filter = "(&(memberof:1.2.840.113556.1.4.1941:=CN=MonGrpSec,OU=MonOu,DC=dom,DC=fr)(userAccountControl:1.2.840.113556.1.4.803:=2))"; 
dsLookFor.SearchScope = SearchScope.Subtree; 
dsLookFor.PropertiesToLoad.Add("cn"); 

SearchResultCollection srcUsers = dsLookFor.FindAll(); 

/* Just to know if user is present in an other group 
*/ 
foreach (SearchResult srcUser in srcUsers) 
{ 
    Console.WriteLine("{0}", srcUser.Path); 
}