当前位置: 首页 > 知识库问答 >
问题:

C#LDAP查询以获取某些组中用户的管理器

公西天逸
2023-03-14

我目前写了一个c#脚本来检索属于三个独立用户组的用户——看起来像这样...

string DomainPath = "LDAP://DC=<dc>,DC=<dc>,DC=org";
DirectoryEntry searchRoot = new DirectoryEntry(DomainPath); 
DirectorySearcher search = new DirectorySearcher(searchRoot);
search.Filter = "(&(objectClass=user)(objectCategory=person)(|(memberof=CN=group1,OU=Groups,OU=<ou>,DC=dc,DC=<dc>,DC=org)(memberof=CN=group2,OU=Groups,OU=<ou>,DC=<dc>,DC=<dc>,DC=org)(memberof=CN=group3,OU=Groups,OU=<ou>,DC=<dc>,DC=<dc>,DC=org)))";
search.PropertiesToLoad.Add("samaccountname");
search.PropertiesToLoad.Add("mail");
search.PropertiesToLoad.Add("usergroup");
search.PropertiesToLoad.Add("displayname");
search.PropertiesToLoad.Add("manager");
SearchResult result;
SearchResultCollection resultCol = search.FindAll();

使用这段代码,我能够检索为此用户公开的任何属性,包括“manager”记录。manager记录在此级别作为DN公开:

Manager = "CN=MTK93,OU=Users,OU=<ou>,DC=<dc>,DC=<dc>,DC=org"

真正需要的是能够递归地获取现有查询返回的每个管理人员的所有用户属性,然后将它们组合到一个数据集中...

例如,考虑下面的层次结构…

Lisa (manager's manager)
   | 
   | -- Tim (Manager)
   |    mail = tim@a.com, usergroup = groupA, manager = Lisa
   |     | 
   |     |-- Mike
   |     |    mail = mike@a.com, usergroup = group1, manager = Tim
   |     |-- Lori
   |     |    mail = lori@a.com, usergroup = group2, manager = Tim
   | -- Katie (another manager)
         |    mail = katie@a.com, usergroup = groupB, manager = Lisa
         |
         |-- John
         |    mail = john@a.com, usergroup = group3, manager = Katie
         |-- Larry
              mail = larry@a.com, usergroup = group4, manager = Katie

我的查询返回mike、lori、katie和john,因为他们存在于我要查询的组(组1、组2、组3)中,但我也需要Tim和katie的用户记录(因为他们是属于这些组的人的经理)

理想的输出应该是这样的...

Name       Mail        Group        Manager
------------------------------------------------
Mike     mike@a.com   group1        Tim's DN
Lori     lori@a.com   group2        Tim's DN
John     john@a.com   group3        Katie's DN
Katie    katie@a.com  groupB        Lisa's DN
Tim      time@a.com   groupA        Lisa's DN

注意:我不希望Lisa(在她下面的级别中没有人属于第一组、第二组或第三组)或Larry(不属于第一组、第二组或第三组)

事实证明,这个LDAP查询的递归性质很难弄清楚。

共有1个答案

文寒
2023-03-14

我通过以下方法获得了所需的结果:

>

// class variable
List<ActiveDirectoryUser> recordsToInsert;

// build the query appender
string queryAppender = "";
foreach (string activeDirectoryGroup in activeDirectoryGroups)
{
    queryAppender += "(memberof=CN=" + activeDirectoryGroup + ",OU=Groups,OU=<<ou>>,DC=<<dc>>,DC=<<dc>>,DC=<org>>)";
}

// create the ldap query string
var ldapQueryForUsersInDtGroups = "(&(objectClass=user)(objectCategory=person)(|" + queryAppender + "))";

// first get the users that belong to the active directory groups...
recordsToInsert = getEmployeeRecordsFromLdapQuery(ldapQueryForUsersInDtGroups);

// then, query again to make sure we are including the managers for the people returned from the first query
var distinctManagers = (from record in recordsToInsert select record.manager).Distinct();

// build an ldap query to get only the records for the managers we need
// example query string with 2 managers: 
// (&(objectClass=user)(objectCategory=person)

queryAppender = "";
foreach (var manager in distinctManagers)
{
    queryAppender += "(distinguishedName=" + manager + ")";
}

// ldap query filter for the managers
var ldapQueryForManagers = "(&(objectClass=user)(objectCategory=person)(|" + queryAppender + "))";

// combine the result set with the managers result set
recordsToInsert.AddRange(getEmployeeRecordsFromLdapQuery(ldapQueryForManagers));

// filter off any duplicates.
uniqueRecordsToInsert = recordsToInsert.GroupBy(x => x.employeeId).Select(x => x.First()).ToList<ActiveDirectoryUser>();
 类似资料:
  • 我是LDAP的新手,我尝试过在OpenLDAP上实现RBAC。我创建了一些用户(inetOrganizationPerson)并将它们放在组中(groupOfNames)。接下来,我创建了一些角色(organizationalRole)并将它们与用户组关联(RoleIncuspant),而不是直接将它们与用户关联。 1)/usr/local/bin/ldapsearch-x-b'ou=groups

  • 嗨,我试图从LDAP和该组中的用户获取所有postxGroup。下面的代码是我到目前为止所做的,它返回我所有的组,但我不知道如何获得这些组的用户。请指导我这种做法好吗?或者我应该先得到用户,然后根据GID得到组名?

  • 我正在Windows域(Active Directory)中的TeamCity 7.1.2中配置LDAP身份验证。 基本上它可以工作(我可以用我的域用户登录!),但是整个公司的每个用户都可以登录。 -->现在我试图限制只有开发人员才能访问。 我在TeamCity文档中找到了这个例子: “companyname”、“it”和“entwickler”是组织单位。 我理解语法是: 当我把它放入TeamC

  • 我有3个表:,, 我需要获得一个特定组中的用户列表,所有用户都需要包含作为成员的所有组。 我试过这样的东西: 但这将返回组中id为SOMEID所有用户,且仅连接用于搜索的一个组,即使一个用户是多个组的成员。 多谢了。

  • 本文向大家介绍MongoDB中查询数组以获取特定值,包括了MongoDB中查询数组以获取特定值的使用技巧和注意事项,需要的朋友参考一下 要从数组中获取特定值,请使用aggregate()和$project。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是如何在MongoDB中查询数组- 这将产生以下输出-

  • 我正在尝试验证Nexus Sonatype配置。我从这里发现了Groovy脚本: https://github . com/savoirfairelinux/ansi ble-nexus 3-OSS/tree/master/templates/groovy 我能够在Nexus Sonatype中配置LDAP,甚至创建一个新角色(不是从LDAP)。但现在我正在搜索如何获取LDAP用户,然后将他们放在