Почему нельзя связаться с сервером Active Directory через PrincipalContext? - PullRequest
6 голосов
/ 17 ноября 2009

У меня возникли проблемы с доступом к Active Directory из моего приложения WinForm. Я хочу создать пользователя и запросить пользователя из Active Directory.

Вот фрагмент кода для поиска пользователя:

public bool FindUser(string username)
{
    using (PrincipalContext context = new PrincipalContext(
        ContextType.Domain, 
        this.domainName, 
        this.DomainUserName, 
        this.DomainPassword))
    {                
        UserPrincipal user = UserPrincipal.FindByIdentity(context, username);
        return (user != null) ? true : false;
    }
}

Я не могу создать объект PrincipalContext на основе заданных аргументов. Я получаю это исключение:

Exception: The server could not be contacted.

и внутреннее исключение гласит, что

Inner Exception: The LDAP server is unavailable.

где работает домен. Я могу пинговать и подключаться к этому домену.

Ответы [ 3 ]

1 голос
/ 05 января 2010

Вы можете попробовать следующий код.

    public bool FindUser2(string userName)
    {
        try
        {
            DirectoryContext context = new DirectoryContext(
                DirectoryContextType.Domain,
                domainName,
                domainName + @"\" + domainUserName,
                domainPassword);
            DirectoryEntry domainEntry = Domain.GetDomain(context).GetDirectoryEntry();
            DirectorySearcher searcher = new DirectorySearcher(domainEntry,
                                                               "(|(objectCategory=user)(cn=" + domainUserName + "))");
            SearchResult searchResult = searcher.FindOne();
            return searchResult != null;
        }
        catch
        {
            return false;
        }
    }
1 голос
/ 17 ноября 2009

Вы можете использовать следующий код:

objectPath = "LDAP://CN=SC-5515_2,OU=Forus,DC=**MyDomainName**,DC=no";

public static bool Exists(string objectPath)
{
    return DirectoryEntry.Exists(objectPath);
}

Это код, который я использовал для этого. Он отлично работает при тестировании, если какие-либо объекты существуют в Active Directory.

0 голосов
/ 14 января 2010

Вы также можете рассмотреть возможность использования System.DirectoryServices.Protocols для доступа к другим доменам. Немного крутой кривой обучения, но гораздо быстрее и гибче - например, Вы можете сделать правильный асинхронный поиск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...