2009-02-04 6 views
19

Ich habe Code, der für alle Benutzer in einer Abteilung sucht:Get Liste der Benutzer aus Active Directory in einer bestimmten AD-Gruppe

string Department = "Billing"; 
DirectorySearcher LdapSearcher = new DirectorySearcher(); 
LdapSearcher.PropertiesToLoad.Add("displayName"); 
LdapSearcher.PropertiesToLoad.Add("cn"); 
LdapSearcher.PropertiesToLoad.Add("department"); 
LdapSearcher.PropertiesToLoad.Add("title"); 
LdapSearcher.PropertiesToLoad.Add("memberOf"); 
LdapSearcher.Filter = string.Format("(&(objectClass=user)(department={0}))", Department); 
SearchResultCollection src = LdapSearcher.FindAll(); 

Was müßte der Filter aussehen, wenn ich wollte nur jeder in den " Manager Nur lesen "AD Gruppe?

Gehe ich das alles falsch?

Antwort

34

Mit Blick auf Ihre Suche habe ich ein paar Punkte für Sie. Zuerst verwendet die Suche objectClass (nicht indiziert) anstelle von objectCategory (indiziert). Großes Leistungsproblem bei dieser Abfrage Sie würden wollen die meisten immer die beiden zusammen zu kombinieren, je nachdem, was Sie versuchen, abzurufen:

(&(objectCategory=person)(objectClass=user)) = All users (no contacts) 
(&(objectCategory=person)(objectClass=contact)) = All contacts (no users) 
(&(objectCategory=person)) = All users and contacts 

Was suchen die Benutzer in einer Gruppe auf die Liste der Mitgliedsobjekte der spezifischen Gruppe aufzählen kann. Im Mitgliederattribut des Gruppenobjekts ist der distinguishedName jedes Benutzers.

This article describes enumerating members of a group...

Vergessen Sie nicht, dass Sie verschachtelte Gruppen von der übergeordneten Gruppe behandeln müssen können, da es keine Standardmethode behandeln dies mit LDAP-Abfragen ist. Dazu müssen Sie möglicherweise auswerten, ob das Elementobjekt eine Gruppe ist, und dann das Elementattribut für diese untergeordnete Gruppe abrufen.

Schließlich sollten Sie sich angewöhnen, Ihrer Abfrage ein DNS Präfix zu geben.

Ohne DNS-Präfix:

LDAP://ou=ouname,dc=domain,dc=com 

Mit DNS-Präfix (alle drei Arbeits):

LDAP://servername/ou=ouname,dc=domain,dc=com 
LDAP://servername.domain.com/ou=ouname,dc=domain,dc=com 
LDAP://domain.com/ou=ouname,dc=domain,dc=com 

Eine einzelne Domain wird Sie nicht viel Problem verursachen, aber wenn Sie versuchen, und führen Sie eine Suche in Eine Multidomain-Umgebung wird ohne diesen Zusatz gebissen. Hoffe, das hilft dir, dich deinem Ziel näher zu bringen.

+0

Das war eine sehr nachdenkliche Antwort. – wcm

+0

Das Hinzufügen von (objectCategory = person) hat die Suche merklich beschleunigt. Danke vielmals. – wcm

+0

Falsch. Im Mitgliederattribut des Gruppenobjekts ist der distinguishedName jedes Benutzers OR ANDERE ** GROUP ** NAME ... –

10

Ich habe immer gefunden Howto: (Almost) Everything In Active Directory via C# hilft für die meisten AD Fragen.

+2

Dies ist ein wirklich umfassender Artikel, aber ich diese nicht ausdrücklich finden. Das heißt nicht, dass es nicht da ist, sondern dass ich es nicht sehen kann. Ich jongliere gerade ein Dutzend Dinge ... – wcm

+0

Dieser Link ist kaputt. Ich denke, das ist, was jetzt verwendet werden sollte http://www.codeproject.com/Articles/90142/Everything-in-Active-Directory-via-C-NET-Using – Ju66ernaut

+0

Auch http://www.codeproject.com/ Artikel/18102/Howto-Fast-Alles-In-Active-Directory-via-C – nzpcmad

6

Wenn Sie den AD-Pfad zu der Gruppe bereits kennen, wäre es wahrscheinlich einfacher, einen DirectoryEntry dafür zu öffnen, und von dort aus einen DirectorySearcher auszuführen.

Es gibt auch eine Markierung auf dem Searcher für, ob zu Subcontainern zu bohren, ich vergesse den Namen von Hand.

+0

Das wäre für die AD-Gruppe FooBar? (Entschuldigung, ich bin ein bisschen neu in diesem Zeug) – wcm

+0

Ja.Alles in AD hat einen Distinguished Name (sein Pfad) http://msdn.microsoft.com/en-us/library/aa366101(VS.85).aspx –

3

Ich benutze folgenden Code (von http://blogs.technet.com/b/brad_rutkowski/archive/2008/04/15/c-getting-members-of-a-group-the-easy-way-with-net-3-5-discussion-groups-nested-recursive-security-groups-etc.aspx) es funktioniert gut.

IList<string> getMembers(string domainName, string groupName) 
    { 
     PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainName); 
     GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, groupName); 

     if (grp == null) { 
      throw new ApplicationException("We did not find that group in that domain, perhaps the group resides in a different domain?"); 
     } 

     IList<string> members = new List<String>(); 

     foreach (Principal p in grp.GetMembers(true)) 
     { 
      members.Add(p.Name); //You can add more attributes, samaccountname, UPN, DN, object type, etc... 
     } 
     grp.Dispose(); 
     ctx.Dispose(); 

     return members; 
    } 
0
//Search for Group and list group members 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.DirectoryServices.AccountManagement; 

namespace ExportActiveDirectoryGroupsUsers 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args == null) 
      { 
       Console.WriteLine("args is null, useage: ExportActiveDirectoryGroupsUsers OutputPath"); // Check for null array 
      } 
      else 
      { 
       Console.Write("args length is "); 
       Console.WriteLine(args.Length); // Write array length 
       for (int i = 0; i < args.Length; i++) // Loop through array 
       { 
        string argument = args[i]; 
        Console.Write("args index "); 
        Console.Write(i); // Write index 
        Console.Write(" is ["); 
        Console.Write(argument); // Write string 
        Console.WriteLine("]"); 
       } 
       try 
       { 
        using (var ServerContext = new PrincipalContext(ContextType.Domain, ServerAddress, Username, Password)) 
        { 
         /// define a "query-by-example" principal - here, we search for a GroupPrincipal 
         GroupPrincipal qbeGroup = new GroupPrincipal(ServerContext, args[0]); 

         // create your principal searcher passing in the QBE principal  
         PrincipalSearcher srch = new PrincipalSearcher(qbeGroup); 

         // find all matches 
         foreach (var found in srch.FindAll()) 
         { 
          GroupPrincipal foundGroup = found as GroupPrincipal; 

          if (foundGroup != null) 
          { 
           // iterate over members 
           foreach (Principal p in foundGroup.GetMembers()) 
           { 
            Console.WriteLine("{0}|{1}", foundGroup.Name, p.DisplayName); 
            // do whatever you need to do to those members 
           } 
          } 

         } 
        } 
        //Console.WriteLine("end"); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine("Something wrong happened in the AD Query module: " + ex.ToString()); 
       } 
       Console.ReadLine(); 
      } 
     } 
    } 
} 
Verwandte Themen