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

问题描述 投票:91回答:4

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

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

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

c# asp.net .net active-directory
4个回答
206
投票

如果您不熟悉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

对于你的问题,既然你要求专门找到用户主体对象,我认为最直观的方法是使用PrincipalSearcher中的System.DirectoryServices.AccountManagement。你可以从谷歌轻松找到很多不同的例子。这是一个完全符合您要求的样本。

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之后使用。


21
投票

如果您要过滤y活动帐户,请将此添加到Harvey的代码中:

 UserPrincipal userPrin = new UserPrincipal(context);
 userPrin.Enabled = true;

第一次使用后。然后加

  searcher.QueryFilter = userPrin;

在找到所有之前。这应该让你活跃。


4
投票

当然这里归功于@Harvey Kwok,但我只是想添加这个例子,因为在我的情况下我想得到一个实际的UserPrincipals列表。预先过滤此查询可能更有效,但在我的小环境中,更容易拉出所有内容,然后根据需要从我的列表中过滤。

根据您的需要,您可能不需要强制转换为DirectoryEntry,但UserPrincipal不提供某些属性。

using (var searcher = new PrincipalSearcher(new UserPrincipal(new PrincipalContext(ContextType.Domain, Environment.UserDomainName))))
{
    List<UserPrincipal> users = searcher.FindAll().Select(u => (UserPrincipal)u).ToList();
    foreach(var u in users)
        {
            DirectoryEntry d = (DirectoryEntry)u.GetUnderlyingObject();
            Console.WriteLine(d.Properties["GivenName"]?.Value?.ToString() + d.Properties["sn"]?.Value?.ToString());
        }
}

1
投票

包括System.DirectoryServices.dll,然后使用以下代码:

DirectoryEntry directoryEntry = new DirectoryEntry("WinNT://" + Environment.MachineName);
string userNames="Users: ";

foreach (DirectoryEntry child in directoryEntry.Children)
{
    if (child.SchemaClassName == "User")
    {
        userNames += child.Name + Environment.NewLine   ;         
    }

}
MessageBox.Show(userNames);
© www.soinside.com 2019 - 2024. All rights reserved.