使用DistinguishedName查询Active Directory

4
我有一个使用Windows身份验证的应用程序,正在尝试使用他们的域ID获取已登录用户的信息。
返回的数据部分包括用户经理的DN(在manager属性中)。我需要再次查询AD以获取经理的信息(域ID、电子邮件、名称等)。 我搜索过了,但找不到任何关于我必须在筛选器中使用什么的提示。
这是我正在使用的内容,但我总是得到null:
private static DirectoryEntry GetUserDEByDN(string sDN)
{
    using (HostingEnvironment.Impersonate())
    {
        PrincipalContext pc = new PrincipalContext(ContextType.Domain, adUSADomain, adUSAContainer);
        //UserPrincipal up = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, UserID);
        UserPrincipal qbeUser = new UserPrincipal(pc);
        //qbeUser.SamAccountName = UserID.Trim().ToUpper();

        PrincipalSearcher srch = new PrincipalSearcher(qbeUser);
        PrincipalSearchResult<Principal> psr = srch.FindAll();

        string sDomain = ConfigurationManager.AppSettings["Domain"].ToString();
        string adPath = ConfigurationManager.AppSettings["ADPath"].ToString();

        DirectoryEntry de = new DirectoryEntry(adPath);
        DirectorySearcher deSearch = new DirectorySearcher();
        deSearch.SearchRoot = de;
        deSearch.Filter = "(&(objectClass=user)(| (cn = " + sDN + ")(dn = " + sDN + ")))";

        //deSearch.Filter = "(&(objectClass=user)(SAMAccountName=" + UserID + "))";
        deSearch.SearchScope = SearchScope.Subtree;
        SearchResult results = deSearch.FindOne();

        if (null != results)
        {
            de = new DirectoryEntry(results.Path);
            return de;
        }
        else
        {
            return null;
        }
    }
}

有没有可能通过DN搜索Active Directory?如果可以,那么我做错了什么?

2个回答

4
这是我亲身尝试的解决方法。然而,我认为应该使用objectClass=user才能正常运行,但是我一直得到null的返回值。当我改成distinguishedName = sDN时,它就可以工作了。
这段代码的整个意图是从用户对象开始进行目录搜索;不需要额外搜索指定的distinguishedName。
private static DirectoryEntry GetUserDEByDN(string sDN)
{
    string adPath = ConfigurationManager.AppSettings["ADPath"].ToString();
    DirectoryEntry de = new DirectoryEntry(adPath + "/" + sDN);
    DirectoryEntry deManager = null;

    using (DirectorySearcher Search = new DirectorySearcher())
    {
        Search.SearchRoot = de;
        Search.Filter = "(&(distinguishedName=" + sDN + "))";
        //Search.Filter = "(objectClass = user)";
        Search.SearchScope = SearchScope.Base;
        SearchResult Result = Search.FindOne();

        if (null != Result)
            deManager = Result.GetDirectoryEntry();
    }
    return deManager;
}

0
你可以直接使用DirectoryEntry类解析完整的distinguishedName,但是你必须先修改DN字符串。
当我使用DirectorySearcher来查找用户时,我会得到像这样的经理字符串:
string mgr = "CN=antiduh,OU=Users,DC=domain,DC=antiduh,DC=com";

如果我将该字符串直接传递给new DirectoryEntry(mgr),它将无法正常工作 - 会出现很多COMException
然而,我发现如果你先在字符串前面加上"LDAP://",它就能正常工作,就像魔术一样。
string mgrDN = (string)employee.Properties["manager"].Value;
DirectoryEntry manager = new DirectoryEntry( "LDAP://" + mgrDN );

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