我有一个从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:我尝试在属性名称列表中添加“*”和“+”无效。
答案 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)
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上发布:
答案 3 :(得分:-1)
如果您只想要属性名称,可以通过objectClass的模式获取它们。