在生产时Directory.Services出错

时间:2011-09-27 12:58:32

标签: c# asp.net active-directory directoryservices

以下代码在我的本地计算机上的Visual Studio开发环境中正常工作。但是,当我将文件移动到Windows 2008 R2 IIS 7.5计算机时,我收到以下错误:

  

[DirectoryServicesCOMException(0x80072020):操作错误   发生了。 ] _Default.GetFullName(String strLoginName,String&   STR_FIRST_NAME,字符串& STR_LAST_NAME,String& STR_DISPLAY_NAME,   字符串和放大器; STR_MAIL,String& STR_OFFICE_PHONE,String& STR_ADDRESS)   c:\ AuthTest \ Default.aspx.cs:87 _Default.Page_Load(Object sender,   EventArgs e)在c:\ AuthTest \ Default.aspx.cs:23
  System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp,Object   o,Object t,EventArgs e)+25 System.Web.UI.Control.LoadRecursive()   +71 System.Web.UI.Page.ProcessRequestMain(布尔值   includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)   3064

我在IIS上启用了Windows身份验证,所以我不确定我是否遗漏了其他内容。我的本地计算机和Web服务器都位于同一个域中。

这是我的代码:

using System;
using System.DirectoryServices;
using System.Web.Hosting;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //Gets the extracted User Name using a method.
        string strUserID = ExtractUserName(User.Identity.Name.ToString());

        string STR_FIRST_NAME;
        string STR_LAST_NAME;
        string STR_DISPLAY_NAME;
        string STR_MAIL;
        string STR_OFFICE_PHONE;
        string STR_ADDRESS;


        GetFullName(strUserID, out STR_FIRST_NAME, out STR_LAST_NAME, out STR_DISPLAY_NAME, 
            out STR_MAIL, out STR_OFFICE_PHONE, out STR_ADDRESS);

        lblHello.Text = "Your User ID is: " + strUserID;
        TextBox1.Text = 
            "Your name is: " + STR_FIRST_NAME + " " + STR_LAST_NAME + Environment.NewLine +
            "Display Name: " + STR_DISPLAY_NAME + Environment.NewLine + 
            "Email address: " + STR_MAIL + Environment.NewLine +
            "Office Phone: " + STR_OFFICE_PHONE + Environment.NewLine +
            "Address: " + STR_ADDRESS;
    }

        //Retrives User Name from DomainName\\UserName 
        private static string ExtractUserName(string path) 
        { 
            string[] userPath = path.Split(new char[] { '\\' }); 
            return userPath[userPath.Length - 1]; 
        }

        public static string GetFullName(string strLoginName, 
            out string STR_FIRST_NAME, 
            out string STR_LAST_NAME, 
            out string STR_DISPLAY_NAME, 
            out string STR_MAIL, 
            out string STR_OFFICE_PHONE, 
            out string STR_ADDRESS)
        {
            string userName = ExtractUserName(strLoginName);

            SearchResult result = null;

            using (HostingEnvironment.Impersonate())
            {
                DirectorySearcher search = new DirectorySearcher();
                search.Filter = String.Format("(SAMAccountName={0})", userName);
                search.PropertiesToLoad.Add("cn");
                STR_FIRST_NAME = "";
                STR_LAST_NAME = "";
                STR_DISPLAY_NAME = "";
                STR_MAIL = "";
                STR_OFFICE_PHONE = "";
                STR_ADDRESS = "";

                try
                {
                    result = search.FindOne();

                    foreach (System.Collections.DictionaryEntry direntry in result.Properties)
                    {
                        STR_FIRST_NAME = result.GetDirectoryEntry().Properties["givenName"].Value.ToString();
                        STR_LAST_NAME = result.GetDirectoryEntry().Properties["SN"].Value.ToString();
                        STR_DISPLAY_NAME = result.GetDirectoryEntry().Properties["DisplayName"].Value.ToString();
                        STR_MAIL = result.GetDirectoryEntry().Properties["mail"].Value.ToString();
                        STR_OFFICE_PHONE = result.GetDirectoryEntry().Properties["telephoneNumber"].Value.ToString();
                        STR_ADDRESS = result.GetDirectoryEntry().Properties["streetAddress"].Value.ToString();
                    }
                    return null;
                }
                catch (Exception ex)
                {
                    throw ex;
                }

            }
        }
}

在VS测试环境中,我的本地机器上的一切正常。我可能在IIS中缺少某种配置?

先谢谢。

1 个答案:

答案 0 :(得分:4)

首先要检查IIS应用程序池标识是否具有对AD的正确权限。

另外作为旁注,这里有关于你的捕捉{throw ex}

的内容

http://www.tkachenko.com/blog/archives/000352.html