从NT域名推断LDAP地址

时间:2009-08-12 02:13:37

标签: .net active-directory ldap

鉴于NT样式帐户名称(DOMAIN \ UserName),是否可以推断该域的LDAP地址是什么,以便可以查找用户信息?

我的情景: 我有一个在IIS上运行的asp.net应用程序,它同时接受匿名用户和域用户。匿名用户必须登录,但域用户我检查IIS提供的域用户名的服务器头。我需要从活动目录中查找一些信息,如电子邮件地址等。如果我在配置中提供LDAP地址但是如果我可以避免它,则不希望保持这个额外的配置值。

1 个答案:

答案 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)。

如果您可以提供更多详细信息,或者其中任何一项不明确,我可能会提供更多帮助。

其他

  1. 只需提供目录中对象的distinguishedName,即可通过执行'无服务器绑定'来获取DirectoryEntry。例如。 “LDAP:// CN =用户1,CN =用户,DC = YOURDOMAIN,DC = COM”。这将自动发现适当的域控制器并绑定到它以获取对象。
  2. 如果您使用DirectorySearcher进行搜索,并且未提供SearchRoot对象,则它将自动绑定到当前域的根目录。您可以提供SearchRoot来缩小搜索范围,但您不必这样做。
  3. 如果您确实需要获取当前域的名称,则可以绑定到名为RootDSE的对象(“LDAP:// RootDSE”)并获取defaultNamingContext属性的值。这将返回“DC = yourdomain,DC = com”位。
  4. 坦率地说,更通用的代码可能不值得痛苦,除非你确定你需要它,因为它将取决于你的域和森林的结构。例如。如果你有两个森林,它们之间是否存在信任:在你有两个森林之前你不会知道这个,解决方案将取决于此。敏捷开发中有一个简洁的小格言,它逃脱了我,但它不符合你现在不需要的代码。

    这是一个执行此类搜索的控制台程序:

    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可爱之前知道你的代码是否正常工作。