C # и VB.NET LDAP Поиск различаются? - PullRequest
6 голосов
/ 20 мая 2011

Кто-нибудь знает, есть ли разница между реализацией метода FindAll () в объекте DirectorySearcher в C # и VB.NET? Насколько я понимаю, они оба «компилируются» в 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, 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,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

Ответы [ 2 ]

8 голосов
/ 20 мая 2011

Я собираюсь догадаться, что в коде VB.NET вы передаете vbNull (вместо Nothing) для двух параметров в конструкторе DirectoryEntry и в коде C #, который вы передаетеnull.vbNull предположительно принадлежит злой Microsoft.VisualBasic сборке, которая не должна использоваться.

Конструктор для DirectoryEntry проверяет параметры имени пользователя и пароля, чтобы определить, являются ли они нулевыми.Если vbNull != Nothing, конструктор не будет обращаться с ними как с нулем и будет вести себя по-другому.

Посмотрите, генерирует ли код VB.NET исключение, если вы используете Nothing, или альтернативно посмотрите, работает ли код C #используя String.Empty вместо null.

Кроме того, в вашем коде C # вызов FindAll находится за пределами блока try.

1 голос
/ 20 мая 2011

Ни C #, ни VB.NET не реализуют DirectorySearcher или любую другую часть .NET. Все они являются частью .NET Framework.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...