Bezdepbonusu7Программирование: статьи и ответы

Вопрос

.net ldap не читает настраиваемые атрибуты 0x8000500c

Автор вопроса: rustyОтветов: 2

Я пытаюсь создать функцию для своего .Net-приложения, чтобы иметь возможность разговаривать с сервером LDAP для чтения атрибутов пользователя и аутентификации пользователей. Я установил тестовый сервер каталогов с использованием OpenDS, добавил настраиваемые атрибуты и объекты и добавил пользователей с новыми типами объектов. Все работает нормально, пока я не попытаюсь прочитать значения настраиваемых атрибутов, я получаю:

{"Unknown error (0x8000500c)"}
at System.DirectoryServices.PropertyValueCollection.PopulateList()
at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)

Я пробовал предложения из этого сообщения (при правильном использовании сформированные oids), а также этот пост (используя полное доменное имя в вашем ldap path - я использую что-то вроде LDAP: //mymachine.company.local / ...). Предлагали другие, поскольку код ошибки COM означает E_ADS_CANT_CONVERT_DATATYPE, что-то не так с моими атрибутами или схемой, но атрибуты настроены как DirectoryString, что есть другие поля по умолчанию того же типа, которые я могу прочитать.

Я понимаю, что работа с OpenDS не будет работать так же, как с Active Directory, у меня есть отдельный модуль для AD, который работает нормально, мне просто интересно, имел ли кто-нибудь опыт общения с реализациями OpenDS или Sun One LDAP.

Мысли? Я не могу найти в Google много информации, связанной с OpenDS и .NET вместе, что заставляет меня думать, что я должен делать что-то еще. Как я уже сказал, AD работает нормально, но мне бы очень хотелось иметь возможность делать это и с OpenDS.

Спасибо!

Расти

ldapopends

Ответы

Ответ 1 · Terry Gardner

Используйте заведомо исправный инструмент, такой как ldapsearch, чтобы убедиться, что клиент LDAP действительно может запрашивать и получать требуемые записи и атрибуты. Например:

ldapsearch --hostname hostname \
           --port port \
           --bindDn your-auth-id \
           --bindPassword credentials-for-your-auth-id \
           --useSSL     \
           --trustAll \
           --baseDn your-base-object \
           --searchScope the-scope-you-use \
           '(&)' \
           your-custom-attribute-names

Используйте те же параметры, что и в коде клиента LDAP. Если вышеуказанный поиск завершается успешно, значит, сервер настроен правильно, записи присутствуют, а идентификатор аутентификации имеет разрешение на получение этих записей и настраиваемых атрибутов. В противном случае они могут быть проблемой в коде клиента LDAP.

смотрите также

Ответ 2 · WhoIsRich

У меня была эта ошибка при попытке прочитать строку с несколькими значениями из базы данных Linux OpenLdap.

Это похоже на ошибку, поскольку я обнаружил, что ошибка возникает в XP и Server 2003, но один и тот же код в Windows 7 и Server 2008 возвращает значения, независимо от установленных версий .NET.

Однако я нашел обходной путь для C # с использованием более прямого доступа. В дополнение к Directory.Services вам нужно будет добавить ссылку, COM, "Библиотеку типов Active DS".

var dirEntry = new DirectoryEntry("ldapDn", "logonDn", "logonPass");
var nativeEntry = (ActiveDs.IADsPropertyList)dirEntry.NativeObject;
var propEntry = (ActiveDs.IADsPropertyEntry)nativeEntry.GetPropertyItem("attributeName", 3);
foreach (ActiveDs.IADsPropertyValue propValue in (object[])propEntry.Values)
{
    Debug.Print(propValue.CaseIgnoreString);
}

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы