2011-05-13 191 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将会减少“东西”的数量,变成沉闷的咆哮。