如何使用LINQ to LDAP获取活动目录中的用户列表?

时间:2013-01-13 05:28:38

标签: c# winforms linq active-directory

我想使用LINQ to LDAP访问Active Directory,我希望获得所有用户的列表 我怎么能这样做?

2 个答案:

答案 0 :(得分:6)

您可以尝试以下内容。

using ActiveDs;
using BdsSoft.DirectoryServices.Linq;
using System.Linq.Expressions;
using System.DirectoryServices;

[DirectorySchema( "user", typeof( IADsUser ) )]
class User
{
    public string Name { get; set; }

    public string sAMAccountName { get; set; }

    public string objectCategory { get; set; }

    public string mail { get; set; }

    public string Description { get; set; }

    [DirectoryAttribute( "PasswordLastChanged", DirectoryAttributeType.ActiveDs )]
    public DateTime PasswordLastSet { get; set; }

    [DirectoryAttribute("distinguishedName")]
    public string Dn { get; set; }

    [DirectoryAttribute("memberOf")]
    public string[] Groups { get; set; }

}

使用此代码从控制台应用程序访问AD,将AD服务器放在以下代码中:

static void Main( string[] args )
{

    IEnumerable<User> users = GetADUsers();

    Console.WriteLine( "Users: " + users.Count().ToString() );

}

static DirectoryEntry ROOT = new DirectoryEntry( "LDAP://MyADDomainLocation.com" );

private static IEnumerable<User> GetADUsers()
{
    IEnumerable<User> users;

    var usersDS = new DirectorySource<User>( ROOT, SearchScope.Subtree );

            users = from usr in usersDS
                    where usr.Name == "A*" // FIlter A then any character(s)
                    select usr;

     users = users.OrderBy( user => user.Name ).ToList(); // Sort them alphabetically by name.

    return users;
}

有关详细信息,请查看Get All Users using C# with Linq To Active Directory

LINQ to LDAP

对于 .NET Core或Standard ,请参阅下面的Chris D's answer

要获得有关此主题的全面知识,请查看(Almost) Everything In Active Directory via C#

我希望这会对你有所帮助。

答案 1 :(得分:0)

很抱歉回答这样一个老问题,但我认为它需要更新的答案。我为此编写了一个.NET标准库:

  • Linq2Ldap.Core(NuGetGitHub)与平台无关的核心库,可以从表达式转换为LDAP过滤器,然后再次解析出来。

它具有两个Active Directory包装器库:

  • Linq2Ldap.Protocols(NuGetGitHub)-Linq2Ldap.Core + System.DirectoryServices.Protocols的薄包装。
  • Linq2Ldap(NuGetGitHub)-System.DirectoryServices的精简包装。

它的心脏可以在Expression<Func<T, bool>>和LDAP过滤器之间转换。表达式引用的模型(T)必须实现一个接口IEntry,该接口基本上定义了一个花哨的索引器类,您可以像这样使用:m => m["cn"] == "someuser"。您也可以创建特殊属性来别名目录属性。请参阅项目Wiki了解更多信息。