Как я могу получить полный список атрибутов для класса в хранилище LDAP с .NET? - PullRequest
1 голос
/ 05 марта 2012

У меня есть приложение, которое читает пользовательские записи из хранилища LDAP.Я использую средства в пространстве имен System.DirectoryServices.Protocols для этого.Объектным классом обычно является person или inetOrgPerson.

Как я могу динамически считывать атрибуты для данного класса из репозитория LDAP?

Следующий код создает список атрибутов для примера пользователя вхранилище, но, по-видимому, возвращает только те атрибуты, которые имеют значения.

var connection = new LdapConnection(...);
SearchRequest request = new SearchRequest("CN=joe.user,DC=blah,DC=com", (string)null, SearchScope.Base);
SearchResponse response = (SearchResponse)connection.SendRequest(request);

var attributes = new List<string>();
foreach (SearchResultEntry entry in response.Entries)
{
    foreach (string attributeName in entry.Attributes.AttributeNames)
        attributes.Add(attributeName);
}

Я могу покрасить атрибут objectclass от образца пользователя, чтобы получить классы, но тогда как мне получить все атрибуты для списка объектных классов пользователя?

ПРИМЕЧАНИЕ. Класс SearchRequest утверждает, что при установке для свойства Attributes значения null будут возвращены все атрибуты.К сожалению, для этого свойства нет установщика!

ПРИМЕЧАНИЕ 2. Я пытался добавить «*» и «+» в список имен атрибутов, но безрезультатно.

Ответы [ 4 ]

1 голос
/ 06 марта 2012

Чтобы прочитать атрибуты, которые заполнены в записи каталога, используйте синтаксис @objectClassName, например, @inetOrgPerson. Запросите эту конструкцию как один из запросов атрибуты в поиске. См. Также LDAP: получение атрибутов ObjectClass . Этот синтаксис определено в RFC 4529 .

Чтобы найти схему, извлеките значение атрибута subschemaSubEntry из корня DSE. Значение этого атрибута является корнем схемы. возможно, что неправильно настроен сервер может помешать клиентам прочитать значение атрибута subschemaSubEntry, но это было бы серьезной ошибкой со стороны администраторов, потому что все клиенты LDAP должны обнаружить соответствующие правила и порядок использования при сравнении значений атрибутов.

Дополнительные сведения о корневом DSE см. В статье «LDAP: корень». DSE ".

0 голосов
/ 18 октября 2017

Для mcohen75, ОП: я понимаю, что это около 5 лет, и вам, вероятно, уже все равно, но я думаю, что я сталкивался с этим сегодня.

Есть книга под названием Professional C # 2008Кристианом Нагелем.

На странице 1622 он имеет:

Фильтр поиска можно определить с помощью строки LDAP или с помощью документа XML, содержащегося в XmlDocument class:

string distinguishedName = null;
string ldapFilter = "(objectClass=user)";
string[] atrributesToReturn = null; // return all attributes

SearchRequest searchRequest = new SearchRequest(distinguishedName, 
    ldapFilter, SearchScope.Subtree, attributesToReturn);

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

Если вы хотите прочитать об этом, то эта конкретная книга в настоящее время в Google:

Google Книги: Professional C # 2008 by Christian Nagel

0 голосов
/ 26 ноября 2012

Если вы использовали DirectorySearcher / DirectoryEntry, вы можете получить объект схемы для DirectoryEntry с помощью свойства SchemaEntry. Затем вы можете получить созданный атрибут allowedAttributes из записи схемы.

using System.DirectoryServices;

DirectoryEntry deTargetUser = new DirectoryEntry("LDAP://CN=joe.user,DC=blah,DC=com");
DirectorySearcher dsSchema = new DirectorySearcher(deTargetUser.SchemaEntry);
dsSchema.SearchScope = SearchScope.Base; //allowedAttributes is a constructed attribute, so have to ask for it while performing a search
dsSchema.Filter = "(objectClass=*)"; //this is closest thing I can find to an always true filter
dsSchema.PropertiesToLoad.Add("allowedAttributes");
SearchResult srSchema = dsSchema.FindOne();
var attributes = new List<string>();
foreach(string attributeName in srSchema.Properties["allowedAttributes"])
{
    attributes.Add(attributeName);
}
0 голосов
/ 06 марта 2012

Если вам просто нужны имена атрибутов, вы можете получить их через схему для objectClass.

...