2011-05-13 53 views
3

我一直在試圖查詢LDAP目錄服務器以檢索tnsnames條目。我有以下代碼工作,但它沒有正確的味道。是不是因爲它是錯誤的,或者是因爲查詢LDAP需要間接的幾級如何從LDAP目錄中提取TNSNames

let identifier = LdapDirectoryIdentifier(server, port) 
    use connection = new LdapConnection (identifier) 
    connection.AuthType <- AuthType.Anonymous 
    let request = System.DirectoryServices.Protocols.SearchRequest(defaultAdminContext, "cn=" + sid, SearchScope.OneLevel, "orclnetdescstring") 
    let response = connection.SendRequest request :?> SearchResponse 

    Seq.init response.Entries.Count (fun i -> response.Entries.[i]) 
    |> Seq.collect (fun entry -> 
     let value = entry.Attributes.["orclnetdescstring"] 
     Seq.init value.Count (fun i -> value.[i]) 
     |> Seq.map (fun v -> Some (v :?> string)) 
     ) 

我希望的是簡單的通話,基本上是「查詢目錄,並返回結果」,但似乎有一個很多'東西'我必須這樣做才能讀取真正的價值。

+0

你可以用你的語言,操作系統和directoy重新使用你的問題嗎? – JPBlanc 2011-05-13 10:55:00

+0

我已經添加了.net標記,但我不知道正在使用的目錄。我需要知道嗎?我認爲LDAP是一個標準 – 2011-05-13 13:13:38

回答

1

客戶端連接到目錄服務器後,客戶端可以發出請求並讀取響應。請求採取LDAP操作的形式,如綁定,搜索,添加,修改,刪除等。

當目錄服務器接受連接時,該連接(或LDAP會話,如果您願意的話)具有匿名身份(RFC4513)。根據目錄服務器的配置和請求的類型,客戶端可能需要將連接綁定到授權標識 - 這可以通過綁定請求來完成,該請求可以是「簡單」類型或SASL類型。與目錄服務器管理員進行對話,以確定您的客戶端是否必須將連接綁定到授權身份 - 管理員可能會允許某些請求未經身份驗證,但這通常是一種不正常的做法。

一種用於數據搜索需要以下參數:

  • 一個「搜索基地」,或基本對象
  • 一個「搜索範圍」,其是鹼只,一個電平的基礎對象的下方,或者基礎對象下的整個子樹
  • 「搜索篩選器」,目錄服務器用它從候選項目列表中選擇匹配的項目以返回客戶端
  • 要返回的屬性列表(客戶端可以使用特殊屬性'1.1'來獲得條目d可以用於確定是否存在條目)

還有其他參數是可選的,例如,大小限制(要返回的條目數限制)和時間限制(搜索時間的限制),是否僅返回屬性,屬性和值等。一般而言,所有搜索請求應提供時間限制以確保搜索將超時 - 因爲目錄服務器可能未配置對客戶端的LDAP請求的時間限制。

目錄服務器對搜索請求的響應將始終包含結果代碼。如果搜索成功,則此結果代碼應該爲零(0),或者它可能是代碼,指示可能已返回的數字條目超過了允許返回的條目數(即允許返回的值受限於搜索請求的大小限制或服務器的限制),或者可能是指示發生錯誤的結果代碼。

假設錯誤代碼爲零,接下來是一系列SearchResultEntries或SearchResultReferences,最後是一個SearchResultDone--一個好的API將爲客戶端管理這部分,並簡單地呈現作爲數組或列表返回的條目。

最後,你的問題的答案是'是的,有些事情要做',然後才能閱讀條目。一個好的API將會減少「東西」的數量,變成沉悶的咆哮。