4

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

我正在朝这个方向努力:

  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 名成员

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

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

有什么建议么?

4

2 回答 2

2

有什么问题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();
    }
}
于 2014-06-18T13:55:01.410 回答
2

首先:@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();
}
于 2014-06-16T15:34:23.927 回答