我有一个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);
}
答案 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;
答案 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();
}
}