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

观察本地窗口变量 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 通),但我不知道为什么它不工作。你们中的任何人都可以看看代码中是否有任何缺陷吗?(是的,在问这个问题之前,我已经搜索了所有关于连接到 AD 的错误和各种问题,但没有一个解决方案有效)。

4

3 回答 3

0

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

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

LDAP SSL(端口 636) ??

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

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

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

PS:

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

于 2015-02-11T18:38:25.897 回答
0

如果您的域名是“example.com”,假设您有一个名为“用户”的组织单位 (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;
    }
于 2015-02-11T17:57:00.407 回答
0

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

于 2015-02-12T16:06:31.833 回答