根据用户输入从Active Directory获取用户信息

时间:2016-06-14 16:14:54

标签: c# wpf active-directory

我有一个WPF应用程序,允许用户使用他们的用户名和密码登录,并通过Active Directory进行验证。我想从文本框中提取用户名,并使用活动目录中的名字,姓氏和电子邮件填充字段。

这是我尝试过的:

try
{
    //enter AD settings 
    PrincipalContext AD = new PrincipalContext(ContextType.Domain, "LDAP://");

    //create search user and add criteria
    string username = Email_box.Text;

    UserPrincipal u = new UserPrincipal(AD);
    u.GivenName = Email_box.Text;

    //Search for user
    PrincipalSearcher search = new PrincipalSearcher(u);

    UserPrincipal result = (UserPrincipal)search.FindOne();
    search.Dispose();

    //show details in textboxes 
    Firstname_Text_Box.Text = u.GivenName;
    Lastname_Text_Box.Text = u.Surname;
}
catch (Exception d)
{
    Console.WriteLine("Error:" + d.Message);
}

3 个答案:

答案 0 :(得分:1)

我对Active Directory了解不多,但是您不应该使用结果来填充文本框吗?

所以不要这样:

Firstname_Text_Box.Text = u.GivenName;
Lastname_Text_Box.Text = u.Surname;

不应该是:

Firstname_Text_Box.Text = result.GivenName;
Lastname_Text_Box.Text = result.Surname;

以下是我要查看的示例:http://ianatkinson.net/computing/adcsharp.htm

答案 1 :(得分:0)

添加到上一个答案,QueryFilter可能还有问题。

u.GivenName = Email_box.Text;

这意味着您希望将Given名称作为电子邮件地址。

答案 2 :(得分:0)

也许您在致电:

时错过了“rootDSE”
 PrincipalContext AD = new PrincipalContext(ContextType.Domain, "LDAP://rootDSE");

或者您可以尝试以下操作。使用用户名从AD获取用户的路径。然后使用该路径检索其信息:

 string _Path = string.Empty;
 SearchResult results = null;

 using (var rootDse = new DirectoryEntry("LDAP://rootDSE"))
        {
            if (null != rootDse)
            {
                string path = string.Format("LDAP://{0}", rootDse.Properties["defaultNamingContext"][0]);
                using (var de = new DirectoryEntry(path))
                {
                    using (var search = new DirectorySearcher(de)
                    {
                        Filter = "(&(objectClass=user)(sAMAccountName=username))"
                    })
                    {
                        search.PropertiesToLoad.Add("DisplayName");
                        search.PropertiesToLoad.Add("mail");

                        results = search.FindOne();

                        if (null != results)
                            _Path = results.Path;
                    };
                }
            }
        }


 using (var entry = new DirectoryEntry(_Path))
        {
            using (var search = new DirectorySearcher(entry))
            {
                return search.FindOne();
            }
        }