搜索特定 OU 活动目录中的用户

本文关键字:用户 活动 OU 搜索 | 更新日期: 2023-09-27 18:36:29

我的Active Directory中为不同的用户提供了不同的OU,我想使用C#获取特定OU的所有用户。

目前我有这个过滤器,但它从所有 OU 返回所有用户

(&(objectClass=User)(objectCategory=Person))

请帮助我使用ldap查找特定用户的用户

搜索特定 OU 活动目录中的用户

您可以使用

PrincipalSearcher和"按示例查询"主体进行搜索:

// LDAP string to define your OU
string ou = "OU=Sales,DC=YourCompany,DC=com";
// set up a "PrincipalContext" for that OU
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "Yourcompany.com", ou))
{
    // define the "query-by-example" user (or group, or computer) for your search
    UserPrincipal qbeUser = new UserPrincipal(ctx);
    // set whatever attributes you want to limit your search for, e.g. Name, etc.
    qbeUser.Surname = "Smith";
    // define a searcher for that context and that query-by-example 
    using (PrincipalSearcher searcher = new PrincipalSearcher(qbeUser))
    {
        foreach (Principal p in searcher.FindAll())
        {
            // Convert the "generic" Principal to a UserPrincipal
            UserPrincipal user = p as UserPrincipal;
            if (user != null)
            {
                // do something with your found user....
            }
        }
    }

如果您还没有 - 请务必阅读 MSDN 文章在 .NET Framework 3.5 中管理目录安全主体,该文章很好地展示了如何充分利用 System.DirectoryServices.AccountManagement 中的新功能。或者参阅 System.DirectoryServices.AccountManagement 命名空间上的 MSDN 文档。

当然,根据需要

,您可能希望在创建的"按示例查询"用户主体上指定其他属性:

  • DisplayName(通常:名字 + 空格 + 姓氏)
  • SAM Account Name - 您的 Windows/AD 帐户名称
  • User Principal Name - 您的"username@yourcompany.com"样式名称

您可以在UserPrincipal上指定任何属性,并将其用作PrincipalSearcher的"按示例查询"。

一种选择是在创建DirectoryEntry对象时仅设置组织单位 (OU):

using (var entry = new DirectoryEntry($"LDAP://OU={unit},OU=Accounts,DC={domain},DC=local"))
{
    // Setup your search within the directory
    var search = new DirectorySearcher(entry)
    {
        Filter = "(&(objectCategory=person)(objectClass=user)(memberOf=*))"
    };
    // Set the properties to be returned
    search.PropertiesToLoad.Add("SamAccountName");
    // Get the results
    var results = search.FindAll();
    // TODO Process the results as needed...
}