Запросить Active Directory с помощью DistinguishedName

У меня есть приложение, использующее проверку подлинности Windows, и я пытаюсь войти в систему с информацией о пользователях, используя их доменные идентификаторы.

Часть возвращаемых данных - это DN менеджера пользователя (в свойстве manager). Мне нужно снова запросить AD, чтобы получить информацию о менеджере (идентификатор домена, адрес электронной почты, имя и т. Д.). Я искал и не нашел ни малейшего намека на то, что мне нужно использовать в своем фильтре.

Это то, что я использую, и мне всегда возвращается значение 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;
        }
    }
}

Можно ли искать в Active Directory по DN? Если да, то что я делаю не так?


person NoBullMan    schedule 26.07.2018    source источник


Ответы (1)


Это то, что у меня сработало. Однако я считаю, что он должен работать с objectClass = user, но я продолжал возвращать null. Когда я сменил имя на имя = sDN, это сработало.

Вся суть этого кода

DirectoryEntry de = new DirectoryEntry(adPath + "/" + sDN);

- начать поиск в каталоге с объекта пользователя; не должно быть необходимости в дополнительном поиске, чтобы сказать, какое отличительное имя.

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;
}
person NoBullMan    schedule 27.07.2018