C# 为用户递归地获取组总是会得到不同的结果

C# 为用户递归地获取组总是会得到不同的结果,c#,active-directory,ldap,C#,Active Directory,Ldap,我目前正在处理产品中授权系统的一部分,我们在获取用户所在的所有组(包括嵌套组)时遇到问题 用户MyUser属于以下组: GroupA GroupB GroupB是GroupC的成员,GroupC是GroupD的成员。 我想要的输出是:GroupA、GroupB、GroupC、GroupD 在我的代码中,几乎每次运行查询时,我都会为完全相同的用户获得不同的结果。 结果从完整列表到仅第一级或仅GroupD缺失,各不相同 我的代码如下。 我用IndexOf解析字符串的部分只是为了获取组名本身,因为返回

我目前正在处理产品中授权系统的一部分,我们在获取用户所在的所有组(包括嵌套组)时遇到问题

用户
MyUser
属于以下组:
GroupA
GroupB

GroupB
GroupC
的成员,
GroupC
GroupD
的成员。 我想要的输出是:
GroupA、GroupB、GroupC、GroupD

在我的代码中,几乎每次运行查询时,我都会为完全相同的用户获得不同的结果。 结果从完整列表到仅第一级或仅
GroupD
缺失,各不相同

我的代码如下。 我用
IndexOf
解析字符串的部分只是为了获取组名本身,因为返回的值类似于
CN=GroupA,OU=Groups,OU=XYZ,DC=abc,DC=XXX

static void Main(string[] args)
{
    var groups = new List<string>();
    var searcher = new DirectorySearcher(...);
    GetGroupsRecursively("MyUser", groups, searcher);
}

private static void GetGroupsRecursively(string group, List<string> groups, DirectorySearcher search)
{
    search.Filter = string.Format("(cn={0})", group);
    search.PropertiesToLoad.Add("memberOf");

    var searchResults = search.FindAll();
    foreach (SearchResult result in searchResults)
    {
        foreach (var dn in result.Properties["memberof"].Cast<string>())
        {
            var equalsIndex = dn.IndexOf("=", 1);

            if (equalsIndex != -1)
            {
                var commaIndex = dn.IndexOf(",", 1);
                var subGroup = dn.Substring(equalsIndex + 1, commaIndex - equalsIndex - 1);
                if (!groups.Contains(subGroup))
                {
                    groups.Add(subGroup);
                    GetGroupsRecursively(subGroup, groups, search);
                }
            }
        }
    }
}
static void Main(字符串[]args)
{
变量组=新列表();
var searcher=newdirectorysearcher(…);
快速获取组(“MyUser”、组、搜索者);
}
私有静态void GetGroupsRecursive(字符串组、列表组、DirectorySearcher搜索)
{
search.Filter=string.Format(“(cn={0})”,group);
search.PropertiesToLoad.Add(“memberOf”);
var searchResults=search.FindAll();
foreach(searchResults中的SearchResult)
{
foreach(result.Properties[“memberof”].Cast()中的变量dn)
{
var equalsIndex=dn.IndexOf(“=”,1);
如果(相等索引!=-1)
{
var commaIndex=dn.IndexOf(“,”,1);
var subGroup=dn.Substring(equalsIndex+1,commaIndex-equalsIndex-1);
如果(!groups.Contains(subGroup))
{
组。添加(子组);
快速获取组(子组、组、搜索);
}
}
}
}
}
我的组队方式有问题吗?(请不要建议使用
PrincipalContext
或类似内容,因为我们无法在此处使用它们。)


这可能是广告服务器的配置问题吗?

您是为同一用户还是为属于同一组的不同用户获得不同的结果?我为完全相同的用户获得不同的结果。我现在在问题中指出了这一点。这不是最干净的方法,看看这里真正奇怪的是你使用的是同一个搜索程序,而不是每次都创建一个新的…@JPBlanc谢谢你的建议,但正如我指出的,我们不能使用PrincialContext。