我目前正在使用我们产品中的授权系统的一部分,我们遇到的问题是获取用户所在的所有组(包括嵌套组)。
用户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);
}
}
}
}
}
我获得小组的方式有问题吗? (请不要建议使用PrincipalContext
等,因为我们不能在这里使用它们。)
这可能是AD服务器的配置问题吗?