gpt4 book ai didi

c# - 从 PrincipalContext 中查找域组件

转载 作者:行者123 更新时间:2023-12-01 22:44:28 27 4
gpt4 key购买 nike

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

我使用很少的参数创建了 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)));

}

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

最佳答案

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

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

LDAP://RootDSE

这是使用 DirectoryEntry 获取它的方法

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

关于c# - 从 PrincipalContext 中查找域组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4834393/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com