it-swarm.com.ru

Ошибка 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 (работающей с теми же учетными данными), он выдает вышеупомянутое исключение.

Какие-либо предложения?

Спасибо

39
GodEater

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

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

Служба 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 из результата поиска (должно быть быстрее), и, поскольку вы сказали поисковику каталогов найти это свойство, оно, безусловно, будет загружено в результат поиска - так если он не равен нулю (значение не установлено), вы сможете легко его получить.

Марк

31
marc_s

У меня было то же самое снова и снова, и ничто, казалось, не помогало. 

Смена пути с ldap:// на LDAP:// сделала свое дело. 

82
Aiello

В контексте Ektron эта проблема решается путем установки в Windows функции «Совместимость с метабазой IIS6»:

Проверьте «Функции Windows» или «Службы ролей» для метабазы ​​IIS6 совместимость, добавьте, если отсутствует:

enter image description here

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

16
David d C e Freitas

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

ПЛОХОЙ:

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);
10
pg0xC

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

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

7
Nick Sarabyn

На IIS размещенных сайтах попробуйте повторно использовать пул приложений. Это исправило мою проблему . Спасибо

4
Ernest

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

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

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

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

3
Acácio

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

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

3
sebagomez

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

1
lsp

Потратил день на мою похожую проблему, но все эти ответы не помогли.

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

0
YSJ

Такая же ошибка возникает, если в DirectoryEntry.Patch ничего нет после символов «LDAP //:». Необходимо проверить directoryEntry.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); 
          }        
     }
}
0
DartAlex