65.9K
CodeProject 正在变化。 阅读更多。
Home

用户在 Exchange Server 的通讯簿中搜索,使用 ASP 和 ADSI / LDAP

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.16/5 (10投票s)

2004 年 5 月 11 日

3分钟阅读

viewsIcon

138541

downloadIcon

934

使用 ASP 和 ADSI / LDAP 在 Exchange Server 的通讯簿中搜索用户。

引言

通过 ADSI(Active Directory Service Interface),微软提供了一个 COM 组件,用于访问各种目录服务。ADSI 是 Windows 2000 的一个组件。

您可以将 ADSI 视为各种目录服务的类似 ODBC 接口。在网络中,目录服务充当用户和功能的管理,例如计算机、打印机、用户和服务。

目录服务的结构是分层的,可以看作是一个目录树:有一个根,您可以从根开始访问其他条目。根可以包含容器(节点)和叶。容器本身可以包含其他条目,而叶标志着目录树中分支的末端。目录中的每个条目都描述一个对象并具有特定的属性。这可以用 Windows 文件系统来说明:硬盘驱动器C: 是根,目录/文件夹是容器,文件是叶。

ADSI 支持的目录系统示例包括:WinNT(访问 Windows NT)、GC(Windows 2000 全局编录)、IIS(Internet Information Server 元数据库)、NWCOMPAT(Novell NetWare 3.x)、NDS(Novell NetWare 4.x)和 LDAP 目录。

在这种情况下,将特别考虑目录服务 LDAP。LDAP(轻型目录访问协议)于 90 年代初在密歇根大学开发,允许更轻松地访问 X.500 协议的目录服务。LDAP 基于 TCP/IP,使用端口号 389。越来越多的公司在其产品中集成 LDAP,例如微软的 Exchange、Windows 2000 和 Site Server。

在 Exchange LDAP 目录中搜索

使用 GetObject 方法,您可以访问 LDAP 目录服务中已知的对象或容器,从而可以显示通讯簿。

但是,如果要搜索用户,该怎么办?

在这种情况下,ADSI 通过 OLE-DB 提供对目录条目的访问。这使得进行查询成为可能。注意:通过 OLE-DB 的访问只是只读访问。无法修改条目。

LDAP 查询需要以下信息

  • 目录服务层次结构的起始对象。
  • 搜索条件。
  • 应返回的找到对象的属性。
  • 基于起始对象的搜索深度。

LDAP 查询的语法是

<LDAP://Servername/Startobject> ; search criteria ; 
returned attributes ; search depth

搜索条件的一个特征是用于定义搜索条件的运算符。

运算符

  • & - 逻辑“与”
  • | - 逻辑“或”
  • ! - 逻辑“非”
  • = - 等于
  • > - 大于
  • < - 小于

放在条件的前面。

例如:(|(givenname=名)(sn=姓氏*))。

星号 (*) 符号可以用作多个符号的占位符。

一般来说,Exchange Server 仅支持在右侧使用星号符号。必须首先在 Exchange Server 的 XXXXX 下激活左侧星号符号的使用。

有三种可能的搜索深度:BASE(仅基本级别)、ONELEVEL(基本级别和第一个子级别)和 SUBTREE(基本级别和所有后续子级别)。

示例:在 Exchange LDAP 目录中搜索

首先,建立与数据库的 ADO 连接

set oConn = CreateObject("ADODB.Connection")
set oCommand = CreateObject("ADODB.Command")

oConn.Provider = "ADsDSOObject"
oConn.Open "Ads Provider"

然后进行 LDAP 查询并通过 ADO 发送到数据库

'***Variables and constants

strServerName = "Exchange01"
strName = Request.Form("name")
strLastname = Request.Form("lastname")

strQuery = "<LDAP://" & strServername & _
  ">;(|(sn=" & strLastname & "*)(givenname=" & strName2& "*));*;subtree"

oCommand.CommandText = strQuery
set oRS = oCommand.Execute

如果查询成功,结果将返回到 RecordSet 对象中。然后可以使用已知的 ADO 方法显示结果

<%
if not oRS.eof then
%>
   <div align="center">
   <table cellpadding="0" border="0" cellspacing="0">
   <tr bgcolor="#C0C0C0">
      <td height="20"><b>Name</b></td>
      <td height="20"><b>Department</b></td>
      <td height="20"><b>Phone</b></td>
      <td height="20"><b>Email</b></td>
   </tr>
   <%While not ors.eof%>
      <tr>
        <td><%=oRS.Fields("sn")%>, <%=oRS.Fields("givenname")%></td>
        <td><%=oRS.Fields("department")%></td>
        <td><%=oRS.Fields("telephoneNumber")%></td>
        <td><%=oRS.Fields("mail")%></td>
      </tr>
      <%
      oRS.MoveNext
   wend %>
  </table>
</div>
<%else  
   Response.Write "No item found" 
end if%>

Exchange LDAP 中用户属性的概述

在 Exchange 中,以下属性分配给每个用户

  • 名称
  • 邮件
  • cn
  • sn
  • givenname(名字)
  • member(成员)
  • department
  • title
  • uid
  • company(公司)
  • telephonenumber(电话号码)
  • facsimiletelephonenumber(传真号码)
  • postaladdress(邮政地址)
  • homepostaladdress(家庭邮政地址)
  • physicalDeliveryOfficeName(办公地点).

摘要

如果您将这些组件放在一起并添加一个搜索掩码,那么您将获得 Exchange 通讯簿的轻松搜索功能,例如,用于内部网。

下载文件并享受!

© . All rights reserved.