gpt4 book ai didi

.net - 从 NT 域名推断 LDAP 地址

转载 作者:行者123 更新时间:2023-12-01 01:37:05 25 4
gpt4 key购买 nike

给定一个 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 (为您提供域的命名上下文)。

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

补充:

  • 您可以通过提供目录中对象的 distinctName 来执行“无服务器绑定(bind)”来获取 DirectoryEntry。例如。 “LDAP://CN=User1,CN=Users,DC=yourdomain,DC=com”。这将自动发现适当的域 Controller 并绑定(bind)到它以获取对象。
  • 如果您使用 DirectorySearcher 进行搜索,并且您不提供 SearchRoot 对象,它将自动绑定(bind)到当前域的根目录。您可以提供 SearchRoot 来缩小搜索范围,但您不必这样做。
  • 如果您绝对需要获取当前域的名称,您可以绑定(bind)到一个名为 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 的可爱之处之前了解它的工作原理。

    关于.net - 从 NT 域名推断 LDAP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1263906/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com