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?
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.
J'ai toujours trouvé Howto: (Presque) Tout dans Active Directory via C # aide pour la plupart des questions AD.
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.
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;
}
//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();
}
}
}
}