如何查询Active Directory中的所有组和组成员
本文关键字:组成员 Directory 何查询 查询 Active | 更新日期: 2023-09-27 18:26:00
我正在查看DirectoryServices
命名空间,并试图获得AD中所有组的列表,并将它们加载到列表框中。
当我选择一个组时,我希望它在一个文本框中填写经理的姓名,在另一个列表框中填写分配给该组的所有用户。我很难理解这个过程。有人能帮我吗?
如果我有一个完整的例子,我很肯定我会更好地理解大局。TIA
如果您在.NET 3.5或更新版本上运行,您可以使用PrincipalSearcher
和"query-by-example"主体进行搜索:
// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
// define a "query-by-example" principal - here, we search for a GroupPrincipal
GroupPrincipal qbeGroup = new GroupPrincipal(ctx);
// create your principal searcher passing in the QBE principal
PrincipalSearcher srch = new PrincipalSearcher(qbeGroup);
// find all matches
foreach(var found in srch.FindAll())
{
GroupPrincipal foundGroup = found as GroupPrincipal;
if(foundGroup != null)
{
// do whatever you need to do, e.g. put name into a list of strings or something
}
}
如果您还没有完全阅读MSDN的文章《在.NET Framework 3.5中管理目录安全主体》,该文章很好地展示了如何充分利用System.DirectoryServices.AccountManagement
中的新功能
当你有一个给定的小组时,你可以通过使用轻松获得其所有小组成员
// find the group in question (or load it from e.g. your list)
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "YourGroupNameHere");
// if found....
if (group != null)
{
// iterate over members
foreach (Principal p in group.GetMembers())
{
Console.WriteLine("{0}: {1}", p.StructuralObjectClass, p.DisplayName);
// do whatever you need to do to those members
}
}
我使用System.DirectoryServices.AccountManagement
名称空间提出了类似于marc_s的东西:
PrincipalContext context = new PrincipalContext(ContextType.Domain);
GroupPrincipal queryPrincipal = new GroupPrincipal(context);
using (PrincipalSearcher searcher = new PrincipalSearcher(queryPrincipal))
using (PrincipalSearchResult<Principal> allPrincipals = searcher.FindAll())
foreach (GroupPrincipal groupPrincipal in allPrincipals.OfType<GroupPrincipal>())
{
// Process group...
foreach (UserPrincipal userPrincipal in groupPrincipal.Members.OfType<UserPrincipal>())
{
// Process group member...
}
}
UserPrincipal
类似乎不会公开任何允许您确定用户是否是和/或是否有管理员的成员,但您仍然可以通过获取用户的DirectoryEntry
来实现这一点:
DirectoryEntry userEntry = userPrincipal.GetUnderlyingObject() as DirectoryEntry;
if (userEntry != null)
{
bool isManager = userEntry.Properties["directReports"].Count > 0;
bool isManaged = userEntry.Properties["manager"].Count > 0;
// Perform further processing...
}
不过,您需要一些额外的逻辑来确定用户是否是您当前关注的组中的经理,而不是其他组中的某个经理。也许可以检查directReports
属性,看看其中包含的任何用户是否是当前组的成员。