2015-02-11 130 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按默認方式連接。並感謝所有答案的傢伙:)