Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找用户管理的所有组_C#_Active Directory_Ldap - Fatal编程技术网

C# 查找用户管理的所有组

C# 查找用户管理的所有组,c#,active-directory,ldap,C#,Active Directory,Ldap,我们得到了一个特殊的多值属性。让我们称之为ourOwnManagedBy,它可以包含管理当前组的用户或组(其DN) 如何检索特定用户管理的所有组的列表(在managedBy和ourOwnManagedBy的帮助下) 比如说。假设用户是组GlobalAdministrators的成员,并且组ApplicationAdministrators将GlobalAdministrations作为成员。最后是组MyApplication,它在ourOwnManagedBy属性中有ApplicationAdm

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

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

比如说。假设用户是组GlobalAdministrators的成员,并且组ApplicationAdministrators将GlobalAdministrations作为成员。最后是组MyApplication,它在
ourOwnManagedBy
属性中有ApplicationAdministrators

  • 用户
    全球管理员
  • GlobalAdministrators
    ApplicationAdministrators
  • MyApplication
    get
    ApplicationAdministrators
    in
    ourown-managedby
如何使用该信息查找特定用户管理的所有组?是否可以在自定义属性(包含用户和组的DNs)中执行某种递归检查

更新

我尝试使用如下目录搜索筛选器:

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

但我可能误解了
1.2.840.113556.1.4.1941
的功能?()

下一页说,您使用的LDAP匹配规则传递评估在Windows 2008及更高版本中有效。如果您使用的是2003,它可能不起作用。

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


我试着按照我描述的方式来做,但性能非常糟糕,至少使用.NET的可用模块来做。

没有递归,不知道如何在性能方面做,可能会有bug

        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();
        }
string user=“username”;
//获取域
DirectoryEntry de=System.DirectoryServices.ActiveDirectory.Domain.GetCurrentDomain().GetDirectoryEntry();
//首先获取用户dn
字符串userDN;
使用(var searcher=newdirectorysearcher(de))
{
searcher.Filter=String.Format(&(objectCategory=person)(objectClass=user)(sAMAccountName={0})),user);
searcher.PropertiesToLoad.Add(“DiscrimitedName”);
userDN=searcher.FindOne().Properties[“DiscrimitedName”][0].ToString();
}
//获取所有用户组的列表
列出小组;
//看http://stackoverflow.com/questions/6252819/find-recursive-group-membership-active-directory-using-c-sharp
使用(var searcher2=newdirectorysearcher(de))
{
searcher2.Filter=String.Format(“(成员:1.2.840.113556.1.4.1941:={0})”,userDN);
searcher2.SearchScope=SearchScope.Subtree;
searcher2.PropertiesToLoad.Add(“distrignizedName”);
SearchResultCollection src=searcher2.FindAll();
组=(来自src中的SearchResult c
选择c.Properties[“DifferentizedName”][0].ToString()).ToList();
}
//构建巨型搜索查询
SearchResultCollection组;
使用(var searcher=newdirectorysearcher(de))
{
字符串baseString=“(|{0})”;
字符串managedbybase=“(managedBy={0})”;
//我已经读到,您可以使用standard='s搜索多值列表。
字符串ourOwnManagedByBase=“(ourOwnManagedBy={0})”;
StringBuilder sb=新的StringBuilder();
//将用户DN添加到组DN的列表中
添加(userDN);
foreach(组中的字符串g)
{
sb.附录格式(managedbybase,g);
sb.附录格式(我们自己的ManagedBybase,g);
}
searcher.Filter=string.Format(baseString,sb.ToString());
srcGroups=searcher.FindAll();
}

老实说,这对我来说并不起作用:)但我认为这是因为我们的域的配置方式。如果没有其他东西,也许它会把你推向正确的方向。

这如何回答我的问题?你没有提到你使用的是哪种操作系统。Windows 2003不会出错,它不会只返回任何结果。这是愚蠢的,但链接站点上的代码示例将其DN括在大括号内。你也试过吗?我不指望它会有什么不同,但我没有试过。是的,试过了。但是谢谢你的邀请suggestion@jgauffin-看起来限制通常在400个字符范围内()。如果它在.Net/AD中类似,我也不会感到惊讶。