C# LDAP-在MemberOf筛选器上使用通配符
我需要从特定类别中获取所有用户及其组 用户示例:C# LDAP-在MemberOf筛选器上使用通配符,c#,active-directory,ldap,wildcard,directorysearcher,C#,Active Directory,Ldap,Wildcard,Directorysearcher,我需要从特定类别中获取所有用户及其组 用户示例: user | memberof user1 | CN=group_1,OU=Groupes,OU=CR 1,DC=zcam,DC=ztech user1 | CN=group_2,OU=Groupes,OU=CR 1,DC=zcam,DC=ztech user2 | CN=group_2,OU=Groupes,OU=CR 1,DC=zcam,DC=ztech user3 | CN=group_3,OU=Groupes,OU=CR 2,DC=zc
user | memberof
user1 | CN=group_1,OU=Groupes,OU=CR 1,DC=zcam,DC=ztech
user1 | CN=group_2,OU=Groupes,OU=CR 1,DC=zcam,DC=ztech
user2 | CN=group_2,OU=Groupes,OU=CR 1,DC=zcam,DC=ztech
user3 | CN=group_3,OU=Groupes,OU=CR 2,DC=zcam,DC=ztech
我需要获取memberof
包含OU=Groupes、OU=cr1、DC=zcam、DC=ztech
的每个用户(我的示例中的user1和user2)
在这个文档()之后,我尝试了以下语法:
DirectoryEntry ldap = new DirectoryEntry("LDAP://xxx.xxx.xxx.xxx");
using (DirectorySearcher searcher = new DirectorySearcher(ldap))
{
// Works but return everything
searcher.Filter = "(&(objectClass=user)(memberof=*))";
// Works but only for one group
searcher.Filter = "(&(objectClass=user)(memberof=CN=group_1,OU=Groupes,OU=CR 1,DC=zcam,DC=ztechh))";
// Doesn't work because searcher.FindAll().Count returns 0
searcher.Filter = "(&(objectClass=user)(memberof=*,OU=Groupes,OU=CR 1,DC=zcam,DC=ztechh))";
// searcher.FindAll().Count returns 0
foreach (SearchResult result in searcher.FindAll())
{
[...]
}
在此()之后,我尝试通过
%
更改通配符*
,但结果没有改变。编辑版本;扩展到您的所有组X
(
&(objectClass=user)
(|(memberof=CN=group_1,OU=Groupes,OU=CR 1,DC=zcam,DC=ztechh)
(memberof=CN=group_2,OU=Groupes,OU=CR 1,DC=zcam,DC=ztechh))
)
编辑版本;扩展到您的所有
组X
(
&(objectClass=user)
(|(memberof=CN=group_1,OU=Groupes,OU=CR 1,DC=zcam,DC=ztechh)
(memberof=CN=group_2,OU=Groupes,OU=CR 1,DC=zcam,DC=ztechh))
)
我需要获取memberof包含OU=Groupes、OU=cr1、DC=zcam、DC=ztech的每个用户(我的示例中的user1和user2)
如果我理解正确的话,我想这句话概括了你要做的事情。您希望查找属于该OU中任何组的所有用户
Active Directory不允许在任何具有区分名称的属性上使用通配符。这包括成员
和成员
。因此,实现这一点的唯一方法是分两步进行:
查找该OU中所有组的区分名称
搜索其memberOf
包含步骤1中找到的一个值的所有用户
类似这样的东西(我还没有测试过这个广告,所以你可能需要调整它):
请注意,这将仅查找这些组的直接成员。它不会返回嵌套组中的用户(当用户位于属于这些组之一的组中时)。如果需要,可以调整过滤器,使其包含一个特殊标志,告知AD递归搜索:
userFilter.Append($"(memberOf:1.2.840.113556.1.4.1941:={result.Properties["distinguishedName"][0]})");
根据您的领域,您可能需要注意两件事:
这不会返回将其中一个组作为其主要组的用户,因为该关系不是使用member
/memberOf
存储的
如果这些组具有来自外部受信任域的成员,那么您最终将查找外部安全主体对象,而不是它们的实际用户对象。如果这对你来说是个问题的话,那完全是另一回事
如果你好奇的话,我已经写了几篇关于这个主题的文章。从这个开始:
我需要获取memberof包含OU=Groupes、OU=cr1、DC=zcam、DC=ztech的每个用户(我的示例中的user1和user2)
如果我理解正确的话,我想这句话概括了你要做的事情。您希望查找属于该OU中任何组的所有用户
Active Directory不允许在任何具有区分名称的属性上使用通配符。这包括成员
和成员
。因此,实现这一点的唯一方法是分两步进行:
查找该OU中所有组的区分名称
搜索其memberOf
包含步骤1中找到的一个值的所有用户
类似这样的东西(我还没有测试过这个广告,所以你可能需要调整它):
请注意,这将仅查找这些组的直接成员。它不会返回嵌套组中的用户(当用户位于属于这些组之一的组中时)。如果需要,可以调整过滤器,使其包含一个特殊标志,告知AD递归搜索:
userFilter.Append($"(memberOf:1.2.840.113556.1.4.1941:={result.Properties["distinguishedName"][0]})");
根据您的领域,您可能需要注意两件事:
这不会返回将其中一个组作为其主要组的用户,因为该关系不是使用member
/memberOf
存储的
如果这些组具有来自外部受信任域的成员,那么您最终将查找外部安全主体对象,而不是它们的实际用户对象。如果这对你来说是个问题的话,那完全是另一回事
如果你好奇的话,我已经写了几篇关于这个主题的文章。从这个开始:最后我找到了另一种方法。
事实上,memberof
中的属性OU=CR 1
对应于我的广告中的分区。
所以我只是这样过滤:
DirectoryEntry ldap = new DirectoryEntry("LDAP://xxx.xxx.xxx.xxx");
using (DirectorySearcher searcher = new DirectorySearcher(ldap))
{
searcher.Filter = "(&(objectClass=user)(division=CR 1))";
foreach (SearchResult result in searcher.FindAll())
{
[...]
}
谢谢大家的帮助。最后我找到了另一种方法。
事实上,memberof
中的属性OU=CR 1
对应于我的广告中的分区。
所以我只是这样过滤:
DirectoryEntry ldap = new DirectoryEntry("LDAP://xxx.xxx.xxx.xxx");
using (DirectorySearcher searcher = new DirectorySearcher(ldap))
{
searcher.Filter = "(&(objectClass=user)(division=CR 1))";
foreach (SearchResult result in searcher.FindAll())
{
[...]
}
谢谢大家的帮助。“所有用户及其组”-因此您希望搜索同时返回用户和组对象?请使用System.directoryservices.AccountManagement
名称空间,它更简单-“所有用户及其组”-那么您希望搜索同时返回用户和组对象吗?请使用System.directoryservices.AccountManagement
名称空间,这样更简单-