DirectoryEntry memberOf属性返回完整路径

时间:2009-05-06 11:00:07

标签: active-directory ldap

我只需要用户所属的组的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中的新位。

3 个答案:

答案 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);
}

限制:

  • 不处理主要群组成员资格
  • 要求功能级别为2003(忘记域/林)
  • ASQ不能跨域工作(至少System.DirectoryServices不能,它会为另一个域中的任何对象抛出异常)

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);
}

限制:

  • 不处理主要群组成员资格
  • 需要2008 R2的功能级别(忘记域/林)
  • 它获得嵌套的组成员身份,而不仅仅是memberOf的一个级别