如何使用.NET检索LDAP存储库中类的完整属性列表?

时间:2012-03-05 19:50:07

标签: c# ldap directoryservices

我有一个从LDAP存储库读取用户记录的应用程序。我正在使用System.DirectoryServices.Protocols命名空间中的工具来执行此操作。 objectclass通常是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属性以获取类,但是如何检索用户的objectclass列表的所有属性?

注意:SearchRequest类声称将Attributes属性设置为null将返回所有属性。不幸的是,这个属性没有设置者!

注意2:我尝试在属性名称列表中添加“*”和“+”无效。

4 个答案:

答案 0 :(得分:1)

要读取目录条目中填充的属性,请使用语法 @objectClassName,例如@inetOrgPerson。请求此构造作为请求之一 搜索中的属性。另见LDAP: Retrieving Attributes of an objectclass。这个语法是 在RFC 4529中定义。

要找到架构,请从根中提取属性subschemaSubEntry的值 DSE。此属性的值是架构的根。错误配置可能是错误的 服务器可以阻止客户端读取subschemaSubEntry属性的值,但是 这将是管理员的一个严重错误,因为所有LDAP客户端必须发现匹配的规则和 在比较属性值时使用的排序。

有关根DSE的详细信息,请参阅文章"LDAP: The Root DSE"

答案 1 :(得分:0)

如果您使用的是DirectorySearcher / DirectoryEntry,则可以获取具有SchemaEntry属性的DirectoryEntry的架构对象。然后,您可以从架构条目中获取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);
}

答案 2 :(得分:0)

对于mcohen75,OP:我意识到这已经大约5岁了,你可能不再关心了,但我想我今天遇到了这个。

Christian Nagel有一本名为Professional C#2008的书。

在页面1622上,他有:

  

可以使用LDAP字符串或使用 XmlDocument 类中包含的XML文档来定义搜索过滤器:

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

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

还有更多内容,但我认为上面关于&#34;返回所有属性&#34; 的注释就是你所追求的。

如果您想阅读相关内容,该特定图书现已在Google上发布:

Google Books: Professional C# 2008 by Christian Nagel

答案 3 :(得分:-1)

如果您只想要属性名称,可以通过objectClass的模式获取它们。