一尘不染

如何从活动目录中获取用户列表?

c#

如何从活动目录中获取用户列表?有没有办法拉用户名,名字,姓氏?我看到了一个类似的帖子,其中使用了它:

 PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");

我从来没有对活动目录做过任何事情,所以我完全迷路了。任何帮助将不胜感激!


阅读 262

收藏
2020-05-19

共1个答案

一尘不染

如果您不熟悉Active Directory,建议您先了解Active Directory如何存储数据。

Active Directory实际上是LDAP服务器。LDAP服务器中存储的对象是分层存储的。这与将文件存储在文件系统中非常相似。这就是为什么它被命名为
目录 服务器和Active Directory的原因

Active Directory上的容器和对象可以通过来指定distinguished name。专有名称就是这样CN=SomeName,CN=SomeDirectory,DC=yourdomain,DC=com。像传统的关系数据库一样,您可以对LDAP服务器运行查询。这称为LDAP查询。

有多种方法可以在.NET中运行LDAP查询。您可以使用的DirectorySearcherSystem.DirectoryServicesSearchRequestSystem.DirectoryServices.Protocol

对于你的问题,因为你是问找到用户主体对象而言,我认为最直观的方法是使用PrincipalSearcherSystem.DirectoryServices.AccountManagement。您可以从Google轻松找到许多不同的示例。这是一个示例,它可以完全满足您的要求。

using (var context = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
{
    using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
    {
        foreach (var result in searcher.FindAll())
        {
            DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
            Console.WriteLine("First Name: " + de.Properties["givenName"].Value);
            Console.WriteLine("Last Name : " + de.Properties["sn"].Value);
            Console.WriteLine("SAM account name   : " + de.Properties["samAccountName"].Value);
            Console.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value);
            Console.WriteLine();
        }
    }
}
Console.ReadLine();

请注意,在AD用户对象上,有许多属性。特别是givenName会给您First Namesn会给您Last Name。关于用户名。我认为您的意思是用户登录名。请注意,AD用户对象上有两个登录名。一个是samAccountName,也称为Windows
2000之前的用户登录名。 userPrincipalName通常在Windows 2000之后使用。

2020-05-19