C# 递归方法在PropertyValueCollection分配上引发未指定的错误
我正在制作一个使用Active Directory的ASP.NET intranet网站,我正在尝试获取用户所属的所有组,甚至子组等。。。这意味着我必须按照这里给出的示例,使用递归方法加载ArrayList中的所有组: 因此,我有一种基于组成员身份递归填充ArrayList的方法: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,
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如果你能给出一个令牌组的例子,我会把它标记为答案,否则我会把它写下来。