查找用户管理的所有组

时间:2012-08-21 12:33:40

标签: c# active-directory ldap

我们有一个特殊的多值属性。我们称之为ourOwnManagedBy,它可以包含管理当前组的用户或组(他们的DN)。

如何检索特定用户管理的所有群组的列表(借助managedByourOwnManagedBy)?

例如。假设用户是GlobalAdministrators组的成员,并且ApplicationAdministrators组具有GlobalAdministrations作为成员。最后是MyApplication组,其中包含ourOwnManagedBy属性中的ApplicationAdministrators。

  • UserGlobalAdministrators
  • 的成员
  • GlobalAdministratorsApplicationAdministrators
  • 的成员
  • MyApplicationApplicationAdministrators
  • 中获得了ourOwnManagedBy

如何使用该信息查找特定用户管理的所有组?是否可以对自定义属性(包含用户和组的DN)进行某种递归检查?

更新

我试过使用这样的目录搜索过滤器:

string.Format("(ourOwnManagedBy:1.2.840.113556.1.4.1941:={0})", dn);

但我可能误解了1.2.840.113556.1.4.1941的作用? (MSDN page

3 个答案:

答案 0 :(得分:1)

我担心,只有一个LDAP查询无法完成。您将不得不将其拆分为子查询并单独运行每个子查询,如果有很多要迭代的话,这反过来会阻塞域控制器。

我尝试按照我描述的方式进行操作,性能非常糟糕,至少使用.NET的可用模块进行操作。

答案 1 :(得分:0)

以下页面显示3.1.1.3.4.4 LDAP Matching Rules (extensibleMatch)表示您使用的LDAP_MATCHING_RULE_TRANSITIVE_EVAL在Windows 2008及更高版本中有效。如果您使用的是2003,则可能无效。

答案 2 :(得分:0)

没有递归,也不知道如何表现性能,可能有错误。

        string user = "username";
        //get domain
        DirectoryEntry de = System.DirectoryServices.ActiveDirectory.Domain.GetCurrentDomain().GetDirectoryEntry();
        //get users dn first
        string userDN;
        using (var searcher = new DirectorySearcher(de))
        {
            searcher.Filter = String.Format("(&(objectCategory=person)(objectClass=user)(sAMAccountName={0}))", user);
            searcher.PropertiesToLoad.Add("distinguishedName");
            userDN = searcher.FindOne().Properties["distinguishedName"][0].ToString();
        }

        //get list of all users groups
        List<string> groups;
        //see http://stackoverflow.com/questions/6252819/find-recursive-group-membership-active-directory-using-c-sharp
        using (var searcher2 = new DirectorySearcher(de))
        {
            searcher2.Filter = String.Format("(member:1.2.840.113556.1.4.1941:={0})", userDN);
            searcher2.SearchScope = SearchScope.Subtree;
            searcher2.PropertiesToLoad.Add("distinguishedName");

            SearchResultCollection src = searcher2.FindAll();

            groups = (from SearchResult c in src
                      select c.Properties["distinguishedName"][0].ToString()).ToList();
        }

        //build giant search query
        SearchResultCollection srcGroups;
        using (var searcher = new DirectorySearcher(de))
        {
            string baseString = "(|{0})";
            string managedbybase = "(managedBy={0})";
            //I've read that you can search multivalued lists using a standard ='s.
            string ourOwnManagedByBase = "(ourOwnManagedBy={0})";

            StringBuilder sb = new StringBuilder();

            //add user DN to list of group dn's
            groups.Add(userDN);

            foreach (string g in groups)
            {
                sb.AppendFormat(managedbybase, g);
                sb.AppendFormat(ourOwnManagedByBase, g);
            }

            searcher.Filter = string.Format(baseString, sb.ToString());
            srcGroups = searcher.FindAll();
        }

我会诚实地说,这实际上并不适合我:)但我认为这是因为我们的域名配置方式。如果没有其他可能它会推动你走向正确的方向。