我正在尝试使用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)));
}
这感觉就像一个糟糕的黑客;太多可能会出错。我希望有更好的东西。有没有人有想法?
答案 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;