Я прочитал в 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, и в этом случае мне нужно вернуться к моему первоначальному методу работы и вытащить полное имя сотрудника, а затем сформулировать имя с этой информацией.
Имейте в виду, что пример в нижней части моего вопроса - это рабочая реализация - то есть я могу вернуть адрес электронной почты, номер сотрудника и полное имя. Я также попробовал просто указать отличительное имя, что привело к недопустимому синтаксису DN - тот же результат, что и ваш код. Тем не менее, я не уверен, что эта ошибка связана с неправильной попыткой входа в систему или неправильной попыткой поиска. – Wolfish
Я предлагаю вам скачать активный проводник каталогов, он даст вам правильный путь к тому, что вы пытаетесь найти. – Bayeni