我想在GC://DC=xxx,DC=yyy,DC=zzz
格式的Active Directory环境中搜索用户。但是,如何在仲裁Active Directory环境中以编程方式查找全局编录?每个域名是否始终对应于全局编录?任何替代方法我都可以尝试?
注意:Forest.FindAllGlobalCatalogs()
会返回服务器名称列表,但实际上我无法使用它们进行搜索。
Edit1:这就是我想要做的:假设我的activedirectory有一个名为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();
答案 0 :(得分:4)
你想用这个完成什么?
全局编录是存储在某些域控制器上的特殊属性子集。虽然每个域控制器都具有该一个域的完整属性和对象集,但全局编录包含来自AD林中所有域的数据。
因此,当您需要跨多个域查找内容时,GC才真正发挥作用。如果您只有一个域名,那么GC根本无法帮助您。
Forest.FindAllGlobalCatalogs()
确实会为您提供包含全局编录数据集的所有域控制器服务器的列表。那你为什么不能用那些搜索?你能告诉我们你到目前为止尝试了什么吗?
全球目录只是 - 全球 - 例如您根本不应该有任何理由想要指定特定的服务器......无论如何,服务器都应该拥有相同的数据集。
再说一遍:为什么你觉得需要找到一个带有全局目录的服务器,一旦你拥有它,你想用这些信息做什么?为什么在进行全局目录搜索时需要指定服务器?
答案 1 :(得分:0)
使用该搜索字符串格式Active Directory将在您提交查询时为您查找GC服务器。它将根据该AD站点结构进行查找,找到最近的GC服务器并使用该服务器进行查询。
修改强>
在回答您的编辑时,使用GC://前缀表示您有兴趣进行全局编录搜索,因此它将始终使用全局编录服务器,因此您的问题始终是全局编录。当您使用LDAP://为搜索字符串添加前缀时,您将遇到域控制器,并且必须处理非全局属性。无需找出特定的服务器,AD会为您做到这一点。
这是一个搜索字符串,它将通过用户主体名称获取用户,返回userPrincipalName,cn和distinguishedisedName属性值(如果有),并从域的根开始执行子树搜索:
GC://domain1.root.com;(&(objectClass=user)(objectCategory=Person)(userPrincipalName=myuser));userPrincipalName,cn,distinguishedName;subtree
请记住,您必须执行LDAP://搜索以获取未存储在全局编录中的属性,并绑定到GC搜索返回的distinguishedName的路径值。