从PrincipalContext中查找域组件

时间:2011-01-29 00:56:14

标签: c# active-directory directoryservices

我正在尝试使用PrincipalContext通过Active Directory服务找出域组件。

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

PrincipalContext theContext = new PrincipalContext(ContextType.Domain);

theContext正确回归。我可以查询很多东西并得到预期的结果。但我真正想做的是相当于:

Console.WriteLine("Domain Component: " + theContext.Container);

根据MSDN,这只是“获取构造函数中container参数中指定的值”。因为我什么都没有过,所以我什么都没有回来。

但理论容器具有域组件,这些组件是您可能需要使用或创建的任何专有名称所必需的。我特意想在组织单位中创建一个新用户,我知道会在那里。但是,由于我不知道域组件,我无法创建专有名称。我没有看到任何对相对路径的支持。

我认为最好的选择是搜索任何用户,然后获得其专有名称并切断“dc”部分。

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)));

}

这感觉就像一个糟糕的黑客;太多可能会出错。我希望有更好的东西。有没有人有想法?

1 个答案:

答案 0 :(得分:5)

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

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

LDAP://RootDSE

以下是使用DirectoryEntry

获取内容的方法
DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE");
string domainContext = rootDSE.Properties["defaultNamingContext"].Value as string;