10

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

如何检索特定用户管理的所有组的列表(在 和 的帮助下managedByourOwnManagedBy

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

  • User是成员GlobalAdministrators
  • GlobalAdministrators是成员ApplicationAdministrators
  • MyApplication进来ApplicationAdministratorsourOwnManagedBy

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

更新

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

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

但我可能误解了什么1.2.840.113556.1.4.1941?(MSDN 页面

4

3 回答 3

1

恐怕,仅使用一个 LDAP 查询是不可能完成的。您必须将其拆分为子查询并分别运行每个子查询,如果有很多要迭代的内容,这反过来会阻塞域控制器。

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

于 2012-08-28T12:45:54.897 回答
0

以下页面显示3.1.1.3.4.4 LDAP 匹配规则 (extensibleMatch)表明您使用的 LDAP_MATCHING_RULE_TRANSITIVE_EVAL 在 Windows 2008 及更高版本中有效。如果您使用的是 2003,它可能无法正常工作。

于 2012-08-27T22:11:04.480 回答
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();
        }

I'll be honest and say that this doesn't actually work for me :) But I think it's because of the way our domain is configured. If nothing else maybe it will push you in the right direciton.

于 2012-08-30T16:51:00.167 回答