Johnny Prescott
Johnny Prescott

Reputation: 271

LDAP Vb.net simple query

I'm trying to create a vb.net code for a simple query through LDAP but having an issue and can't find where it is.

                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

it is giving me an error saying that the object is not valid. The searcher variable is in fact empty so it has to do with my query somehow.

This is my first time with LDAP¨and I have tried some of the solution i could find on the net but nothing is working so far.

Error: Object not set to an instance of an object.

Upvotes: 0

Views: 10085

Answers (1)

X3074861X
X3074861X

Reputation: 3819

Unless you're adding another attribute to search by, you don't need the AND operator in your filter syntax - a search for simply (employeenumber=6012589) should work just fine.

If do you have another attribute you'd like to search by, the filter syntax would be similiar to what you have now, only with the additional attribute :

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

EDIT:

I put together an example using the lower level System.DirectoryServices and System.DirectoryServices.Protocols namespaces. This helps break up the actual login and search functions, and will also provide better context when errors occur. For the example, I've replaced all of my variables with the ones you're using in your question. I tested this against our own Active Directory instance over unsecured port 389 using my creds and a base domain similar to the one you're using.

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

Upvotes: 0

Related Questions