2015-10-12 9 views
0

Я прочитал в this question, что общий ответ на ошибку 0x также рассматривается в том, что в указанном выше вопросе часто указывается учетная запись, под которой выполняется поиск.Не удается подключиться к LDAP

Я понял, что я уже это делаю - на самом деле, я пытаюсь использовать активный каталог для аутентификации пользователя в моем приложении. Первоначально я думал, что проблема с моей ошибкой, связанной с тем, как я формулировал свой параметр поиска:

string domainAndUsername = domain + @"\" + username; 
DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd); 

Где _path возвратил URI. domainAndUsername вернулся следующее:

"domain.com\\usrname" 

Так что я изменил экземпляра к:

DirectoryEntry entry = new DirectoryEntry(_path, username, pwd); 

возвращение "[email protected]" (я заменял "@ domain.com", потому что моя реализация потребует пользователь вводит свой адрес электронной почты и пароль NT).

Это привело меня к небольшой вероятности того, что мой тест может выполняться под учетной записью, недостаточно привилегированной для выполнения поиска по каталогам, - но я уже выполнил поиск тех же данных с другой реализацией - в том же проект, не менее.

Итак, почему моя реализация падает с 0x80005000 всякий раз, когда я пытаюсь использовать object obj = entry.NativeObject;?

Что еще более важно, почему это реализация падает, когда мой оригинал нет? Для справки, эта реализация использует тот же формат, что и демонстрируется Microsoft here и моей первоначальной (рабочей) реализации ниже:

public class dirSearch 
{ 
    public bool searchSuccessful; 
    public string errStr; 

    List<string> resList = new List<string>(); 
    public void getEmpDetails(string filStr, string varStr) 
    { 
     string strServerDNS = "ldap.domain.com:389"; 
     string strSearchBaseDN = "ou=People,o=domain.com"; 
     string strLDAPPath = "LDAP://" + strServerDNS + "/" + strSearchBaseDN; 
     DirectoryEntry objDirEntry = new DirectoryEntry(strLDAPPath, null, null, AuthenticationTypes.Anonymous); 
     DirectorySearcher searcher = new DirectorySearcher(objDirEntry); 
     SearchResultCollection results; 

     searcher.Filter = "(uid=" + filStr + ")"; 
     //make sure the order of the search is like so: 
     //UID 
     //empnum 
     //full name 
     searcher.PropertiesToLoad.Add(varStr); 

     try 
     { 
      results = searcher.FindAll(); 
      foreach (SearchResult result in results) 
      { 
       string temStr = result.Properties[varStr][0].ToString(); 
       resList.Add(temStr); 
       searchSuccessful = true; 
      } 
     } 
     catch (Exception e) 
     { 
      errStr = e.ToString(); 
      searchSuccessful = false; 
     } 
    } 
} 

Дополнительная информация:

Я вытащил код ошибки из исключения , который оказался -2147463168. Это соответствует ADS_BAD_PATHNAME. Это несколько сбивает с толку, поскольку LDAP: //ldap.domain.com: 389/является правильным. Моя теория заключается в том, что я должен использовать Distinguished Name, и в этом случае мне нужно вернуться к моему первоначальному методу работы и вытащить полное имя сотрудника, а затем сформулировать имя с этой информацией.

ответ

0

Я заметил, что вы используете анонимную аутентификацию для входа в свой AD, я думаю, вы хотите использовать имя пользователя и пароль, а затем посмотреть, существует ли пользователь. Попробуйте использовать код ниже:

public bool IsAuthenticated(string username, string pwd) 
    { 
     string strLDAPServerAndPort = "ldap.domain.com:389"; 
     string strLDAPContainer = "CN=Users,DC=domain,DC=com"; 


     string strLDAPPath = "LDAP://" + strLDAPServerAndPort + "/" + strLDAPContainer; 
     DirectoryEntry objDirEntry = new DirectoryEntry(strLDAPPath, username, pwd); 

     try 
     { 
      //Bind to the native AdsObject to force authentication. 
      object obj = objDirEntry.NativeObject; 

      DirectorySearcher search = new DirectorySearcher(objDirEntry); 

      search.Filter = "(SAMAccountName=" + username + ")"; 
      search.PropertiesToLoad.Add("cn"); 
      SearchResult result = search.FindOne(); 

      if (null == result) 
      { 
       return false; 
      } 

     } 
     catch (Exception ex) 
     { 
      throw new Exception("Error authenticating user. " + ex.Message); 
     } 

     return true; 

    } 
+0

Имейте в виду, что пример в нижней части моего вопроса - это рабочая реализация - то есть я могу вернуть адрес электронной почты, номер сотрудника и полное имя. Я также попробовал просто указать отличительное имя, что привело к недопустимому синтаксису DN - тот же результат, что и ваш код. Тем не менее, я не уверен, что эта ошибка связана с неправильной попыткой входа в систему или неправильной попыткой поиска. – Wolfish

+0

Я предлагаю вам скачать активный проводник каталогов, он даст вам правильный путь к тому, что вы пытаетесь найти. – Bayeni

Смежные вопросы