我的客户有一个庞大的活动目录。例如:
根部
company.com
de.company.com
us.company.com
in.company.com
xx.company.com
当我得到当前用户时,我就得到了domainname\username
。当我获取域名并想在这个域中搜索世界上的其他用户时,我不需要知道company.com来进行目录搜索。
在C#中是否有一种方法来获取我与DirectorySearcher或任何其他C#方法一起使用的根对象来查询AD?
发布于 2016-11-10 10:43:26
根林名称可以从RootDSE分区获得。看看rootDomainNamingContext属性。这个将返回您的森林根域。我不建议从用户DN中提取林名,因为如果您在一个林中有两个域树,它将无法工作。第二个选项是在当前域的全局目录中搜索用户。全局目录包含来自整个林的所有用户的部分副本。
下面的代码对全局目录执行搜索。我有两个域,在我的森林中,所以它返回给我两个用户。请注意,您必须处理返回的多个结果:
var forest = Forest.GetCurrentForest();
var globalCatalog = GlobalCatalog.FindOne(new DirectoryContext(DirectoryContextType.Forest, forest.Name));
using (var connection = new LdapConnection(new LdapDirectoryIdentifier(globalCatalog.Name, 3268)))
{
var entries = new List<SearchResultEntry>();
var searchRequest = new SearchRequest(string.Empty, "(samaccountname=administrator)", SearchScope.Subtree, null);
var searchOptionsControl = new SearchOptionsControl(System.DirectoryServices.Protocols.SearchOption.DomainScope);
searchRequest.Controls.Add(searchOptionsControl);
var pageResultRequestControl = new PageResultRequestControl(1000);
searchRequest.Controls.Add(pageResultRequestControl);
do
{
var response = (SearchResponse)connection.SendRequest(searchRequest);
if (response != null)
{
if (response.ResultCode != ResultCode.Success)
{
throw new ActiveDirectoryOperationException(response.ErrorMessage, (int) response.ResultCode);
}
foreach (var c in response.Controls.OfType<PageResultResponseControl>())
{
pageResultRequestControl.Cookie = c.Cookie;
break;
}
entries.AddRange(response.Entries.Cast<SearchResultEntry>());
}
}
while (pageResultRequestControl.Cookie != null && pageResultRequestControl.Cookie.Length > 0);
}
关于这个代码的几个注意事项: 1.当然,这段代码不是生产代码。您可以编写更通用的LdapSearcher,例如,可以找到一个这里。如果需要,您可以制作这个搜索器的同步版本。2.我强烈建议在基于服务的应用程序中使用LdapConnection而不是DirectorySearcher,因为在企业环境中使用DirectorySearcher会导致内存泄漏和其他问题。
https://stackoverflow.com/questions/40521361
复制相似问题