gpt4 book ai didi

C# - GroupPrincipal.GetMembers(true) - 哪个组?

转载 作者:太空狗 更新时间:2023-10-29 23:31:57 27 4
gpt4 key购买 nike

因此,我正在尝试通过递归枚举 AD 组成员资格来取得进展。目前我有...

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "mine.domain.com");
GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, "myADGroup");
if (grp != null)
{
foreach (Principal p in grp.GetMembers(true))
{
Console.WriteLine(p.Name);
}
}

当然,这一切都很好。它列出了作为该组成员的每个用户以及作为嵌套在其中的组成员的所有用户,无论嵌套级别有多深。这很棒。

我真正需要的是知道用户来自这个小嵌套中的什么组。

GRP-MainProject
-- GRP-Producers
-- GRP-Artists
-- UserA

针对 GRP-MainProject 运行我当前的查询将返回 UserA - 我应该如何返回用户以及他从 GRP-MainProject 继承成员资格的 GRP-Artists 的事实?

UserA 是大约 40 个组的成员,以防万一。 编辑 - 值得一提的是,用户可以拥有来自多个嵌套组的组成员身份。

如有任何想法,我们将不胜感激。

最佳答案

也许可以尝试这样的事情:

声明组对象的静态列表(GroupPrincipal 的简单类、整数级别和父 GroupPrincipal)

public class SomeDirTraverser
{
private static List<GroupObj> _groups = new List<GroupObj>();

public List<string> GetMembershipWithPath(string groupname)
{
List<string> retVal = new List<string>();

PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, groupname);
if (grp != null)
{
BuildHList(grp, 0, null);
foreach (UserPrincipal usr in grp.GetMembers(true))
retVal.Add(GetMbrPath(usr));
}

return retVal;
}

private void BuildHList(GroupPrincipal node, int level, GroupPrincipal parent)
{
PrincipalSearchResult<Principal> rslts = node.GetMembers();
_groups.Add(new GroupObj() { Group = node, Level = level, Parent = parent });
foreach (GroupPrincipal grp in rslts.Where(g => g is GroupPrincipal))
BuildHList(grp, level + 1, node);
}

private string GetMbrPath(UserPrincipal usr)
{
Stack<string> output = new Stack<string>();
StringBuilder retVal = new StringBuilder();
GroupObj fg = null, tg = null;
output.Push(usr.Name);
foreach (GroupObj go in _groups)
{
if (usr.IsMemberOf(go.Group))
{
output.Push(go.Group.Name);
fg = go;
while (fg.Parent != null)
{
output.Push(fg.Parent.Name);
tg = (from g in _groups where g.Group == fg.Parent select g).FirstOrDefault();
fg = tg;
}
break;
}
}
while (output.Count > 1)
retVal.AppendFormat("{0} ->", output.Pop());
retVal.Append(output.Pop());

return retVal.ToString();
}
}

public class GroupObj
{
public GroupPrincipal Group { get; set; }
public int Level { get; set; }
public GroupPrincipal Parent { get; set; }
}

这个看起来应该能满足您的需求。

关于C# - GroupPrincipal.GetMembers(true) - 哪个组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18116092/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com