通过.NET连接到Active Directory

时间:2015-02-11 17:33:08

标签: c# windows active-directory virtualbox ldapconnection

我有一个带有Active Directory的虚拟机,我想用.NET连接到它,我已经连接到运行OpenLDAP的ubuntu机器,但是当连接到AD时它运行不顺畅。

我尝试连接的代码如下:

var directoryEntry = 
    new DirectoryEntry("LDAP://192.168.1.1", @"EXAMPLE\Administrator", "Abc1234");

try
{
   var test = directoryEntry.NativeObject;
}
catch (Exception e)
{
    System.Diagnostics.Debug.WriteLine(e.Message);
}

在locals窗口中查看变量directoryEntry的Guid,名称等说“功能评估已超时”。

然后当它到达try块时,它只是说“服务器不可操作”。

我也试过这段代码,它在“ldap.bind”失败告诉我“ldap-server不可用”。

using (var ldap = new LdapConnection("192.168.1.1:389"))
{
    ldap.AuthType = AuthType.Basic;
    ldap.SessionOptions.ProtocolVersion = 3;
    ldap.Bind(new NetworkCredential(@"EXAMPLE\Administrator", "Abc1234"));
}

我知道服务器已启动并运行,我知道他们有连接(机器可以相互ping通)但我无法弄清楚它为什么不起作用。您是否可以看到代码中是否存在任何缺陷? (是的,我在搜索这个问题之前用Google搜索了所有关于连接到AD的错误和各种问题,但没有一个解决方案有效。)

3 个答案:

答案 0 :(得分:0)

如果您的域名是' example.com'并且假设您有一个名为' users'的组织单位(OU)。这对我来说非常好。

但是,运行此代码的计算机将添加到AD域,并使用AD用户帐户运行。如果您没有将计算机添加到您要查询的同一域中,您可以尝试"运行为"选项(Shift +右键单击)启动程序或视觉工作室。

    public static List<string> GetAllUsers()
    {
        List<string> users = new List<string>();

        using (DirectoryEntry de = new DirectoryEntry("LDAP://OU=Users,DC=example,DC=local"))
        {
            using (DirectorySearcher ds = new DirectorySearcher(de))
            {
                ds.Filter = "objectClass=user";
                SearchResultCollection src = ds.FindAll();
                foreach (SearchResult sr in src)
                {
                    using (DirectoryEntry user = new DirectoryEntry(sr.Path))
                    {
                        users.Add(new string(user.Properties["sAMAccountName"][0].ToString()));

                    }
                }
            }

        }
        return users;
    }

答案 1 :(得分:0)

我在我自己的Active Directory测试环境中测试了您的代码(使用更改的域/密码...),它可以正常工作。如果我故意使用错误的密码进行测试,我会收到“无效的凭据”。细

如果LDAP完全不可用,将返回

“服务器无法运行”。所以看来,例如端口389无法访问。 防火墙?

LDAP SSL(端口636)??

  
    

如果您没有将计算机添加到您要查询的同一域中,您可以尝试“运行方式”选项(Shift +右键单击)启动程序或可视工作室。

  

是的,当我看到这个问题时,这也是我的第一个想法。但是,在这种情况下,您似乎会收到另一个错误。

我建议:安装WireShark,网络分析器并检查通过线路发送的内容(假设您的AD在另一台机器上运行)。 WireShark经常帮助我诊断AD,登录,SMB或其他协议的错误。

PS:

Ravi M Patel的答案是一个很好的搜索示例,我在自己的代码中几乎都是这样做的。

答案 2 :(得分:0)

问题解决了。我有两个网络适配器和适配器1有dhcp和我尝试连接的静态IP在适配器2上运行。我只是给适配器1静态地址并且能够以这种方式连接,看起来代码通过适配器1连接默认。并感谢所有答案的人:)