我只需要用户所属的组的commonName。
DirectoryEntry user = new DirectoryEntry("LDAP://cn=myuser....");
foreach(string path in user.Properties["memberOf"])
Console.WriteLine(path);
然后memberOf属性包含一组字符串,即组的完整路径。这是有道理的,但这不是我想要的。
我很确定我不会为每个路径创建一个DirectoryEntry来获取通用名称,但是从路径中简单地解析cn是最好的主意吗? (这似乎相当野蛮)
必须有更好的方法来获取用户所属的组的SearchResults。
顺便说一句,这是.NET 2,所以我不能做任何花哨的LINQ到AD的东西,也不能访问DirectoryServices for ActiveDirectory中的新位。答案 0 :(得分:2)
CN不一定等于该组的名称。由于DN已被转义,因此不建议将其解析为DN。您需要查询目录的目录。
要检索单个对象,请将搜索库设置为其可分辨名称,将搜索范围设置为“base”并发出查询。
在您的应用中缓存查询结果,以避免多次发出相同的LDAP查询(如果您检索连续多个对象的memberOf
)。
示例代码(right off the MSDN,仅稍加修改):
string dn = "LDAP://CN=Group Name,ON=Groups,DC=fabrikam,DC=com";
// Bind to a specific group.
DirectoryEntry entry = new DirectoryEntry(dn);
// Create a DirectorySearcher object.
DirectorySearcher mySearcher = new DirectorySearcher(entry);
mySearcher.SearchScope = SearchScope.Base;
mySearcher.PropertiesToLoad.Add("displayName");
// Use the FindOne method to find the group object.
SearchResult resEnt = mySearcher.FindOne();
答案 1 :(得分:0)
不幸的是,.NET 2.0中没有比你描述的更好的方法了。 memberOf
属性只包含用户所属的所有组的完整可分辨名称,因此您的最佳解决方案是解析每个可分辨名称。
答案 2 :(得分:0)
在“相关”部分找到这个旧线程。
对这个问题有另外两个建议
他们每个人都可以在一次搜索中将memberOf属性中的对象直接作为SearchResult
获取。
所有代码都在C#中。
属性范围查询(ASQ):
DirectoryEntry userEntry = new DirectoryEntry("LDAP://<server>/<user DN>", "user", "pwd");
DirectorySearcher searcher = new DirectorySearcher(userEntry);
searcher.SearchScope = SearchScope.Base;
searcher.AttributeScopeQuery = "memberOf";
searcher.PropertiesToLoad.Clear();
// just load any attributes you want, not limited to cn
searcher.PropertiesToLoad.Add("cn");
foreach (SearchResult result in searcher.FindAll())
{
Console.WriteLine(result.Path);
}
限制:
LDAP_MATCHING_RULE_IN_CHAIN匹配规则:
DirectoryEntry rootEntry = new DirectoryEntry("GC://<GC server>", "user", "pwd");
DirectorySearcher searcher = new DirectorySearcher(rootEntry);
searcher.SearchScope = SearchScope.Subtree;
searcher.Filter = "(member:1.2.840.113556.1.4.1941:=<user DN>)";
searcher.PropertiesToLoad.Clear();
// just load any attributes you want, not limited to cn
searcher.PropertiesToLoad.Add("cn");
foreach (SearchResult result in searcher.FindAll())
{
Console.WriteLine(result.Path);
}
限制: