我正在尝试在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设置上都进行了调整,但是到目前为止还没有。有线索吗?
答案 0 :(得分:3)
将用户名参数从“cn = xxx,dc = yyy,dc = zzz”更改为“Domain \ Username”
答案 1 :(得分:0)
您还可以更改IIS应用程序池以使用您要搜索的查询priveleges运行域帐户。
我还有其他一些评论:
答案 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);
其中MyAdmin
是Administrators
角色的成员。
我花了一些时间才找到的一件小事是,如果您不想通过SSL进行通信,则需要AuthenticationTypes.None
参数。当然,您希望在生产中执行此操作,但出于开发目的,可以跳过加密。
环境:Windows 7
答案 3 :(得分:0)
尝试查询活动目录时,我也遇到了这个异常:
SearchResult result = srch.FindOne();
要解决此问题,只需将上述代码放在Security.RunWithElevatedPrivileges()
。
最终解决方案:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
result = srch.FindOne();
});