给定一个 NT 样式的帐户名称 (DOMAIN\UserName) 是否可以推断出该域的 LDAP 地址是什么,以便可以查找用户信息?
我的场景:
我有一个在 IIS 上运行的 asp.net 应用程序,它接受匿名用户和域用户。匿名用户必须登录,但域用户我检查服务器 header 以获取 IIS 提供的域用户名。我需要从事件目录中查找一些信息,例如电子邮件地址等。如果我在 config 中提供 LDAP 地址,我就可以完成这项工作,但如果可以避免的话,我宁愿不必维护这个额外的配置值。
最佳答案
如果所有域都属于同一个林,您应该能够执行全局编录搜索(GC://而不是 LDAP://)。您只能获得部分属性集,但您可以获取 DistinguishedName,然后进行标准 LDAP://查找。
如果您的不同域位于不同的森林中,那么一种简单的方法是构建您的 NetBIOS 域名的查找表。对于每个林,您使用 (netBIOSname=*) 过滤器对 CN=Partitions,CN=Configuration,DC=YourDomain,DC=com 进行子树搜索,您将获得该林中域的列表。 dnsRoot 属性将为您提供域的 DNS 名称,您可以使用它来绑定(bind),或者对其进行 DNS 查找并使用您绑定(bind)的第一个地址。或者您可以使用 dnsRoot 创建 System.DirectoryServices.ActiveDirectory.DirectoryContext 以使用 DirectoryServer 的 DirectoryContextType 来获取对域 Controller 的引用。或者您可以使用 nCName (为您提供域的命名上下文)。
如果您可以提供更多详细信息,或者其中任何一个不清楚,我可能会提供更多帮助。
补充:
坦率地说,除非您确定需要它,否则更通用的代码可能不值得痛苦,因为它将取决于您的域和森林的结构。例如。如果您有两个森林,它们之间是否存在信任:在您有两个森林之前您不会知道这一点,并且解决方案将取决于此。敏捷开发中有一句精辟的小格言让我无法理解,但它遵循不要编写你现在不需要的代码。
这是一个将执行此类搜索的控制台程序:
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 的可爱之处之前了解它的工作原理。
关于.net - 从 NT 域名推断 LDAP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1263906/