首页 文章

从Active Directory组获取所有用户

提问于
浏览
0

我使用以下代码从特定域中的特定Active Directory组获取所有用户 . 这段代码工作正常 .

using (var context = new PrincipalContext(ContextType.Domain, "dept.mycomp.net"))
{
    using (var group = GroupPrincipal.FindByIdentity(context, "IT Team"))
    {
        if (group != null)
        {
            var users = group.GetMembers(true);

            foreach (UserPrincipal user in users)
            {
                Console.WriteLine("Name: " + user.DisplayName);
                Console.WriteLine("Network Id: " + user.SamAccountName);
            }
        }
    }
}

我看到Active Directory查找窗口中有 Entire Directory 选项 . 所以我搜索了一下,发现以下代码;这段代码将从 Entire Directory 根级别获取所有用户 . 在我的情况下,此代码也正常工作:

var currentForest = Forest.GetCurrentForest();
var gc = currentForest.FindGlobalCatalog();

using (var userSearcher = gc.GetDirectorySearcher())
{
    userSearcher.Filter = "(&((&(objectCategory=Person)(objectClass=User)))(samaccountname=" + username + "))";
    SearchResult result = userSearcher.FindOne();
}

Question :如何修改后面的代码以获取根级别的特定组的所有用户?我只会传递 GroupName 而不是 Domain & Group Name .

1 回答

  • 0

    Entire Directory 选项搜索全局编录,而不仅仅是域,因为它看起来像是've found out. The only difference in the search is which port it connects to. Port 389 is the LDAP port, which searches only the domain of the server you'连接到 . 端口3268是全局目录 . 一个简短的形式是使用 GC:// 而不是 LDAP:// .

    如果您_118903_ ll保存 GetCurrentForest()FindGlobalCatalog() 的网络请求 .

    这就是我的意思:

    var searcher = new DirectorySearcher(new DirectoryEntry("GC://dept.mycomp.net"));
    

    关于搜索特定组的其他问题:请记住,全局编录会搜索您的AD林,该林可以是多个域 . 任何对象的名称仅在域内强制唯一,而不是林 . 因此,如果您在GC中搜索组的名称,则可能会获得重复项 . (所有域名都可能有“IT团队”小组)

    但无论如何,如果我们假设您在整个森林中只有一个名称,那么您可以搜索它并获取成员:

    var groupname = "IT Team";
    var members = new List<string>();
    using (var searcher = new DirectorySearcher(new DirectoryEntry("GC://dept.mycomp.net"))) {
        searcher.Filter = "(&(objectCategory=group)(objectClass=group)(cn=" + groupname + "))";
        searher.PropertiesToLoad.Add("member"); //only get the member attribute
    
        using (SearchResult result = searcher.FindOne()) {
            foreach (var member in result.Properties["member"]) {
                members.Add(member);
            }
        }
    }
    

    完成后, members 将是每个成员的 distinguishedName 列表 . 如果你想要一个不同的属性(比如 displayName )那么你需要为每个成员创建一个 DirectoryEntry 并获得该属性 .

    有几个警告可能相关或不相关:

    • 该组内可能有团体 . 这不会寻找这些群体的成员 .

    • 如果您的域与林外的其他域具有信任关系,则该外部域中的成员会以不同方式显示 . 我在我的网站上发了一篇名为What makes a member a member?的帖子中谈过这个问题 .

    • 这可能会也可能不会限制您看到的成员数量最多为1000(如果该群组的成员数超过1000) . 我可以't remember off hand if that happens with this method. I know it does when reading the '成员'属性来自 DirectoryEntry . 如果你的小组不是问题 .

相关问题