web-dev-qa-db-fra.com

Obtenir la liste des utilisateurs d'Active Directory dans un groupe AD donné

J'ai un code qui recherche tous les utilisateurs d'un département:

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

À quoi ressemblerait le filtre si je ne voulais que tous les membres du groupe d'annonces "Gestionnaire en lecture seule"? 

Est-ce que je vais à ce sujet tout faux?

19
wcm

En regardant votre recherche, j'ai quelques points pour vous. Premièrement, la recherche utilise objectClass (non indexée) au lieu de objectCategory (indexée). Problème de performance énorme avec cette requête. Vous voudrez probablement toujours combiner les deux ensemble en fonction de ce que vous essayez de récupérer:

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

En ce qui concerne la recherche des utilisateurs dans un groupe, vous pouvez énumérer la liste des objets membres du groupe spécifique. Dans l'attribut membre de l'objet groupe est le nom distingué de chaque utilisateur. 

Cet article décrit l'énumération des membres d'un groupe ...

N'oubliez pas que vous devrez peut-être gérer les groupes imbriqués du groupe parent, car il n'existe pas de moyen par défaut de gérer cela avec des requêtes LDAP. Pour cela, vous devrez peut-être évaluer si l'objet membre est un groupe, puis obtenir l'attribut membre pour ce groupe d'enfants.

Enfin, vous devriez prendre l’habitude de spécifier un préfixe DNS à votre requête. 

Sans préfixe DNS:

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

Avec préfixe DNS (les trois fonctionnent):

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

Un seul domaine ne vous causera pas beaucoup de problèmes, mais lorsque vous essayez d'effectuer une recherche dans un environnement à plusieurs domaines, vous serez piqué sans cet ajout. J'espère que cela vous aidera à vous rapprocher de votre objectif.

34
Dscoduc

J'ai toujours trouvé Howto: (Presque) Tout dans Active Directory via C # aide pour la plupart des questions AD.

10
nzpcmad

Si vous connaissez déjà le chemin AD du groupe, il serait probablement plus facile d'ouvrir un DirectoryEntry sur ce dernier, puis effectuez un DirectorySearcher à partir de là.

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

Il y a aussi un drapeau sur le Searcher pour savoir s'il faut explorer les sous-conteneurs, j'oublie le nom de la main.

6
Rob McCready

J'utilise le code suivant (de 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-groupes-imbriqués-récursifs-sécurité-groupes-etc.aspx ) cela fonctionne très bien.

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
Howard Rothenburg