我不知道如何在 Active Directory 中搜索用户。这是我目前的尝试,但我还没有运行过。
public class ADController : Controller
{
[HttpGet]
public IActionResult Find()
{
return View();
}
[HttpPost]
public IActionResult Find(FindViewModel model)
{
DirectoryEntry entry = new DirectoryEntry("LDAP://<full user name>,<Users>,<domain component>");
DirectorySearcher searcher;
SearchResultCollection results;
searcher = new DirectorySearcher(entry);
searcher.Filter = "(&(objectClass=user)(displayname=*))";
searcher.SearchScope = SearchScope.Subtree;
using (searcher)
{
results = searcher.FindAll();
foreach (SearchResult result in results)
{
string searchOK = result.Properties["displayname"][0].ToString();
//objects.Add(searchOK);
}
}
return View();
}
}
public class FindViewModel
{
[Display(Name = "UserActiveDirectory")]
public string UserAD { get; set; }
}
您的要求有点不清楚,但我假设:
displayName
传递到您的视图如果是这样的话:
首先,由于您只需要将单个字符串传递到控制器中,因此使用类作为参数没有任何好处。只需使用单个字符串:
public IActionResult Find(string username)
然后您需要在过滤器中使用用户名。没有名为“用户名”的属性,但最常指的是
sAMAccountName
。然而,它也可以指 userPrincipalName
,其格式为 [email protected]
。但我假设sAMAccountName
。
奇怪的是,仅仅 (objectClass=user)
不足以将搜索限制为仅用户帐户。例如,计算机对象的
objectClass
为
user
。因此,如果您想将搜索限制为仅用户帐户,则还需要包含
(objectCategory=person)
。
searcher.Filter = $"(&(objectClass=user)(objectCategory=person)(sAMAccountName={username}))";
默认情况下,SearchScope
是
Subtree
,所以你不需要这一行:
searcher.SearchScope = SearchScope.Subtree;
您还应该使用 集合,因为如果不这样做,它将返回每个属性。因此,仅将您计划使用的属性放在那里:
searcher.PropertiesToLoad.Add("displayName");
由于您通过 sAMAccountName
进行搜索,这保证在域中是唯一的,因此您可以使用
FindOne()
而不是
FindAll()
,因为您知道只能有一个结果(或没有)。
var result = searcher.FindOne();
如果 result
不是
null
,则表示已找到用户,您可以将
displayName
传递给视图:
if (result != null) {
string displayName = (string) result.Properties["displayname"][0];
return View(displayName);
}
否则,不要将任何内容传递给视图,并且您将必须在视图中处理这种情况。总而言之,看起来像这样:
public IActionResult Find(string username)
{
var entry = new DirectoryEntry("LDAP://<full user name>,<Users>,<domain component>");
var searcher = new DirectorySearcher(entry) {
Filter = $"(&(objectClass=user)(objectCategory=person)(sAMAccountName={username}))",
PropertiesToLoad = { "displayName" }
};
var result = searcher.FindOne();
if (result != null) {
string displayName = (string) result.Properties["displayname"][0];
return View(displayName);
}
return View();
}
您可能仍需要根据您的实际要求进行一些更新,但这应该可以帮助您开始。