web-dev-qa-db-fra.com

Filtre DirectorySearcher

Lorsque j'exécute cette requête

// Next row is used to login to AD
DirectoryEntry entry = GetEntry(domain, adminUser, adminPassword);
// Here starts the query
DirectorySearcher search = new DirectorySearcher(entry)
{
    SearchScope = SearchScope.Subtree,
    Filter = "(&" +
        "(objectClass=user)" +
        // "(distinguishedname=*OU=Ingegneria*)" +
        "(givenname=s*)" +
        "(samaccountname=*100)" +
    ")"
};
search.PropertiesToLoad.Add("distinguishedname");
SearchResultCollection result = search.FindAll();

Je reçois six entrées et c'est correct.
Tous les enregistrements, si j'utilise record.GetDirectoryEntry() ont

distinguishedname: CN=xxx,OU=Utenti,OU=Ingegneria,DC=xxx,DC=xxx

Quoi qu'il en soit, si je supprime le commentaire sur distinguishedname une partie du filtre, je ne reçois aucune entrée !!
J'ai également essayé d'utiliser search.PropertiesToLoad.Add("distinguishedname"); sans succès.
Comment puis-je rechercher distinguishedname dans le filtre?

MISE À JOUR:
Si j'essaie d'utiliser "(distinguishedname=*)" + dans le filtre, j'obtiens toujours six enregistrements, donc je pense que je peux rechercher sur distinctionname ...
MISE À JOUR2:
J'ai également essayé d'utiliser du code dans Rechercher dans Active Directory une unité d'organisation en utilisant un chemin partiel vers l'unité d'organisation :

Filter = "(&(objectClass=user)(ou=Ingegneria))";

mais je n'ai aucune entrée (j'en ai deux si j'enlève la partie (objectClass=user))

13
Marco

Si vous souhaitez interroger juste cela, vous devez lier à ce conteneur dans votre connexion initiale:

// Next row is used to login to AD
string ldapPath = "LDAP://OU=Ingegneria,DC=xxx,DC=xxx";
DirectoryEntry searchRoot = GetEntry(ldapPath, adminUser, adminPassword);

// Here starts the query
DirectorySearcher search = new DirectorySearcher(searchRoot)
{
    SearchScope = SearchScope.Subtree,
    Filter = "(&" +
        "(objectClass=user)" +
        "(givenname=s*)" +
        "(samaccountname=*100)" +
    ")"
};

search.PropertiesToLoad.Add("distinguishedname");
SearchResultCollection result = search.FindAll();

De cette façon, vous réduisez également massivement l'espace dans AD qui doit être recherché, accélérant ainsi votre recherche.

Et si vous utilisez .NET 3.5 ou plus récent, vous pouvez utiliser un PrincipalSearcher et un principal "requête par exemple" pour effectuer votre recherche:

// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN", "OU=Ingegneria,DC=xxx,DC=xxx");

// define a "query-by-example" principal - here, we search for a UserPrincipal 
UserPrincipal qbeUser = new UserPrincipal(ctx);
qbeUser.GivenName = "s*";
qbeUser.SamAccountName = "*100";

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

// find all matches
foreach(var found in srch.FindAll())
{
    // do whatever here - "found" is of type "Principal"
    UserPrincipal userFound = found as UserPrincipal;

    if(userFound != null)
    {
       // do something with your user principal here....
    }
}

Si vous ne l'avez pas déjà fait - lisez absolument l'article MSDN Gestion des principaux de sécurité d'annuaire dans le .NET Framework 3.5 qui montre comment utiliser au mieux les nouvelles fonctionnalités de System.DirectoryServices.AccountManagement

28
marc_s