2009-11-12 2 views
33

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

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

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

Спасибо

ответ

27

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

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

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

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

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

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

Марк

+1

Я зашел на сервер, на котором этот процесс запущен, как учетная запись службы, которую я настроил для службы WCF для работы, - поэтому они используют одинаковые учетные данные? – GodEater

+1

OK - можете ли вы пройти через код (или записать сообщения трассировки), чтобы узнать, где именно происходит это исключение? –

+2

0x80005000 - довольно «шаблонная» ошибка и может означать что угодно ... –

3

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

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

7

Я имел эта ошибка так и для меня это было подразделение с косой чертой в названии: «Файл/Папка доступ группа»

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

+1

Большое вам спасибо, это была моя проблема! После того, как мы попытались в течение 2 дней играть прав доступа, мы узнали, что OU было создано с косой чертой в названии. – Panda

62

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

Изменение пути от ldap:// до LDAP:// сделал трюк.

+8

Это исправило это и для меня. LDAP должен быть в шапках. –

+0

отличный ответ для меня. особенно если вы работаете с powershell, вы не привыкли к чувствительной к регистру написание –

+6

WAAAAAAAAT ??!Я проведя 2 часа на этом LDAP, решил мою проблему! –

12

В контексте Ektron, этот вопрос решается путем установки "совместимости IIS6 Metabase" функция в Windows:

Check 'функции Windows' или 'Role Services' для IIS6 Metabase совместимости, добавить, если отсутствует:

enter image description here

Ref: https://portal.ektron.com/KB/1088/

+0

Для моей конкретной проблемы (попав в ошибку OP, но я шел для IIS, а не LDAP), это решило это. Спасибо вам – Malachi

5

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

BAD:

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); 
3

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

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

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

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

0

Та же ошибка возникает, если в 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); 
      }   
    } 
} 
0

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

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

1

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

0

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

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