【问题标题】:Inferring LDAP address from NT domain name从 NT 域名推断 LDAP 地址
【发布时间】:2009-08-12 02:13:36
【问题描述】:

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

我的场景: 我有一个在 IIS 上运行的 asp.net 应用程序,它接受匿名用户和域用户。匿名用户必须登录,但域用户我检查服务器标头以获取 IIS 提供的域用户名。我需要从活动目录中查找一些信息,例如电子邮件地址等。如果我在 config 中提供 LDAP 地址,我就可以完成这项工作,但如果可以避免的话,我宁愿不必维护这个额外的配置值。

【问题讨论】:

  • LDAP 地址是什么意思? LDAP 服务器的地址(主机名)?
  • 您是否有多个域可供用户使用,并且这些域位于不同的 Active Directory 林中?

标签: .net active-directory ldap


【解决方案1】:

如果所有域都属于同一个林,您应该能够执行全局目录搜索(GC:// 而不是 LDAP://)。您只能获得部分属性设置,但您可以获取 DistinguishedName,然后进行标准 LDAP:// 查找。

如果您的不同域位于不同的森林中,那么一种简单的方法是构建您的 NetBIOS 域名的查找表。对于每个林,您使用 (netBIOSname=*) 过滤器对 CN=Partitions,CN=Configuration,DC=YourDomain,DC=com 进行子树搜索,您将获得该林中域的列表。 dnsRoot 属性将为您提供域的 DNS 名称,您可以使用它来绑定,或者对其进行 DNS 查找并使用您绑定的第一个地址。或者您可以使用 dnsRoot 创建 System.DirectoryServices.ActiveDirectory.DirectoryContext 以使用 DirectoryServer 的 DirectoryContextType 来获取对域控制器的引用。或者您可以使用 nCName(为您提供域的命名上下文)。

如果您能提供更多详细信息,或者其中有任何不清楚的地方,我可能会提供更多帮助。

补充:

  1. 您可以通过提供目录中对象的 distinctName 来执行“无服务器绑定”来获取 DirectoryEntry。例如。 “LDAP://CN=User1,CN=Users,DC=yourdomain,DC=com”。这将自动发现适当的域控制器并绑定到它以获取对象。
  2. 如果您使用 DirectorySearcher 进行搜索,并且您没有提供 SearchRoot 对象,它将自动绑定到当前域的根目录。您可以提供 SearchRoot 来缩小搜索范围,但您不必这样做。
  3. 如果您绝对需要获取当前域的名称,您可以绑定到一个名为 RootDSE ("LDAP://RootDSE") 的对象并获取 defaultNamingContext 属性的值。这将返回“DC=yourdomain,DC=com”位。

坦率地说,更通用的代码可能不值得痛苦,除非您确定需要它,因为它取决于您的域和森林的结构。例如。如果您有两个森林,它们之间是否存在信任:在您有两个森林之前您不会知道这一点,并且解决方案将取决于此。敏捷开发中有一条精辟的小格言让我无法理解,但它的思路是不要编写你现在不需要的代码。

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

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 的可爱之处之前了解它的工作原理。

【讨论】:

  • 恐怕我对域控制器不是很熟悉,但我想我明白你在说什么。如果我有林控制器的 netBios 名称,我可以使用它来查找用户域的 LDAP 地址。我的问题我不知道如何获取任何域控制器的地址。所以我想我的问题应该是当用户是 asp.net 用户时推断机器的域控制器的 netBois 名称。
  • 好的。解决方案将取决于您是在处理一个活动目录林还是多个活动目录林:您的情况是哪种?如果是一个森林,森林中是否有多个域? ASP.NET 服务器是否在域(或域/林之一)中?
  • 很高兴支持不同的设置,但我有一个林一域,ASP.NET 服务器也属于。
  • 我添加了更多信息和代码示例。如果这不是你所追求的,你能给我更多的继续。
  • 非常感谢,这是一个很好的答案。我使用的是搜索根,虽然它是必需的,但没有我的代码,也没有不必要的配置。
猜你喜欢
  • 2021-02-12
  • 2013-05-01
  • 2011-01-28
  • 2011-04-04
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
相关资源
最近更新 更多