C# 在WPF中使用LDAP在Active Directory中查找特定用户

C# 在WPF中使用LDAP在Active Directory中查找特定用户,c#,wpf,active-directory,ldap,C#,Wpf,Active Directory,Ldap,在WPF和C#编程语言中,我试图使用LDAP在Active Directory中查找特定用户。我能够检查Active Directory中是否存在特定用户,但无法从目录中检索该用户以访问其属性 我正在使用System.DirectoryServices命名空间 是否有一种方法可以实现我想要实现的目标,是否有一种方法可以使用LDAP从广告中检索特定用户以检查其属性 编辑:我用来检查用户是否在广告中的代码。若用户在广告中,则返回true,若未找到用户,则返回false。我想知道它搜索的用户数量是否有

在WPF和C#编程语言中,我试图使用LDAP在Active Directory中查找特定用户。我能够检查Active Directory中是否存在特定用户,但无法从目录中检索该用户以访问其属性

我正在使用System.DirectoryServices命名空间

是否有一种方法可以实现我想要实现的目标,是否有一种方法可以使用LDAP从广告中检索特定用户以检查其属性

编辑:我用来检查用户是否在广告中的代码。若用户在广告中,则返回true,若未找到用户,则返回false。我想知道它搜索的用户数量是否有限制

bool ContainsUser(string domain, string userName)
        {
            string ldapBase = string.Format("LDAP://{0}", domain);

            using (var entry = new DirectoryEntry(ldapBase))
            {
                using (var searcher = new DirectorySearcher(entry))
                {
                    searcher.Filter = string.Format("(sAMAccountName={0})", userName);
                    return searcher.FindOne() != null;
                }
            }
        }

您应该使用
UserPrincipal.FindByIdentity

例如:

    public static string GetEmailAddressFromActiveDirectoryUserName(string adUserName)
    {
        string email = string.Empty;
        if (!string.IsNullOrEmpty(adUserName))
        {
            using (var pctx = new PrincipalContext(ContextType.Domain))
            {
                using (UserPrincipal up = UserPrincipal.FindByIdentity(pctx, adUserName))
                {
                    return !string.IsNullOrEmpty(up?.EmailAddress) ? up.EmailAddress : string.Empty;
                }
            }
        }
        return email;
    }
见:


用于检查用户是否存在于AD中或尚未加载用户属性的代码:
searcher.FindOne()?.properties

public class User
{
    public string UserPrincipalName { get; set; }
    public string Name { get; set; }
}

User GetAdUser(string domain, string userName)
{
    string ldapBase = string.Format("LDAP://{0}", domain);

    using (var entry = new DirectoryEntry(ldapBase))
    {
        using (var searcher = new DirectorySearcher(entry))
        {
            searcher.Filter = string.Format("(sAMAccountName={0})", userName);
            var result = searcher.FindOne();
            User user = null;
            if (result != null)
            {
                // result.Properties - list of loaded user properties
                // result.Properties.PropertyNames - list of user property names                
                user = new User
                {
                    UserPrincipalName = result.Properties["userprincipalname"].Cast<string>().FirstOrDefault();
                    Name = result.Properties["name"].Cast<string>().FirstOrDefault();
                }
            }

            return user;
        }
    }
}
公共类用户
{
公共字符串UserPrincipalName{get;set;}
公共字符串名称{get;set;}
}
用户GetAdUser(字符串域,字符串用户名)
{
string ldapBase=string.Format(“LDAP://{0}”,域);
使用(var条目=新目录条目(ldapBase))
{
使用(var searcher=newdirectorysearcher(条目))
{
searcher.Filter=string.Format(“(sAMAccountName={0})”,用户名);
var result=searcher.FindOne();
User=null;
如果(结果!=null)
{
//result.Properties-加载的用户属性列表
//result.Properties.PropertyNames-用户属性名称列表
用户=新用户
{
UserPrincipalName=result.Properties[“UserPrincipalName”].Cast().FirstOrDefault();
Name=result.Properties[“Name”].Cast().FirstOrDefault();
}
}
返回用户;
}
}
}

您可以在检查用户是否存在的位置显示您的代码吗?你可能只需要一个小小的改变就可以获得你需要的属性。几个问题。这使用名称空间“System.DirectoryServices.AccountManagement”。这仍然属于LDAP吗?另外,我对一些语法也不熟悉。“up?.EmailAddress”中的“?”是做什么的?而且,它可以搜索广告中的多少条有限制吗?“是