Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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# 递归方法在PropertyValueCollection分配上引发未指定的错误_C#_Asp.net_Recursion_Active Directory - Fatal编程技术网

C# 递归方法在PropertyValueCollection分配上引发未指定的错误

C# 递归方法在PropertyValueCollection分配上引发未指定的错误,c#,asp.net,recursion,active-directory,C#,Asp.net,Recursion,Active Directory,我正在制作一个使用Active Directory的ASP.NET intranet网站,我正在尝试获取用户所属的所有组,甚至子组等。。。这意味着我必须按照这里给出的示例,使用递归方法加载ArrayList中的所有组: 因此,我有一种基于组成员身份递归填充ArrayList的方法: public ArrayList AttributeValuesMultiString(string attributeName, string objectDn,

我正在制作一个使用Active Directory的ASP.NET intranet网站,我正在尝试获取用户所属的所有组,甚至子组等。。。这意味着我必须按照这里给出的示例,使用递归方法加载ArrayList中的所有组:

因此,我有一种基于组成员身份递归填充ArrayList的方法:

public ArrayList AttributeValuesMultiString(string attributeName, string objectDn, 
                                            ArrayList valuesCollection, bool recursive)
{
    DirectoryEntry ldapConnection = new DirectoryEntry(objectDn);
    PropertyValueCollection valueCollection = ldapConnection.Properties[attributeName];
    IEnumerator en = valueCollection.GetEnumerator();

    while (en.MoveNext())
    {
        if (en.Current != null)
        {
            if (!valuesCollection.Contains(en.Current.ToString()))
            {
                valuesCollection.Add(en.Current.ToString());
                if (recursive)
                {
                    AttributeValuesMultiString(attributeName, "LDAP://" +
                    en.Current.ToString(), valuesCollection, true);
                }
            }
        }
    }
    ldapConnection.Close();
    ldapConnection.Dispose();
    return valuesCollection;
}
我从另一个方法调用:

public ArrayList Groups(string userDn, bool recursive)
{
    ArrayList groupMemberships = new ArrayList();
    return AttributeValuesMultiString("memberOf", userDn, groupMemberships, recursive);
}
使用递归布尔值,我可以构建组的arraylist,但第一种方法可以用于其他多字符串对象加载。现在,当我通过一个简单的方法调用来测试它时

//adManager is an instance of the class containing the methods above
//groups is an ArrayList
//testChain is my distinguishedName
groups = adManager.Groups(testChain, true);
foreach (var g in groups)
    Console.WriteLine(g.ToString());
我有以下例外:

System.Runtime.InteropServices.COMException : Unspecified error
我有一个例外是在作业中:

PropertyValueCollection valueCollection = ldapConnection.Properties[attributeName];
我真的看不出有什么问题,尤其是在另一个SO线程上推荐了这种方法,所以我猜它是功能性的

编辑我的问题似乎来自身份验证问题。我在测试代码中添加了模拟,但仍然出现异常:

using (HostingEnvironment.Impersonate())
{
    var domainContext = new PrincipalContext(ContextType.Domain, "radiofrance.rootad.inetrf");
    var groupPrincipal = GroupPrincipal.FindByIdentity(domainContext, IdentityType.Name, "Users");
    if (groupPrincipal != null)
    {
        groups = adManager.Groups(testChain, true);
        foreach (var g in groups)
            Console.WriteLine(g.ToString());
    }
    else
        Console.WriteLine("Fail");
}

如果您有用户可分辨名称,则可以加载tokenGroups属性,该属性包含用户所属的所有组(包括嵌套组)。您必须执行的唯一操作是解析组SID,因为令牌组是SID的集合。为此,您可以通过DirectoryEntry使用sid绑定绑定到列表中的每个组。代码的问题是,您必须检索memberOf user属性,然后展开列表中每个组的members属性。memberOf属性既不包含来自其他域的组,也不包含非用户主域的组group@oldovets关于令牌组,以这种方式?我不知道memberOf的事,我会试试的tokenGroups@oldovets那就解决了,谢谢@oldovets如果你能给出一个令牌组的例子,我会把它标记为答案,否则我会把它写下来。