Подтвердить что ты не робот

Ошибка 0x80005000 и DirectoryServices

Я пытаюсь запустить простой запрос LDAP, используя службы каталогов в .Net.

    DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://someserver.contoso.com/DC=contoso,DC=com");
    directoryEntry.AuthenticationType = AuthenticationTypes.Secure;

    DirectorySearcher directorySearcher = new DirectorySearcher(directoryEntry);

    directorySearcher.Filter = string.Format("(&(objectClass=user)(objectCategory=user) (sAMAccountName={0}))", username);

    var result = directorySearcher.FindOne();
    var resultDirectoryEntry = result.GetDirectoryEntry();

    return resultDirectoryEntry.Properties["msRTCSIP-PrimaryUserAddress"].Value.ToString();

И я получаю следующее исключение:

System.Runtime.InteropServices.COMException (0x80005000): Unknown error (0x80005000)
  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.FindOne()

Как фрагмент в приложении консоли, это работает. Но когда я запускаю его как часть службы WCF (запускается под теми же учетными данными), он выдает указанное выше исключение.

Любые предложения?

Спасибо

4b9b3361

Ответ 1

Это проблема разрешения.

Когда вы запускаете консольное приложение, это приложение запускается с вашими учетными данными, например. как "вы".

Работает ли служба WCF? В IIS? Скорее всего, он работает под отдельной учетной записью, которой не разрешено запрашивать Active Directory.

Вы можете либо попытаться заставить работу олицетворения WCF работать, чтобы ваши собственные учетные данные были переданы, либо вы можете указать имя пользователя/пароль при создании DirectoryEntry:

DirectoryEntry directoryEntry = 
    new DirectoryEntry("LDAP://someserver.contoso.com/DC=contoso,DC=com", 
                       userName, password);

ОК, так что это могут быть не учетные данные в конце концов (что обычно бывает в более чем 80% случаев, которые я вижу).

Как насчет изменения кода немного?

DirectorySearcher directorySearcher = new DirectorySearcher(directoryEntry);
directorySearcher.Filter = string.Format("(&(objectClass=user)(objectCategory=user) (sAMAccountName={0}))", username);

directorySearcher.PropertiesToLoad.Add("msRTCSIP-PrimaryUserAddress");

var result = directorySearcher.FindOne();

if(result != null)
{
   if(result.Properties["msRTCSIP-PrimaryUserAddress"] != null)
   {
      var resultValue = result.Properties["msRTCSIP-PrimaryUserAddress"][0];
   }
}

Моя идея: почему бы не сказать DirectorySearcher с места битвы, какой атрибут вас интересует? Тогда вам не нужно делать еще один дополнительный шаг, чтобы получить полный DirectoryEntry из результата поиска (должен быть быстрее), и поскольку вы сказали поисковому директору найти это свойство, он, безусловно, будет загружен в результат поиска - поэтому, если он не равен null (значение не задано), вы должны легко получить его.

Марк

Ответ 2

У меня была такая же странная ошибка снова и снова, и ничего не помогло. Изменение пути к "LDAP://" вместо этого "ldap://" сделал трюк.

Ответ 3

В контексте Ektron эта проблема разрешена установкой в ​​Windows совместимой функции совместимости с Metabase IIS6:

Проверьте "функции Windows" или "службы ролей" для Metabase IIS6 совместимость, добавить, если отсутствует:

enter image description here

Ссылка: https://portal.ektron.com/KB/1088/

Ответ 4

У меня тоже была эта ошибка, и для меня это было подразделение с косой чертой в имени: "Группы доступа к файлам/папкам".

Этот форум нить указал мне в правильном направлении. В конце концов, вызов .Replace("/","\\/") для каждого значения пути перед использованием решил проблему для меня.

Ответ 5

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

ПЛОХО:

DirectoryEntry directoryEntry = 
    new DirectoryEntry("LDAP://someserver.contoso.com/DC=contoso,DC=com/", 
                       userName, password);

ХОРОШО:

DirectoryEntry directoryEntry = 
    new DirectoryEntry("LDAP://someserver.contoso.com/DC=contoso,DC=com", 
                       userName, password);

Ответ 6

Просто FYI, у меня была такая же ошибка и я использовал правильные учетные данные, но мой URL-адрес LDAP был неправильным: (

Я получил то же сообщение об ошибке и код

Ответ 7

Просто эта проблема возникла в производственной системе в компании, где я живу... Веб-страница, которая сделала привязку LDAP, перестала работать после изменения IP-адреса.

Решение... ... Я установил базовую аутентификацию, чтобы выполнить описанные здесь способы устранения неполадок: https://support.microsoft.com/en-us/kb/329986

И после этого все только начало работать. Даже после того, как я повторно отключил Basic Authentication на странице, которую тестировал, все остальные страницы снова начали работать с аутентификацией Windows.

С уважением, Acácio

Ответ 8

Эта ошибка может возникнуть, если на физическом компьютере закончилась память. В моем случае я размещал сайт в IIS, пытаясь получить доступ к AD, но на сервере не хватало памяти.

Ответ 9

Такая же ошибка возникает, если в DirectoryEntry.Patch нет ничего после символов "LDAP//:". Необходимо проверить каталогEntry.Path перед directorySearcher.FindOne(). Если явно не указан домен и не нужно "LDAP://".

private void GetUser(string userName, string domainName)
{
     DirectoryEntry dirEntry = new DirectoryEntry();

     if (domainName.Length > 0)
     {
          dirEntry.Path = "LDAP://" + domainName;
     }

     DirectorySearcher dirSearcher = new DirectorySearcher(dirEntry);
     dirSearcher.SearchScope = SearchScope.Subtree;
     dirSearcher.Filter = string.Format("(&(objectClass=user)(|(cn={0})(sn={0}*)(givenName={0})(sAMAccountName={0}*)))", userName);
     var searchResults = dirSearcher.FindAll();
     //var searchResults = dirSearcher.FindOne();

     if (searchResults.Count == 0)
     {
          MessageBox.Show("User not found");
     }
     else
     {
          foreach (SearchResult sr in searchResults)
          {
              var de = sr.GetDirectoryEntry();
              string user = de.Properties["SAMAccountName"][0].ToString();
              MessageBox.Show(user); 
          }        
     }
}

Ответ 10

Провел день по моей подобной проблеме, но все эти ответы не помогли.

В моем случае, я не включил проверку подлинности Windows в настройках IIS...

Ответ 11

На сайтах, размещенных на IIS, попробуйте повторно использовать пул приложений. Он исправил мою проблему. Благодаря