wake-up-neo.com

Liste der Benutzer aus Active Directory in einer bestimmten AD-Gruppe abrufen

Ich habe Code, der nach allen Benutzern in einer Abteilung sucht:

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();

Wie müsste der Filter aussehen, wenn ich nur alle in der AD-Gruppe "Manager Read Only" haben möchte? 

Mache ich das alles falsch?

19
wcm

Bei Ihrer Suche habe ich ein paar Punkte für Sie. Erstens verwendet die Suche objectClass (nicht indiziert) anstelle von objectCategory (indiziert). Riesiges Leistungsproblem bei dieser Abfrage. Meistens möchten Sie die beiden immer miteinander kombinieren, je nachdem, was Sie abrufen möchten:

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

Um nach Benutzern in einer Gruppe zu suchen, können Sie die Liste der Mitgliederobjekte der jeweiligen Gruppe auflisten. Im member-Attribut des Gruppenobjekts befindet sich der DistinguishedName jedes Benutzers. 

Dieser Artikel beschreibt das Aufzählen von Mitgliedern einer Gruppe ...

Vergessen Sie nicht, dass Sie möglicherweise verschachtelte Gruppen der übergeordneten Gruppe behandeln müssen, da dies bei LDAP-Abfragen keine Standardmethode ist. Dazu müssen Sie möglicherweise prüfen, ob das Mitgliederobjekt eine Gruppe ist, und dann das Mitgliederattribut für diese untergeordnete Gruppe abrufen.

Schließlich sollten Sie sich angewöhnen, Ihrer Abfrage ein dns-Präfix anzugeben. 

Ohne DNS-Präfix:

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

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

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 Domäne verursacht nicht viel Probleme, aber wenn Sie versuchen, eine Suche in einer Umgebung mit mehreren Domänen durchzuführen, werden Sie ohne diesen Zusatz gebissen. Hoffe, das hilft dir, dich deinem Ziel näher zu bringen.

34
Dscoduc

Ich habe immer Howto gefunden: (Fast) alles im Active Directory über C # hilft bei den meisten AD-Fragen.

10
nzpcmad

Wenn Sie den AD-Pfad zu der Gruppe bereits kennen, ist es wahrscheinlich einfacher, einen DirectoryEntry für diesen Ordner zu öffnen. Führen Sie dann einen DirectorySearcher aus.

using (DirectoryEntry de = new DirectoryEntry("LDAP://somedomain/CN=FooBar"))
{
   DirectorySearcher search = new DirectorySearcher(de, ("(objectClass=user)"));
}

Es gibt auch eine Markierung im Searcher, ob Sie auf Subcontainer zugreifen möchten. Den Namen habe ich vergessen.

6
Rob McCready

Ich verwende 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-rekursive-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;
    }
3
Petr
    //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();
            }
        }
    }
}
0