2011-01-29 92 views
2

我想通过使用PrincipalContext的Active Directory服务找出域组件。从PrincipalContext查找域组件

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

PrincipalContext theContext = new PrincipalContext(ContextType.Domain); 

theContext正确回来。我可以查询很多事情并获得预期的结果。但我真的很想做的是等价的:

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

根据MSDN,这只是“获取在构造函数的容器参数指定的值。”由于我什么都没有通过,我没有得到任何回报。

但是,理论容器具有域组件,这些组件是您可能需要使用或创建的任何可分辨名称所需的。我特别希望在我认识的组织单位中创建新用户。但是,由于我不知道域组件,因此我无法创建专有名称。我还没有看到任何支持相对路径。

我想到的最佳选择是搜索任何用户,然后获取其专有名称并切掉“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))); 

} 

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

回答

4

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

要绑定到当前登录用户的域的RootDSE,可以使用serverless binding。要做到无服务器上当前登录的用户域的RootDSE绑定,绑定字符串应该是这样的

LDAP://RootDSE 

这里是如何使用DirectoryEntry

DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE"); 
string domainContext = rootDSE.Properties["defaultNamingContext"].Value as string; 
+0

这确实是得到它。谢谢。 – 2011-01-31 18:20:42