2015-02-11 131 views
2

我有一个虚拟机,我想用.NET连接到Active Directory,我已经连接到一台运行OpenLDAP的Ubuntu机器,但是当连接到AD时它运行不正常。通过.NET连接到Active Directory

我试图用连接的代码如下:

DirectoryEntry 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服务器不可用”

using (LdapConnection 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中的错误和各种问题的问这个问题之前,但没有任何解决方案都工作)

问候,

回答

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

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

如果LDAP完全不可用,则将返回“服务器不可操作”。所以看来,例如端口389不可用。 防火墙?

LDAP SSL(端口636)??

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

是的,这是我的第一个想法,因为我看到了这个问题。但是,在这种情况下,您似乎会得到另一个错误。

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

PS:

从拉维·帕特尔中号的回答是搜索的很好的例子,我几乎做同样在自己的代码。

0

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