C#和VB.NET LDAP搜索不同?

前端之家收集整理的这篇文章主要介绍了C#和VB.NET LDAP搜索不同?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有谁知道C#和VB.NET中DirectorySearcher对象上的FindAll()方法的实现是否有区别?根据我的理解,它们都被“编译”到MSIL并由CLR以相同的方式处理.与我们的ADAM / LDAP系统相反,下面的C#代码会抛出错误,而下面的VB.NET则不会.

这是C#异常堆栈:

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()

这是C#错误

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

C#代码

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,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.");
    }
}

这是有效的VB.NET代码

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,O=corp,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

解决方法

我猜想在VB.NET代码中,你在DirectoryEntry构造函数中为两个参数传递vbNull(而不是Nothing),并且在C#代码中传递null. vbNull大概来自邪恶的Microsoft.VisualBasic程序集,不应该使用它.

DirectoryEntry的构造函数检查用户名和密码参数以查看它们是否为空.如果vbNull!= Nothing,构造函数将不会将它们视为null并且行为会有所不同.

如果你使用Nothing,看看VB.NET代码是否抛出异常,或者看看C#代码是否通过使用String.Empty而不是null来工作.

此外,在您的C#代码中,对FindAll的调用不在try块之内.

猜你在找的C#相关文章