无法查询AD(获取DirectoryServicesCOMException)

时间:2010-08-12 16:30:17

标签: c# asp.net windows windows-server-2008 directoryservices

我正在尝试在Windows Server 2008 R2(已安装IIS7)上运行的ASP.Net(4.0)应用程序中查询AD。 (当它作为2.0应用程序运行时也会失败)

这对我来说并不是什么新鲜事,因为我之前已多次这样做过。我写了一个小的ASP.Net程序,可以在我自己的机器上运行(带有IIS6的Windows XP),但在2008机器上运行时会失败。

(结果是您看到用户是文本框中成员的组列表)

(on button_click) 
var userName = txtUserName.Text;

if (userName.Trim().Length == 0)
{
     txtResults.Text = "-- MISSING USER NAME --";
     return;
}

var entry = new DirectoryEntry("LDAP://blah.blah/DC=blah,DC=blah",
                               "cn=acct, dc=blah, dc=blah",
                               "pass");

var search = new DirectorySearcher(entry);
search.Filter = "(SAMAccountName=" + userName + ")";
search.PropertiesToLoad.Add("memberOf");

var groupsList = new StringBuilder();

var result = search.FindOne();

if (result != null)
{
   int groupCount = result.Properties["memberOf"].Count;

   for (int counter = 0; counter < groupCount; counter++)
   {
           groupsList.Append((string)result.Properties["memberOf"][counter]);
           groupsList.Append("\r\n");
    }
}

txtResults.Text = groupsList.ToString();

当我运行此代码时,我在search.FindOne()上收到以下错误:

System.DirectoryServices.DirectoryServicesCOMException (0x8007203B): A local error has occurred.

   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
   at System.DirectoryServices.DirectorySearcher.FindOne()
   at WebApplication1._Default.btnSearch_Click(Object sender, EventArgs e)

我们已经对此进行了大量研究,并且在我们能够想到的每个IIS7设置上都进行了调整,但是到目前为止还没有。有线索吗?

4 个答案:

答案 0 :(得分:3)

将用户名参数从“cn = xxx,dc = yyy,dc = zzz”更改为“Domain \ Username”

答案 1 :(得分:0)

您还可以更改IIS应用程序池以使用您要搜索的查询priveleges运行域帐户。

我还有其他一些评论:

  1. 确保DirectoryEntry构造函数的第一个条目也包含用户的容器。这应该有助于DirectorySearcher更可靠地工作。
  2. 我认为DirectoryEntry构造函数中的第二个参数应该是用户名,而不是AD查询路径。
  3. 您还应该设置AuthenticationType属性。对于Server 2008,默认情况下,需要将其设置为AuthenticationTypes.Secure | AuthenticationTypes.ServerBind | AuthenticationTypes.Sealing。我猜想2008R2有一个类似的要求。

答案 2 :(得分:0)

我看到问题相当陈旧,但在努力解决这个问题后,我想提一下,确实可以使用LDAP风格的用户名(与DNS风格相反)。这对我很有用:

    string connString = "LDAP://MyDomain/CN=blah,DC=blah,DC=blah";
    string username = "CN=MyAdmin,CN=Users,CN=blah,DC=blah,DC=blah";
    string password = "myLittleSecret";
    DirectoryEntry root = new DirectoryEntry(
         connString, 
         username, 
         password, 
         AuthenticationTypes.None);

其中MyAdminAdministrators角色的成员。

我花了一些时间才找到的一件小事是,如果您不想通过SSL进行通信,则需要AuthenticationTypes.None参数。当然,您希望在生产中执行此操作,但出于开发目的,可以跳过加密。

环境:Windows 7

答案 3 :(得分:0)

尝试查询活动目录时,我也遇到了这个异常:

SearchResult result = srch.FindOne();

要解决此问题,只需将上述代码放在Security.RunWithElevatedPrivileges()

最终解决方案:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    result = srch.FindOne();
});