为什么不能通过PrincipalContext联系Active Directory服务器?

时间:2009-11-17 10:16:07

标签: c# active-directory

我在从WinForm应用程序访问Active Directory时遇到一些问题。我想要的是从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.

域正在运行。我可以ping通它,也可以连接到这个域。

3 个答案:

答案 0 :(得分:1)

您可以使用以下代码:

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

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

这是我用过的代码。如果Active Directory中存在任何对象,它可以正常进行测试。

答案 1 :(得分:1)

您可以尝试下一个代码。

    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;
        }
    }

答案 2 :(得分:0)

您还可以考虑使用System.DirectoryServices.Protocols访问其他域。有点陡峭的学习曲线,但速度更快,更灵活 - 例如你可以进行适当的异步搜索。