通过.NET连接到Active Directory

问题描述 投票:3回答:3

我有一个带有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的错误和各种问题,但没有一个解决方案有效)。

c# windows active-directory virtualbox ldapconnection
3个回答
0
投票

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

但是,运行此代码的计算机将添加到AD域,并使用AD用户帐户运行。如果您没有将计算机添加到您要查询的同一域中,则可以尝试“运行方式”选项(Shift +右键单击)以启动程序或Visual Studio。

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

0
投票

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

如果LDAP完全不可用,将返回“服务器无法运行”。所以看来,例如端口389无法访问。防火墙?

LDAP SSL(端口636)??

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

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

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

PS:

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.