DirectorySearcher Filter - PullRequest
       21

DirectorySearcher Filter

13 голосов
/ 26 февраля 2012

Когда я запускаю этот запрос

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

Я получил шесть записей, и это правильно.
Все записи, если я использую record.GetDirectoryEntry(), имеют

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

В любом случае, если я удалю комментарий к distinguishedname части фильтра, я получу ноль записей !!
Я тоже безуспешно пытался использовать search.PropertiesToLoad.Add("distinguishedname");.
Как мне найти distinguishedname в фильтре?

UPDATE:
Если я попытаюсь использовать "(distinguishedname=*)" + в фильтре, я все равно получу шесть записей, так что я думаю, что могу искать по отличительному имени ...
UPDATE2:
Я также пытался использовать код в Поиск Active Directory для OU, используя частичный путь к OU :

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

но у меня ноль записей (у меня две, если я удалю (objectClass=user) part)

1 Ответ

28 голосов
/ 26 февраля 2012

Если вы хотите запросить именно это, вам следует привязать к этому контейнеру при первоначальном соединении:

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

Таким образом, вы также значительно сократите пространство в AD, которое необходимодля поиска, тем самым ускоряя поиск.

А если вы используете .NET 3.5 или новее, вы можете использовать PrincipalSearcher и принцип «запрос за примером» для выполнения поиска:

// 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....
    }
}

Если вы еще этого не сделали - обязательно прочитайте статью MSDN Управление принципами безопасности каталогов в .NET Framework 3.5 , которая показывает, как наилучшим образом использовать новые функции.в System.DirectoryServices.AccountManagement

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...