【问题标题】:How to find global catalog of Active Directory?如何找到 Active Directory 的全局目录?
【发布时间】:2010-07-10 14:58:17
【问题描述】:

我想在 Active Directory 环境中搜索 GC://DC=xxx,DC=yyy,DC=zzz 格式的用户。但是,如何以编程方式在任意 Active Directory 环境中查找全局目录?每个域名是否总是对应​​一个全局目录?我可以尝试任何替代方法吗?

注意:Forest.FindAllGlobalCatalogs() 返回服务器名称列表,但我实际上无法使用它们进行搜索。

Edit1:这是我想要做的:假设我的活动目录有一个名为 domain1.root.com 的域,那么我将使用 GC://DC=domain1,DC=root,DC=com 来搜索用户。但这总是一个全局目录吗?每个域都必须有一个全局目录吗?

Edit2:我现在可以使用以下代码搜索用户:

            var currentForest = Forest.GetCurrentForest();
            var globalCatalog = currentForest.FindGlobalCatalog();
            Console.WriteLine(globalCatalog.Name);
            //DirectorySearcher searcher = new DirectorySearcher("GC://"+y.Name);
            DirectorySearcher searcher = globalCatalog.GetDirectorySearcher();
            searcher.Filter = @"samaccountname=skaranth";
            Console.WriteLine(searcher.SearchRoot.Path);
            var result = searcher.FindOne();
            if(result!=null)
                Console.WriteLine(result.Properties["distinguishedname"][0]);
            searcher.Dispose();
            globalCatalog.Dispose();
            currentForest.Dispose();

【问题讨论】:

    标签: c# active-directory


    【解决方案1】:

    你到底想用这个实现什么??

    全局目录是存储在某些域控制器上的特殊属性子集。虽然每个域控制器都具有该域的一整套属性和对象,但全局目录包含来自 AD 林中所有域的数据。

    因此,只有当您需要跨多个域查找内容时,GC 才真正发挥作用。如果你只有一个域,GC 根本帮不了你。

    Forest.FindAllGlobalCatalogs() 确实会为您提供包含全局编录数据集的所有域控制器服务器的列表。那么为什么你不能用那些来搜索呢?你能告诉我们你到目前为止所做的尝试吗?

    全局目录就是这样 - 全局 - 例如您根本不应该有任何理由要指定特定的服务器......无论如何,这些服务器都应该具有相同的数据集。

    再说一遍:为什么您觉得需要找到具有全局目录的服务器,以及一旦获得这些信息,您想如何处理?为什么在进行全局编录搜索时觉得需要指定服务器?

    【讨论】:

    • 我真正想要的是附加到“GC://”的后缀,以便能够搜索用户。
    • @apoorv020:如果你只有一个域,那么搜索 GC 真的没有多大意义。但是是的:每个域都至少有一个全局目录。
    • @apoorv020:你想怎么搜索?使用 System.DirectoryServices.DirectorySearcher?还是其他方法?
    • 全球目录不是全球性的,就像全球一样。它仅适用于 ONE FOREST,因此,如果您有多个成对信任的森林,那么您有很多全局目录要搜索...
    • @Alexander:这就是我所说的:全局目录包含来自 AD 森林中所有域的数据
    【解决方案2】:

    当您提交查询时,Active Directory 将使用该搜索字符串格式为您查找 GC 服务器。它将根据该 AD 站点结构进行查找,找到最近的 GC 服务器并使用该服务器进行查询。

    编辑:

    在回答您的编辑时,使用 GC:// 前缀表示您有兴趣进行全局编录搜索,因此它将始终使用全局编录服务器,所以对您关于它始终是全局编录的问题是肯定的。当您使用 LDAP:// 为搜索字符串添加前缀时,您将访问域控制器并且必须处理非全局属性。无需确定具体的服务器,AD 会为您完成。

    这是一个搜索字符串,它将通过用户主体名称为您获取用户,返回 userPrincipalName、cn 和 distinguisedName 属性值(如果有),并从域的根目录开始进行子树搜索:

    GC://domain1.root.com;(&(objectClass=user)(objectCategory=Person)(userPrincipalName=myuser));userPrincipalName,cn,distinguishedName;subtree
    

    请记住,您必须执行 LDAP:// 搜索才能获取未存储在全局目录中的属性,绑定到 GC 搜索返回的 distinctName 的路径值。

    【讨论】:

    • 如何获取字符串 xxx,yyy 等表示的参数?
    • 当我尝试使用 GC://domain1.root.com 在 domain2 中搜索用户时出现问题。在这种情况下,它不会给我用户条目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多