如何从LDAP目录中提取TNSNames

时间:2011-05-13 08:09:16

标签: .net ldap

我一直在尝试查询LDAP目录服务器以检索tnsnames条目。我有以下代码工作,但它闻起来不正确。是因为它是错误的,还是因为查询ldap涉及几个级别的间接

   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))
       )

我希望一个简单的调用基本上“查询目录并返回结果”,但似乎有很多' stuff '我必须做才能读取真正的价值观。

1 个答案:

答案 0 :(得分:1)

客户端连接到目录服务器后,客户端可以发出请求并读取响应。请求采用LDAP操作的形式,例如绑定,搜索,添加,修改,删除等。

当目录服务器接受连接时,该连接(或者如果您愿意,则为LDAP会话)具有匿名身份(RFC4513)。根据目录服务器的配置和请求的类型,客户端可能需要将连接绑定到授权标识 - 这是通过绑定请求完成的,绑定请求可以是“简单”类型或SASL类型。与目录服务器管理员对话以确定您的客户端是否必须将连接绑定到授权标识 - 管理员可能允许某些请求而不进行身份验证,尽管这通常是一种不好的做法并且不常见。

搜索数据需要以下参数:

  • '搜索基础'或基础对象
  • 一个'搜索范围',它只是基础,在基础对象下面一层,或者在基础对象下面的整个子树
  • a'搜索过滤器',目录服务器用于从候选条目列表中选择匹配的条目以返回到客户端
  • 要返回的属性列表(客户端可以使用特殊属性“1.1”来获取条目可分辨名称,这可用于确定条目是否存在)

还有其他可选的参数,例如,大小限制(要返回的条目数限制)和时间限制(搜索可以采取的时间限制),是否只返回属性,或属性和值,以及其他一些。一般而言,所有搜索请求都应提供时间限制以确保搜索超时 - 因为目录服务器可能未配置有来自客户端的LDAP请求的时间限制。

目录服务器对搜索请求的响应将始终包含结果代码。如果搜索成功,此结果代码应为零(0),或者它可能是一个代码,表示可能已返回的数字条目超过了允许返回的条目数(条目数为允许返回的内容受搜索请求中的大小限制或服务器限制的限制,或者它可能是表示发生错误的结果代码。

假设错误代码为零,则接下来是一系列SearchResultEntries或SearchResultReferences,最后一个SearchResultDone - 一个好的API将为客户端管理这部分,并简单地呈现作为数组或列表返回的条目。

最后,你的问题的答案是,“是的,有一些事情要做”,然后才能阅读条目。一个好的API会减少“东西”到沉闷咆哮的数量。