Простой запрос LDAP Vb.net

Я пытаюсь создать код vb.net для простого запроса через LDAP, но у меня возникла проблема, и я не могу найти, где он находится.

                Dim ldapServerName As String = "xxx.test.intranet.xxx.ca"
                Dim oRoot As DirectoryEntry = New DirectoryEntry("LDAP://" & ldapServerName & "/c=ca, DC=xxx,DC=corp,DC=xxx,DC=ca")
                oRoot.Username = "ou=Tool,ou=applications,o=xxx,c=ca"
                oRoot.Password = "something@2015"

                Dim LDAPSearcher As New DirectorySearcher()
                LDAPSearcher.Filter = "(&(employeenumber=6012589))"

                Dim SearchResult As SearchResult = LDAPSearcher.FindOne()
                Dim UserEntry As DirectoryEntry = SearchResult.GetDirectoryEntry()
                EDTEST.Text = UserEntry.Properties("employeenumber").Value.ToString

это дает мне сообщение об ошибке, говорящее, что объект недействителен. Переменная searcher на самом деле пуста, поэтому она как-то связана с моим запросом.

Это мой первый опыт работы с LDAP, и я попробовал некоторые решения, которые смог найти в сети, но пока ничего не работает.

Ошибка: Объект не установлен в экземпляр объекта.


person Johnny Prescott    schedule 04.01.2016    source источник


Ответы (1)


Если вы не добавляете другой атрибут для поиска, вам не нужен оператор И в синтаксисе фильтра — поиск по простому (employeenumber=6012589) должен работать нормально.

Если у вас есть другой атрибут, по которому вы хотите выполнить поиск, синтаксис фильтра будет аналогичен тому, что у вас есть сейчас, только с дополнительным атрибутом:

(&(employeenumber=6012589)(objectClass=user))

ИЗМЕНИТЬ:

Я собрал пример, используя пространства имен нижнего уровня System.DirectoryServices и System.DirectoryServices.Protocols. Это помогает разбить фактические функции входа и поиска, а также обеспечивает лучший контекст при возникновении ошибок. Например, я заменил все свои переменные теми, которые вы используете в своем вопросе. Я проверил это на нашем собственном экземпляре Active Directory через незащищенный порт 389, используя мои учетные данные и базовый домен, аналогичный тому, который вы используете.

Imports System.DirectoryServices.Protocols
Imports System.Net

Module Module1

Sub Main()

    ' setup your creds, domain, and ldap prop array 
    Dim username As String = "ou=Tool,ou=applications,o=xxx,c=ca"
    Dim pwd As String = "something@2015"
    Dim domain As String = "DC=xxx,DC=corp,DC=xxx,DC=ca"
    Dim propArray() As String = {"employeenumber"}

    ' setup your ldap connection, and domain component
    Dim ldapCon As LdapConnection = New LdapConnection("xxx.test.intranet.xxx.ca:389")
    Dim networkCreds As NetworkCredential = New NetworkCredential(username, pwd, domain)

    ' configure the connection and bind
    ldapCon.AuthType = AuthType.Negotiate
    ldapCon.Bind(networkCreds)

    ' if the above succceeded, you should now be able to issue search requests directly against the directory
    Dim searchRequest = New SearchRequest(domain, "(employeenumber=6012589)", SearchScope.Subtree, propArray)

    ' issue the search request, and check the results
    Dim searchResult As SearchResponse = ldapCon.SendRequest(searchRequest)
    Dim searchResultEntry As SearchResultEntry

    If (searchResult.Entries.Count > 0) Then ' we know we've located at least one match from the search

        ' if you're only expecting to get one entry back, get the first item off the entries list
        searchResultEntry = searchResult.Entries.Item(0)

        ' continue to do whatever processing you wish against the returned SearchResultEntry

    End If

End Sub

End Module
person X3074861X    schedule 04.01.2016
comment
Все равно не работает как надо. похоже, что он не может найти то, для чего он предназначен. Однако, если я использую LDAP Admin и подключаю его, я могу четко обнаружить, что запись есть. - person Johnny Prescott; 05.01.2016
comment
Хм... знаешь, неплохо было бы немного разбить твою логику. Я могу привести пример VB.Net того, как я делаю это на C # - быстрый вопрос: вы пытаетесь безопасно подключиться через LDAPS (порт 636) или незащищенный LDAP через порт 389? - person X3074861X; 05.01.2016