【问题标题】:LDAP - Use of wildcard on MemberOf filterLDAP - 在 MemberOf 过滤器上使用通配符
【发布时间】:2019-03-21 10:19:44
【问题描述】:

我需要从特定类别中获取所有用户及其组。

用户示例:

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=CR 1,DC=zcam,DC=ztech 的每个用户(我的示例中的user1 和user2)

按照这个文档 (https://docs.microsoft.com/fr-fr/windows/desktop/ADSI/search-filter-syntax) 我尝试了以下语法:

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()) 
    {
        [...]
    }

在此 (https://community.servicenow.com/community?id=community_question&sys_id=00d29fa1db101fc01dcaf3231f96197f) 之后,我尝试将通配符 * 更改为 %,但并没有改变结果。

【问题讨论】:

  • "所有用户和他们的组" - 所以你希望搜索返回用户 组对象?
  • 改用System.DirctoryServices.AccountManagement命名空间,这更容易 - docs.microsoft.com/en-us/dotnet/api/…

标签: c# active-directory ldap wildcard directorysearcher


【解决方案1】:

我需要获取 memberof 包含 OU=Groupes,OU=CR 1,DC=zcam,DC=ztech 的每个用户(我的示例中的 user1 和 user2)

如果我理解正确,我认为这句话总结了你想要做的事情。您想查找属于该 OU 中任何组的所有用户。

Active Directory 不允许您在任何采用distinguishedName 的属性上使用通配符。这包括membermemberOf。所以唯一的办法就是分两步:

  1. 查找该 OU 中所有组的 distinguishedName
  2. 搜索其memberOf 包含步骤1 中找到的值之一的所有用户。

类似这样的东西(我没有针对 AD 测试过,所以你可能需要调整它):

var groupSearch = new DirectorySearcher(
    new DirectoryEntry("LDAP://OU=Groupes,OU=CR 1,DC=zcam,DC=ztech"), //notice the OU
    "(objectClass=group)");

//if you don't do this, it will return *every* attribute, which is slower
groupSearch.PropertiesToLoad.Add("distinguishedName");

//build a user query with all the groups
var userFilter = new StringBuilder("(&(objectClass=user)(|");
using (var results = groupSearch.FindAll()) {
    foreach (SearchResult result in results) {
        userFilter.Append($"(memberOf={result.Properties["distinguishedName"][0]})");
    }
}
userFilter.Append(")");

var userSearch = new DirectorySearcher(
    new DirectoryEntry("LDAP://DC=zcam,DC=ztech"),
    userFilter.ToString());

//userSearch.PropertiesToLoad.Add(""); //add only the attributes you need to make it quicker

using (var results = userSearch.FindAll()) {
    foreach (SearchResult result in results) {
        //do something
    }
}

请注意,这只会找到这些组的direct 成员。它不会返回嵌套组中的用户(当用户在属于这些组之一的组中时)。如果需要,您可以调整过滤器以包含一个告诉 AD 递归搜索的特殊标志:

userFilter.Append($"(memberOf:1.2.840.113556.1.4.1941:={result.Properties["distinguishedName"][0]})");

根据您的域,您可能需要注意两件事:

  1. 这不会返回将这些组之一作为主要组的用户,因为该关系不是使用member/memberOf 存储的。
  2. 如果这些组的成员来自外部可信域,那么您最终会找到外部安全主体对象,而不是它们的实际用户对象。如果这对您来说是个问题,那就另当别论了。

如果你好奇的话,我已经写了几篇关于这个主题的文章。从这个开始:Active Directory: What makes a member a member?

【讨论】:

    【解决方案2】:

    编辑版本;扩展你所有的group_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))
    )
    

    【讨论】:

      【解决方案3】:

      我终于找到了另一种方法。 其实memberof中的这个属性OU=CR 1对应我AD中的划分。 所以我只是像这样过滤:

      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()) 
          {
              [...]
          }
      

      感谢大家的帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-22
        • 2021-01-18
        • 2016-05-03
        • 1970-01-01
        • 1970-01-01
        • 2021-08-02
        • 2018-10-08
        • 1970-01-01
        相关资源
        最近更新 更多