Reputation: 61
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
Upvotes: 6
Views: 3174
Reputation: 12956
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.
Upvotes: 8
Reputation: 161831
Neither C# nor VB.NET implement DirectorySearcher
or any other part of .NET. They are all part of the .NET Framework.
Upvotes: 1