- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
因此,我正在尝试通过递归枚举 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/
我正在尝试重命名一个组。我的代码如下所示 PrincipalContext context = new PrincipalContext(ContextType.Machine); GroupPrin
我需要按以下格式列出特定本地组中的所有用户:“域\用户名”。我可以为组提取 GroupPrincipal 对象的集合,但我不知道如何以所需格式获取用户。 GroupPrincipal 没有属性域。 以
在我们的环境中有两个 AD 域:DomainA 和 DomainB。有一种从 DomainB 到 DomainA 的信任方式。 我们正在使用以下代码从域中的服务器列出来自域 A 的 AD 组的所有用户
我使用 查询特定域中的所有安全组 PrincipalSearchResult results = ps.FindAll(); 其中 ps 是 PrincipalSearcher。 然后我需要迭代结果(
我有一个函数可以检查一个组是否是一个组的成员。我有 2 个函数变体,都没有按预期工作: public bool IsGroupGroupMember(GroupPrincipal gp, GroupP
我正在尝试按组名获取所有用户并将其显示在 Sharepoint Web 部件中。 adGroupName 类似 = "CompanyGroup"。 GroupPrincipal grp = Group
因此,我正在尝试通过递归枚举 AD 组成员资格来取得进展。目前我有... PrincipalContext ctx = new PrincipalContext(ContextType.Domain,
我正在尝试使用 GroupPrincipal(System.DirectoryServices.AccountManagement 命名空间的一部分)来填充字符串类型的列表,因此我可以检查是否有用户是
我有以下 C# 代码,可以将用户添加到现有组。现在每次我尝试将用户添加到组时都会抛出以下错误: Unable to cast COM object of type 'System.__ComObjec
我想扩展 GroupPrincipal 类来处理一些自定义属性: using System.DirectoryServices.AccountManagement; [DirectoryRdnPref
将此代码部署到标识为应用程序池用户的 Web 应用程序时,以下代码会引发未知的 COM 异常。调用 FindByIdentity 方法时发生异常。 System.Runtime.InteropServ
我正在使用 System.DirectoryServices.AccountManagement 中的 GroupPrincipal 类在 Active Directory 中创建和更新组。创建和更新
为什么会 GroupPrincipal group = GroupPrincipal.FindByIdentity(getPrincipalContext(),
我有一个小组,我们称它为 GotRocks。我正在尝试获取其所有成员,但在 DirectoryEntry 和 AccountManagement 之间我得到的结果在计数方面截然不同。以下是按成员检索方
我正在使用 System.DirectoryServices.AccountManagement命名空间类来管理多个组的成员资格。这些团体控制着我们打印会计系统的人口,其中一些非常庞大。我在从这些大组
我在域中使用方法 UserPrincipal.Current.ToString() 来获取当前登录域用户的有效域。但是当我在一个字符串中显示它时,它在 IIS 服务器中托管时出现错误: Unable
我正在尝试创建一个这样的委托(delegate)人: PrincipalContext pc = new PrincipalContext(ContextType.Machine); GroupPri
这与其说是一个问题,不如说是给遇到同样问题的任何人的信息。 出现以下错误: System.DirectoryServices.AccountManagement.PrincipalOperationE
我正在尝试在 C# .NET 网络应用程序中创建广告组。该应用程序在具有创建组的用户权限的应用程序池中运行。如果我在以该用户身份登录后尝试创建一个组,它工作正常,但不是来自网络应用程序。这是相关代码:
我正在使用 System.DirectoryServices.AccountManagement查询用户,然后查找该用户的组。 var _principalContext = new Principa
我是一名优秀的程序员,十分优秀!