Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# and VB.NET LDAP Search Different?

Does anyone know if there is a difference between the implementation of the FindAll() method on the DirectorySearcher object in C# and VB.NET? From my understanding they both get "compiled" to MSIL and get processed by the CLR the same way. Going against our ADAM/LDAP system the below C# code throws an error and the below VB.NET does not.

Here is the C# exception stack:

at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
  at System.DirectoryServices.DirectoryEntry.Bind()
  at System.DirectoryServices.DirectoryEntry.get_AdsObject()
  at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
  at System.DirectoryServices.DirectorySearcher.FindAll()

Here is the C# error:

System.Runtime.InteropServices.COMException was unhandled
Message="The parameter is incorrect.\r\n"
Source="System.DirectoryServices"
ErrorCode=-2147024809

C# code:

private void button1_Click(object sender, EventArgs e)
{
    DirectoryEntry root = new DirectoryEntry("LDAP://directory.corp.com/OU=Person,OU=Lookups,O=Corp,C=US", null, null, AuthenticationTypes.Anonymous);
    DirectorySearcher mySearcher = new DirectorySearcher(root);

    mySearcher.Filter = "(uid=ssnlxxx)";
    mySearcher.PropertiesToLoad.Add("cn");
    mySearcher.PropertiesToLoad.Add("mail");

    SearchResultCollection searchResultCollection = null;
    searchResultCollection = mySearcher.FindAll(); //this is where the error occurs

    try
    {
        foreach (SearchResult resEnt in searchResultCollection)
        {
            Console.Write(resEnt.Properties["cn"][0].ToString());
            Console.Write(resEnt.Properties["mail"][0].ToString());
        }
    }
    catch (DirectoryServicesCOMException ex)
    {
        MessageBox.Show("Failed to connect LDAP domain, Check username or password to get user details.");
    }
}

This is the VB.NET code that works:

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

    Dim root As New     DirectoryEntry("LDAP://directory.corp.com/OU=People,OU=Lookups,O=corp,C=US", vbNull, vbNull, authenticationType:=DirectoryServices.AuthenticationTypes.Anonymous)
    Dim searcher As New DirectorySearcher(root)
    searcher.Filter = "(uid=ssnlxxx)"
    searcher.PropertiesToLoad.Add("cn")
    searcher.PropertiesToLoad.Add("mail")

    Dim results As SearchResultCollection

    Try
        results = searcher.FindAll()

        Dim result As SearchResult
        For Each result In results
            Console.WriteLine(result.Properties("cn")(0))
            Console.WriteLine(result.Properties("mail")(0))
        Next result
    Catch ex As Exception
        MessageBox.Show("There was an error")
    End Try
End Sub
like image 681
user1195358 Avatar asked May 20 '11 14:05

user1195358


2 Answers

I am going to guess that in the VB.NET code, you're passing in vbNull (instead of Nothing) for two parameters in the DirectoryEntry constructor, and in the C# code you're passing null. vbNull is presumably from the evil Microsoft.VisualBasic assembly which should not be used.

The constructor for DirectoryEntry checks the username and password parameters to see if they're null. If vbNull != Nothing, the constructor won't treat them as null and will behave differently.

See if the VB.NET code throws the exception if you use Nothing, or alternatively see if the C# code works by using String.Empty instead of null.

Also, in your C# code, the call to FindAll is outside of the try block.

like image 128
Graham Clark Avatar answered Sep 30 '22 13:09

Graham Clark


Neither C# nor VB.NET implement DirectorySearcher or any other part of .NET. They are all part of the .NET Framework.

like image 45
John Saunders Avatar answered Sep 30 '22 14:09

John Saunders