鉴于NT样式帐户名称(DOMAIN \ UserName),是否可以推断该域的LDAP地址是什么,以便可以查找用户信息?
我的情景: 我有一个在IIS上运行的asp.net应用程序,它同时接受匿名用户和域用户。匿名用户必须登录,但域用户我检查IIS提供的域用户名的服务器头。我需要从活动目录中查找一些信息,如电子邮件地址等。如果我在配置中提供LDAP地址但是如果我可以避免它,则不希望保持这个额外的配置值。
答案 0 :(得分:4)
如果所有域都属于同一个林,您应该能够进行全局目录搜索(GC://而不是LDAP://)。您只能获得部分属性设置,但您可以获取distinguishedName,然后获取标准LDAP:// lookup。
如果您处于不同林中的不同域的情况,那么一种简单的方法是构建NetBIOS域名的查找表。对于每个林,您进行子树搜索CN = Partitions,CN = Configuration,DC = YourDomain,DC = com,过滤器为(netBIOSname = *),您将获得该林中域的列表。 dnsRoot属性将为您提供域的DNS名称,您可以使用它来绑定或执行DNS查找,并使用您要绑定的第一个地址。或者,您可以使用dnsRoot创建System.DirectoryServices.ActiveDirectory.DirectoryContext以使用DirectoryServer的DirectoryContextType来获取对域控制器的引用。或者您可以使用nCName(为您提供域的namingContext)。
如果您可以提供更多详细信息,或者其中任何一项不明确,我可能会提供更多帮助。
其他强>
坦率地说,更通用的代码可能不值得痛苦,除非你确定你需要它,因为它将取决于你的域和森林的结构。例如。如果你有两个森林,它们之间是否存在信任:在你有两个森林之前你不会知道这个,解决方案将取决于此。敏捷开发中有一个简洁的小格言,它逃脱了我,但它不符合你现在不需要的代码。
这是一个执行此类搜索的控制台程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;
namespace SearchDirectory
{
class Program
{
static void Main(string[] args)
{
string user = @"YOURDOMAIN\yourid";
using (DirectorySearcher ds = new DirectorySearcher())
{
ds.SearchScope = SearchScope.Subtree;
ds.Filter = String.Format("(&(objectClass=user)(objectCategory=person)(sAMAccountName={0}))",
user.Split('\\')[1]);
ds.PageSize = 1000;
using (SearchResultCollection src = ds.FindAll())
{
foreach (SearchResult sr in src)
Console.WriteLine(sr.Properties["distinguishedName"][0].ToString());
}
}
Console.WriteLine("\r\nPress a key to continue...");
Console.ReadKey(true);
}
}
}
我已经削减了一些角落,但它应该让你开始。我的建议是让它在一个控制台程序中工作,然后将该类移动到您的ASP.NET项目中。 System.DirectoryServices可以抛出很多奇怪的错误,并且在ASP.NET中使用S.DS也很有趣,所以最好在将它包装到所有ASP.NET可爱之前知道你的代码是否正常工作。