查找用户管理的所有组

10
我们拥有一个特殊的多值属性,称之为ourOwnManagedBy,它可以包含管理当前组的用户或组(其DN)。
如何检索指定用户管理的所有组(借助managedByourOwnManagedBy)?
例如,假设用户是GlobalAdministrators组的成员,并且ApplicationAdministrators组拥有GlobalAdministrations作为成员。最终,MyApplication组在ourOwnManagedBy属性中拥有ApplicationAdministrators。
如何利用这些信息找到特定用户管理的所有组?是否可能在包含用户和组DN的自定义属性中进行递归检查? 更新 我尝试使用类似以下的目录搜索过滤器:
string.Format("(ourOwnManagedBy:1.2.840.113556.1.4.1941:={0})", dn);

但我可能误解了1.2.840.113556.1.4.1941的作用? (MSDN页面)


这很愚蠢,但链接网站上的代码示例将其DN括在大括号中。你试过同样的方法吗?我不认为这会有什么区别,但我没有尝试过。 - JDB
是的,我试过了。但是谢谢你的建议。 - jgauffin
3个回答

1
很抱歉,只使用一个LDAP查询是无法完成这个任务的。您需要将其拆分为子查询并分别运行它们,但如果要迭代的内容很多,这将会使域控制器崩溃。
我曾尝试按照我描述的方式进行操作,但性能非常差,至少在使用.NET可用模块时是如此。

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 https://dev59.com/L2025IYBdhLWcg3wChSc
        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();
        }

说实话,这对我没用 :) 但我认为这是因为我们域名的配置方式不同。如果没有别的问题,也许它会把你引导到正确的方向。


1
@jgauffin - 看起来限制通常在400个字符范围内(https://dev59.com/W3RB5IYBdhLWcg3wro6B#1883259)。如果在.Net/AD中也是类似的话,我不会感到惊讶。 - Peter

0

这怎么回答我的问题呢? - jgauffin
你没有提到你使用的是哪个操作系统。Windows 2003不会出错,它只是不会返回任何结果。 - Roland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接