2014-03-04 91 views
2

我知道這個問題之前已經被問過了,我爲打開另一個問題而道歉,但是我在線閱讀的所有解決方案都沒有解決我遇到的問題。出於最好不說的原因,我需要在接下來的三天內完成這項工作。我以前只使用過LDAP,並且我沒有人可以幫助我(甚至不是管理員)。無法連接到LDAP「無效的DN語法」

這是我想要的基本代碼:

DirectoryEntry rootEntry = new DirectoryEntry("LDAP://serverName.dev.domain.com:portNumber/o-domain,o=dxc.com","uid=userName,ou=bindids,o=domain,o=dcx.com", "password", AuthenticationTypes.None); 
DirectorySearcher dSearch = new DirectorySearcher(rootEntry); 
try 
{ 
foreach (SearchResult result in dSearch.FindAll()) 

等。這失敗的dSearch.FindAll()行

我沒有查詢在這個時候寫的(建議/語法上這將是AWESEOME),因爲我不知道我需要從目錄中拉回什麼值。管理員告訴我這不是活動目錄。

當我刪除AuthenticationTypes時,出現不同的錯誤,說我有一個未知的用戶名或密碼錯誤。我的管理員已經檢查並確保他們工作。他甚至重置了密碼,以防止它是一個保留的字符問題。

任何幫助或想法,你可以提供將不勝感激。我一直在這裏工作了大約12個小時,我的大腦被打亂了。

編輯:以下是完整的錯誤

Error: An invalid dn Syntax has been specified

@Alexanderius - 謝謝你的另一種格式。有了這個,我得到一個COMException:服務器不是Operational。

@ X3074861X - 這是一個Oracle Directory Server(又名SUN One Directory Server)。

編輯:我稍微修改了我的代碼。 (將o域更改爲o =域並添加了不同的查詢)。現在我得到一個COMException:「服務器上沒有這樣的對象」。

DirectoryEntry rootEntry = new DirectoryEntry("LDAP://ServerName.Domain.com:2394/o=Domanin,o=dxc.com", 
        "uid=UserName,ou=bindids,o=Domain,o=dcx.com", "Password", AuthenticationTypes.None); 
DirectorySearcher dSearch = new DirectorySearcher(rootEntry); 
dSearch.Filter = "uid=" + "AUser"; 
dSearch.SizeLimit = 100; 
dSearch.SearchScope = SearchScope.Subtree; 
try 
{ 
SearchResult newTest = dSearch.FindOne(); 

等等。

更新:還有一個錯誤,我沒有通知!在綁定語句之後,當我將鼠標懸停在「rootEntry」上時,我發現它有一個'System.Runtime.InteropServices.COMException:未指定的錯誤\ r \ n「。這對我沒有什麼幫助,但也許你們中的一個人見過?前

+0

你能發表詳細的錯誤? –

+0

你知道這是什麼類型的目錄嗎? Novell公司? Lotus Domino?的iPlanet? – X3074861X

回答

1

我連接到我的廣告是這樣的:

DirectoryEntry = new DirectoryEntry("LDAP://Myserver/MyRootEntry,dc=MyDomainName,dc=net", "SomeUserName", "SomeUserPassword", AuthenticationTypes.Secure); 

我的服務器名是:myserver.mydomain.net

嘗試連接這樣的

0

我。我一直在使用這個實現來驗證通過使用SUN堆棧構建的iPlanet來驗證用戶,因此它也應該可以在Oracle Directory服務器上運行。對於定製和一些較低級別細節的,我是System.DirectoryServicesSystem.DirectoryServices.Protocols庫的超級粉絲,特別是與非AD目錄服務器工作時:

// build your server name - we'll use 'serverName.dev.domain.com' and port 389 
var BuildServerName = new StringBuilder(); 
BuildServerName.Append("serverName.dev.domain.com"); 
BuildServerName.Append(":" + Convert.ToString(389)); 

// setup an ldapconnection to that endpoint 
var ldapConnection = new LdapConnection(BuildServerName.ToString()); 

現在,我們需要詳細瞭解這方面的一些信息:

// it looks like you have an administrative account to bind with, so use that here 
var networkCredential = new NetworkCredential("userName", "password", "dc=MyDomainName,dc=net"); 

// set the following to true if it's over ssl (636), if not just set it to false 
ldapConnection.SessionOptions.SecureSocketLayer = SSL; 
ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; }; 

// now set your auth type - I typically use 'negotiate' over LDAPS, and `simple` over LDAP 
// for this example we'll just say you're not using LDAPS 
ldapConnection.AuthType = AuthType.Basic; 
ldapConnection.Bind(networkCredential); 

現在你應該綁定到該目錄,這意味着你可以使用SearchRequest對象搜索。以下是我如何使用它的一個示例:

// setup a new search request 
var findThem = new SearchRequest(); 
findThem.Filter = "This is where you need to construct a filter for what you're looking for" 
findThem.Scope = System.DirectoryServices.Protocols.SearchScope.Subtree; 

// we'll execute a search using the binded administrative user 
var searchresults = (SearchResponse) ldapConnection.SendRequest(findThem); 

// this will contain entries if your search filter returned any results 
if(searchresults.Entries.Count >= 1) 
{ 
    // here are your list of returned entries 
    SearchResultEntryCollection entries = searchresults.Entries; 

    // do some work\extraction on them 
} 

這裏的最後一部分是您的實際LDAP過濾器。如果您想您的域名中搜索與userName一個uid用戶,您的過濾器應爲:

findthem.Filter = "(uid=username)"; 

如果你想結合說具有特定屬性的objectClass,你會怎麼做:

findthem.Filter = "(&(objectClass=user)(uid=username))"; 

這裏是在過濾了一些很好的聯繫:

LDAP Filtering Syntax

LDAP Query Basics

Oracle LDAP Search Filters