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
    名称空间,这样更简单-