你曾经相通过VBS添加一个虚拟目录吗?(我想过~)自动建立ISAPI服务器扩展?或者建立一整个站点,
包括权限?你可以用ADSI做这些和更多的事情.
ADSI (Active Directory Services Interface)是一种应用程序数据接口.微软的操作系统支持ADS
I的有Windows NT 4.0 Server, Exchange, IIS, 和Site Server.在WIN2K中ADSI将会成为操作系统
的接口并且可能取代注册表.ADSI的关键并不在于底层的数据存储,而在于它自已的接口层.用一个
接口,只要学习一次,你就可以配置所有的服务器程序.(是不是很爽啊,呵呵!)不像API,你可以使用
所有的语言或环境来通过COM访问ADSI.(这是后话!)
警告:
在运行本文章的例子之前,请先备份IIS4.0:
打开MMC
(以下略去备份过程)
面向对象的数据库
ADSI对所有的数据都当作对象来看待.用ADSI你可以熟练地操作所有的数据而不用去学一种数据库
查询语言如SQL.相对于一个关系型的数据库,建立一个面向对象的数据库要简单和快速一些.在一个
关系数据库中程序员不得不要知道一个对象是如何破坏和存储的;然而面向对象的数据存储,像ADSI
,不存在这些问题.程序员只要知道你想要访问的那个对象的名字.
为了去对比这两种数据库类型,设想你要一个员工的资料:个人信息,部门信息,和薪水信息.在一个
关系数据库中,这三个数据可能会被分别放在三个表中.而且对数据库的一个更改可能只会影响到其
中的一部分表,对数据库的修改程序员不得不通过一种数据库查询语言如SQL.很少用人去注意对象
是如何被存储的(除了数据库管理员).然而ADSI把所有的信息视为对象,对象之间的联系正是ADSI执
行的一部分,因此,这一部分就不再需要程序员处理了.一旦你学会了处理一种ADSI数据,你就学会了
处理所有的ADSI数据库.作为一个对比,你可能需要学习每一种关系数据库语言如果你要用不同的数
据库的话.(像FOXPRO)
数据结构
数据库结构是一个分级的模型.一个对象节点可以是另一个节点的父节点,兄弟结点,或者一个子节
点.每一个子节点继承父节点的属性.数据库有两个逻辑部分.第一个是定义数据和数据关联的计划.
第二个部分是数据的实际存储.定义一个员工对象是放在计划部分,个人信息放在数据部分.
获得一个对象的实例
不像COM,你不用去使用SERVER.CREATEOBJECT去获得一个ADSI对象的实例.你只需使用GETOBJECT方
法和一个指定服务器和联接位置的参数.例子一有两个GETOBJECT的例子.在第一种情况下,代码建立
了一个WINDOWS NT的ADSI实例.每二个例子取得了一个IIS的ADSI对象.
Example 1
For Windows NT
Set Object = GetObject("WinNT://15seconds" )
For LDAP
Set Object = GetObject("IIS://localhost/w3svc/1")
一些AD服务接口用一种特别的被称为X.500华贵名称的命名规则.IIS并没有用这种规则但是你必须
对X.500这一个命名规则因为你有可能还要操作其它的ADSI数据.你可以
从ftp://src.doc.ic.ac.uk/rfc/rfc1484.txt 得到相关资料.
数据取回
当我们在一个LDAP服务器上寻找信息时,我们必须知道是否信息在实例中或者在规划部分.举一个例
子来说,一个对象名称可以包含在一个对象实例中但是一个对象属性的列表将会存储在一个计划部
分.员工名称,雇佣日期,和部门被存储在员工对象中.计划部分存储了员工属性的定义像数据类型.
例二说明了一个对象实例和对象计划的定义.
Example 2
Employee Instance
Name: Bob Jones
Hire Date: 1/1/98
Department: Information Technology
Employee Object Instance
Attribute "Name", single value, data-type "text", maxlength 50"
Attribute "Hire Date", single value, data-type "date"
Attribute "Department", single value, data-type "text"
对SQL程序员来说,对象定义和一个表的定义是相似的.对象实例就像是一个表中的特定的一行.SQL
和ADSI的区别就在于数据是不是跨越了多个表,程序员是否需要管理数据之间的关系.在ADSI中,接
口是这些关系的负责人.
默认WEB站点的通有属性
第一个例子可以看到IIS4.0的默认WEB站点的属性.在例3中,代码会联接到本地机的默认WEB站点.
Example 3
<%
strMachineName = "localhost" 'domain name
strObjectPath = "W3SVC/1" 'object name
'construct object location in IIS
strPath = "IIS://" & strMachineName & "/" & strObjectPath
Set IISObject = GetObject (strPath) 'connect to IIS metabase
%>
Name = "<%= IISObject.Name %>"
Parent= "<%= IISObject.Parent %>"
SchemaLocation = "<%= IISObject.Schema %>"
Class = "<%= IISObject.Class %>"
Guid = "<%= IISObject.Guid %>"
ADSPath = "<%= IISObject.AdsPath %>"
输出显示是:
Name = "1"
Parent= "IIS://localhost/W3SVC"
SchemaLocation = "IIS://localhost/schema/IIsWebServer"
Class = "IIsWebServer"
Guid = "{8B645280-7BA4-11CF-B03D-00AA006E0975}"
ADSPath = "IIS://localhost/W3SVC/1"
注意:如果你要在一个ASP页面中运行本程序,请确定登陆的用户被授予了管理员的权限.
在最后一个例子的数据取回可以用于任何一个对象,包括计划对象.每一个对象不管他是一个实在的
对象还是一个计划对象都肯定有这些属性:名称,父,计划定们,CLASS,GUID,和ADS路径.
这些信息包括了通过分级结构访问数据的一些导航信息.NAME属性是一个对象的名称.一个parent属
性告诉了父对象的位置.schemalocation属性指的是计划对象的位置.class属性包括了对象的类型,
它包括了一个对象所有的属性并且被定们到schemalocation这个位置.GUID属性是一个对象的唯一
的识别码.AD