AD 获取具有继承成员身份的组中的用户

本文关键字:用户 身份 成员 获取 继承 AD | 更新日期: 2023-09-27 18:35:53

我正在尝试导出特定AD组的成员。我有一个有效的解决方案来获取 ALL 和过滤,但如果我想要的组有 5 个可能的用户中的 1000 个,这似乎有些过分。

我正在朝这个方向努力:

  public void PrintMembers(string groupname, string domain)
        {
            GroupPrincipal group = GroupPrincipal.FindByIdentity(new PrincipalContext(ContextType.Domain, domain), groupname);
            foreach (Principal princ in group.Members)
            {
                if (princ.StructuralObjectClass == "user")
                {
                    Response.Write(UserPrincipal.FindByIdentity(new PrincipalContext(ContextType.Domain, domain), princ.Name));
                }
            }
        }

这种方法有效,但无法为通过基础组继承成员资格的成员提供信息。

所以:"特定组 1" = 我让所有 5 个成员都没问题

"特定组 2"= 我让所有 7 名成员都没问题

"母组",包含上面的两个组=我没有成员...

我可以迭代该组子组,但觉得必须有另一种方法......

有什么建议吗?

AD 获取具有继承成员身份的组中的用户

GetMembers(true)有什么问题吗?

static void Main(string[] args)
{
    foreach (string user in GetMemberNames("My Group", "domain.local"))
    {
        Console.WriteLine(user);
    }
    Console.ReadKey();
}
public static string[] GetMemberNames(string groupname, string domain)
{
    using (PrincipalContext context = new PrincipalContext(ContextType.Domain, domain))
    using (GroupPrincipal group = GroupPrincipal.FindByIdentity(context, groupname))
    using (PrincipalSearchResult<Principal> results = group.GetMembers(true))
    {
        return results.OfType<UserPrincipal>().Select(u => u.SamAccountName).ToArray();
    }
}

首先:@shriop指出您问题的确切答案。

就赏金而言,也就是说:"一种使用LDAP协议枚举组中的用户及其子组而不递归的解决方案"。这是从Windows Server 2003 SP2开始与Active-Directory一起工作的东西,称为LDAP_MATCHING_RULE_IN_CHAIN。它以递归方式(但在一个查询中)搜索组中的所有用户(请注意,它会从安全组和通讯组返回用户)。下面是 C# 中的 ADSI 用法:

static void Main(string[] args)
{
  /* Connection to Active Directory
   */
  string sFromWhere = "LDAP://SRVENTR2:389/dc=societe,dc=fr";
  DirectoryEntry deBase = new DirectoryEntry(sFromWhere, "societe''administrateur", "test.2011");
  /* To find all the users member of groups "Grp1"  :
   * Set the base to the groups container DN; for example root DN (dc=societe,dc=fr) 
   * Set the scope to subtree
   * Use the following filter :
   * (member:1.2.840.113556.1.4.1941:=CN=Grp1,OU=MonOu,DC=X)
   */
  DirectorySearcher dsLookFor = new DirectorySearcher(deBase);
  dsLookFor.Filter = "(&(memberof:1.2.840.113556.1.4.1941:=CN=Grp1,OU=MonOu,DC=societe,DC=fr)(objectCategory=user))";
  dsLookFor.SearchScope = SearchScope.Subtree;
  dsLookFor.PropertiesToLoad.Add("cn");
  dsLookFor.PropertiesToLoad.Add("samAccountName");  
  SearchResultCollection srcUsers = dsLookFor.FindAll();
  /* Just show each user
   */
  foreach (SearchResult srcUser in srcUsers)
  {
    Console.WriteLine("{0}", srcUser.Path);
    Console.WriteLine("{0}", srcUser.Properties["samAccountName"][0]);
  }
  Console.ReadLine();
}