Asp.net从IIS搜索Active Directory

时间:2013-03-24 13:09:54

标签: asp.net iis active-directory

最近,我将ASP.NET应用程序从运行IIS5的旧服务器移动到运行IIS7.5的新服务器。

该应用程序给我一个错误:

  

(&(objectCategory = person)(sAMAccountName =))搜索过滤器无效。
  描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详细信息:System.ArgumentException:(&(objectCategory = person)(sAMAccountName =))搜索过滤器无效。

搜索AD的功能是:

public static string Get_AD_User_Email(string username)
{
        try
        {
            DirectorySearcher searcher = new DirectorySearcher("(&(objectCategory=person)(sAMAccountName=" + username + "))");
            SearchResult result = searcher.FindOne();

            if (result != null)
            {
                DirectoryEntry employee = result.GetDirectoryEntry();

                if (employee.Properties["mail"] != null)
                {
                    return employee.Properties["mail"].Value.ToString();
                }
                else return "NULL";
            }
            else throw new Exception("ERROR: Problem searching active directory for users.");
        }
        catch (Exception ex) { throw ex; }
    }

奇怪的是,在Visual Studio中调试网站正在运行,只有从IIS崩溃才能运行。

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:2)

问题在于您的函数Get_AD_User_Email(string username)使用username的空值进行调用。

答案 1 :(得分:1)

自:

DirectorySearcher searcher = new DirectorySearcher("(&(objectCategory=person)(sAMAccountName=" + username + "))");

返回异常:

  

(&(objectCategory = person)(sAMAccountName =))搜索过滤器是   无效。

您正在将空字符串传递给Get_AD_User_Email

您如何检索“用户名”?

答案 2 :(得分:1)

您更改了IIS服务器,现在调用方法没有传递用户名(正如其他几个答案所指出的那样)。

我会验证您是否在IIS中的该网站上禁用了匿名访问。通常会发现启用Windows身份验证和匿名访问。如果发生这种情况,则首选匿名,您将无法获得用户名。

检查HttpContext.Current.User的值。我通常使用下面的代码来验证Windows身份验证:

WindowsIdentity id = (WindowsIdentity)HttpContext.Current.User.Identity; 
string username = id.Name;

答案 3 :(得分:-1)

尝试: 的objectClass =用户

而不是: objectCategory =人