如何从DirectoryEntry和DN检索DirectoryEntry

6

我有一个代表用户的DirectoryEntry对象。从DirectoryEntry.Properties集合中,我正在检索"manager"属性,这将为用户的经理提供一个可分辨名称("DN")值。

我可以仅通过这两个对象检索到经理的DirectoryEntry对象吗?如果可以,如何操作?

我设想的是类似于DirectoryEntry.GetEntryFromDN(dnManager);的东西,但我找不到类似的调用。

只是为了澄清,DirectoryEntry和DN是我拥有的唯一信息。我无法实例化一个新的DirectoryEntry,因为那样我就必须使用默认的目录和凭据,或者具有目录名称/端口和用户名/密码。

2个回答

5
DirectoryEntry User = YourPreExistingUser();

string managerDN = User.Properties["manager"][0].ToString();

// Browse up the object hierarchy using DirectoryEntry.Parent looking for the
// domain root (domainDNS) object starting from the existing user.
DirectoryEntry DomainRoot = User;

do
{
    DomainRoot = DomainRoot.Parent;
}
while (DomainRoot.SchemaClassName != "domainDNS");

// Use the domain root object we found as the search root for a DirectorySearcher
// and search for the manager's distinguished name.
using (DirectorySearcher Search = new DirectorySearcher())
{
    Search.SearchRoot = DomainRoot;

    Search.Filter = "(&(distinguishedName=" + managerDN + "))";

    SearchResult Result = Search.FindOne();

    if (Result != null)
    {
        DirectoryEntry Manager = Result.GetDirectoryEntry();
    }
}

我宁愿不自己遍历目录树或构建搜索查询,但现在看来这是最好的答案。 - palswim
可能这不是最快的方法(在我的电脑上似乎有点慢),但真的对我进行了快速修复。谢谢 :) - Onno

0

您可以创建一个新的DirectoryEntry实例,提供DN作为参数,然后尝试绑定(例如通过刷新属性)。

DirectoryEntry e = new DirectoryEntry(dn, "u", "p");
e.RefreshCache();


1
但是这将使用默认目录创建“DirectoryEntry”;我需要考虑到该目录未使用机器的默认目录。同时,您好像假设我可以静态地提供凭据以进行连接。 - palswim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接