【问题标题】:Search AD using user name使用用户名搜索 AD
【发布时间】:2021-10-05 00:22:38
【问题描述】:

我使用下面的 C# 代码尝试通过传递用户名在活动目录中搜索用户的电子邮件地址。但这会返回 错误

using System.Text;
using System;
using System.DirectoryServices;
public string GetADUserEmail(string userName)
{
    string domainpath = "LDAP://DC=domain,DC=local";
    DirectoryEntry searchRoot = new DirectoryEntry(domainpath);
    DirectorySearcher search = new DirectorySearcher(searchRoot);
    search.Filter = String.Format("(&(objectClass=user)(objectCategory=person))", userName);
    search.PropertiesToLoad.Add("mail");
    StringBuilder userEmail = new StringBuilder();

    SearchResult result = search.FindOne();
    if (result != null)
    {
        int emailCount = result.Properties["mail"].Count;

        for (int counter = 0; counter < emailCount; counter++)
        {
            userEmail.Append((string)result.Properties["mail"][counter]);
        }
    }
    return userEmail.ToString();
}

【问题讨论】:

  • 您的格式字符串不包含任何{0} 以将用户名插入到搜索查询中。
  • 顺便说一句,具体的错误信息是什么?是哪一行产生的?
  • 不显示任何错误消息只是“tempuri.org/">"
  • 代码被实现为 web 服务 API 中的 webmethod,所以当我使用用户名调用它时,它返回 tempuri.org/">
  • "不显示任何错误" 如果您在控制台应用程序中运行该代码,您可能会得到错误描述。这就是创建minimal reproducible example 的重要性...您可以在这样做的同时获得有价值的信息。

标签: c# asp.net email search directory


【解决方案1】:

这个未知错误很可能是因为您将参数传递给string.Format 而没有在字符串中提供相应的占位符。

您必须将Filter 更改为类似于:

search.Filter = String.Format("(&(objectClass=user)(objectCategory=person)(SAMAccountName={0}))", userName);

编辑与您的错误无关:如果用户有多个电子邮件地址,则您对 StringBuilder 的使用是错误的(缺少分隔符)。

【讨论】:

    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多