首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过C#以编程方式获取Active林的根

如何通过C#以编程方式获取Active林的根
EN

Stack Overflow用户
提问于 2016-11-10 06:39:52
回答 2查看 2.2K关注 0票数 1

我的客户有一个庞大的活动目录。例如:

根部

代码语言:javascript
运行
复制
company.com
  de.company.com
  us.company.com
  in.company.com
  xx.company.com

当我得到当前用户时,我就得到了domainname\username。当我获取域名并想在这个域中搜索世界上的其他用户时,我不需要知道company.com来进行目录搜索。

在C#中是否有一种方法来获取我与DirectorySearcher或任何其他C#方法一起使用的根对象来查询AD?

EN

Stack Overflow用户

回答已采纳

发布于 2016-11-10 10:43:26

根林名称可以从RootDSE分区获得。看看rootDomainNamingContext属性。这个将返回您的森林根域。我不建议从用户DN中提取林名,因为如果您在一个林中有两个域树,它将无法工作。第二个选项是在当前域的全局目录中搜索用户。全局目录包含来自整个林的所有用户的部分副本。

下面的代码对全局目录执行搜索。我有两个域,在我的森林中,所以它返回给我两个用户。请注意,您必须处理返回的多个结果:

代码语言:javascript
运行
复制
        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会导致内存泄漏和其他问题

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40521361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档