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
                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.
Neither C# nor VB.NET implement DirectorySearcher or any other part of .NET. They are all part of the .NET Framework.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With