首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从PrincipalContext查找域组件

从PrincipalContext查找域组件
EN

Stack Overflow用户
提问于 2011-01-29 08:56:14
回答 1查看 6.8K关注 0票数 2

我正在尝试使用PrincipalContext通过Active Directory Services查找域组件。

我使用很少的参数创建了PrincipalContext:

代码语言:javascript
复制
PrincipalContext theContext = new PrincipalContext(ContextType.Domain);

theContext恢复正常。我可以在上面查询很多东西,并得到预期的结果。但我真正想做的是:

代码语言:javascript
复制
Console.WriteLine("Domain Component: " + theContext.Container);

根据MSDN的说法,这只是“获取在构造函数的容器参数中指定的值”。因为我没有传入任何东西,所以我什么也得不到。

但理论容器具有域组件,您可能需要使用或创建的任何可分辨名称都需要域组件。我特别希望在我知道将会出现的组织单位中创建一个新用户。但是,因为我不知道域组件,所以我不能创建可分辨名称。我还没有看到任何对相对路径的支持。

我认为最好的选择是搜索任何用户,然后获得其可分辨名称并去掉"dc“部分。

代码语言:javascript
复制
var searchUser = new UserPrincipal(theContext);
var searcher = new PrincipalSearcher(searchUser);
Principal aUser = searcher.FindOne();
if (aUser != null)
{
    string dn = aUser.DistinguishedName;
    Console.WriteLine(dn.Substring(dn.IndexOf("dc=", StringComparison.InvariantCultureIgnoreCase)));

}

这感觉像是一个糟糕的hack;太多的东西可能会出错。我希望有更好的东西。有谁有主意吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-29 13:11:37

为了获得命名上下文,您应该绑定到RootDSE。RootDSE提供了许多有关目录服务器的有用信息。其中,defaultNamingContext属性存储域的可分辨名称,这正是您想要的。

要绑定到当前登录用户的域的RootDSE,您可以使用serverless binding。要在当前登录的用户域的RootDSE上执行无服务器绑定,绑定字符串应如下所示

代码语言:javascript
复制
LDAP://RootDSE

下面是使用DirectoryEntry获取它的方法

代码语言:javascript
复制
DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE");
string domainContext = rootDSE.Properties["defaultNamingContext"].Value as string;
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4834393

复制
相关文章

相似问题

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