ASP网页设计使用ADSI对IIS举行编程
写软件都是想的时间比写的时间要长的.如果反过来了就得看看是什么原因了.另外大家可以回去问问公司里的小MM.(一般企业里,跟你们交付软件接触得最多的是她们)iis|编程译者注:这是一篇有关ADSI的文章,由SUNWEN翻译。在浏览它之前,请您确保您最少已晓得了甚么是AD和ADSI。笔者不再敷述。假如您对IIS和EXCHANGESERVER和别的M$产物的编程感乐趣的话,(ADSI能够说是它们的接口),请务必读完它,由于这篇文章是很出色的!前面翻译的更流畅些,E文不是太好,嘻嘻!
了解ADSI
你已经相经由过程VBS增加一个假造目次吗?(我想过~)主动创建ISAPI服务器扩大?大概创建一全部站点,包含权限?你能够用ADSI做这些和更多的事变.
ADSI(ActiveDirectoryServicesInterface)是一种使用程序数据接口.微软的操纵体系撑持ADSI的有WindowsNT4.0Server,Exchange,IIS,和SiteServer.在WIN2K中ADSI将会成为操纵体系的接口而且大概代替注册表.ADSI的关头其实不在于底层的数据存储,而在于它自已的接口层.用一个接口,只需进修一次,你就能够设置一切的服务器程序.(是否是很爽啊,呵呵!)不像API,你可使用
一切的言语或情况来经由过程COM会见ADSI.(这是后话!)
告诫:
在运转本文章的例子之前,请先备份IIS4.0:
翻开MMC(以下略往备份历程)
面向工具的数据库
ADSI对一切的数据都看成工具来对待.用ADSI你能够纯熟地操纵一切的数据而不必往学一种数据库查询言语如SQL.相对一个干系型的数据库,创建一个面向工具的数据库要复杂和疾速一些.在一个干系数据库中程序员不能不要晓得一个工具是怎样损坏和存储的;但是面向工具的数据存储,像ADSI,不存在这些成绩.程序员只需晓得你想要会见的谁人工具的名字.
为了往对照这两种数据库范例,假想你要一个员工的材料:团体信息,部门信息,和薪水信息.在一个干系数据库中,这三个数据大概会被分离放在三个表中.并且对数据库的一个变动大概只会影响到个中的一部分表,对数据库的修正程序员不能不经由过程一种数据库查询言语如SQL.很罕用人往注重工具是怎样被存储的(除数据库办理员).但是ADSI把一切的信息视为工具,工具之间的接洽恰是ADSI实行的一部分,因而,这一部分就不再必要程序员处置了.一旦你学会了处置一种ADSI数据,你就学会了处置一切的ADSI数据库.作为一个对照,你大概必要进修每种干系数据库言语假如你要用分歧的数据库的话.(像FOXPRO)
数据布局
数据库布局是一个分级的模子.一个工具节点能够是另外一个节点的父节点,兄弟结点,大概一个子节点.每个子节点承继父节点的属性.数据库有两个逻辑部分.第一个是界说数据和数据联系关系的企图.第二个部分是数据的实践存储.界说一个员工工具是放在企图部分,团体信息放在数据部分.
取得一个工具的实例
不像COM,你不必往利用SERVER.CREATEOBJECT往取得一个ADSI工具的实例.你只需利用GETOBJECT办法和一个指定服务器和连接地位的参数.例子一有两个ETOBJECT的例子.在第一种情形下,代码创建了一个WINDOWSNT的ADSI实例.每二个例子获得了一个IIS的ADSI工具.
Example1
ForWindowsNT
SetObject=GetObject("WinNT://15seconds")
ForLDAP
SetObject=GetObject("IIS://localhost/w3svc/1")
一些AD服务接口用一种出格的被称为X.500华贵称号的定名划定规矩.IIS并没有效这类划定规矩可是你必需对X.500这一个定名划定规矩由于你有大概还要操纵别的的ADSI数据.你能够从ftp://src.doc.ic.ac.uk/rfc/rfc1484.txt失掉相干材料.
数据取回
当我们在一个LDAP服务器上寻觅信息时,我们必需晓得是不是信息在实例中大概在计划部分.举一个例
子来讲,一个工具称号能够包括在一个工具实例中可是一个工具属性的列表将会存储在一个企图部
分.员工称号,雇佣日期,和部门被存储在员工工具中.企图部分存储了员工属性的界说像数据范例.
例二申明了一个工具实例和工具企图的界说.
Example2
EmployeeInstance
Name:BobJones
HireDate:1/1/98
Department:InformationTechnology
EmployeeObjectInstance
Attribute"Name",singlevalue,data-type"text",maxlength50"
Attribute"HireDate",singlevalue,data-type"date"
Attribute"Department",singlevalue,data-type"text"
对SQL程序员来讲,工具界说和一个表的界说是类似的.工具实例就像是一个表中的特定的一行.SQL
和ADSI的区分就在于数据是否是超过了多个表,程序员是不是必要办理数据之间的干系.在ADSI中,接
口是这些干系的卖力人.
默许WEB站点的通有属性
第一个例子能够看到IIS4.0的默许WEB站点的属性.在例3中,代码会连接到当地机的默许WEB站点.
Example3
<%
strMachineName="localhost"domainname
strObjectPath="W3SVC/1"objectname
constructobjectlocationinIIS
strPath="IIS://"&strMachineName&"/"&strObjectPath
SetIISObject=GetObject(strPath)connecttoIISmetabase
%>
Name="<%=IISObject.Name%>"<br>
Parent="<%=IISObject.Parent%>"<br>
SchemaLocation="<%=IISObject.Schema%>"<br>
Class="<%=IISObject.Class%>"<br>
Guid="<%=IISObject.Guid%>"<br>
ADSPath="<%=IISObject.AdsPath%>"<br>
输入显现是:
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属性是一个工具的独一
的辨认码.ADSPath是你取回的这个工具的地位.
注:名为1的服务器代表默许的WEB站点
默许WEB站点的属性
既然我们已晓得了工具的地位和工具的范例,那就让我们来看一看默许WEB站点的属性.为了到达
这个目标,我们必需要获得默许WEB站点的企图(schema),找出相干的属性,而且看默许WEB站点的这
些属性的值.
Example4
<%
strMachineName="localhost"
strObjectPath="W3SVC/1"findfirstwebserverlistedinw3svc
strPath="IIS://"&strMachineName&"/"&strObjectPath
SetIISObject=GetObject(strPath)
findlocationofwebserversdefinition
SetClassDefinition=GetObject(IISObject.Schema)
%>
<tableborder=1>
<tr><th>DefaultWebServerProperty</th><th>DefaultWebServerValue</th></tr>
<tr><td>Name</td><td><%=IISObject.Name%></td></tr>
<tr><td>Parent</td><td><%=IISObject.Parent%></td></tr>
<tr><td>SchemaLocation</td><td><%=IISObject.Schema%></td></tr>
<tr><td>Class</td><td><%=IISObject.Class%></td></tr>
<tr><td>Guid</td><td><%=IISObject.Guid%></td></tr>
<tr><td>ADSPath</td><td><%=IISObject.AdsPath%></td></tr>
</table><br>
<tableborder=1>
<tr><th>ClassProperty</th><th>ClassValue</th></tr>
<tr><td>Name</td><td><%=ClassDefinition.Name%></td></tr>
<tr><td>Parent</td><td><%=ClassDefinition.Parent%></td></tr>
<tr><td>SchemaLocation</td><td><%=ClassDefinition.Schema%></td></tr>
<tr><td>Class</td><td><%=ClassDefinition.Class%></td></tr>
<tr><td>Guid</td><td><%=ClassDefinition.Guid%></td></tr>
<tr><td>ADSPath</td><td><%=ClassDefinition.AdsPath%></td></tr>
</table><br>
<%
onerrorresumenext
asMustHaves=ClassDefinition.MandatoryProperties
asMayHaves=ClassDefinition.OptionalProperties
i=1
%>
<tableborder=1>
<tr><th>ClassMustHaveProperty</th>
<th>DefaultWebSiteCurrentValue</th></tr>
<%
ForEachThinginasMustHaves
Response.Write"<tr><td>("&Cstr(i)&")"&_
Thing&"</td><td>"&_
IISObject.Get(Thing)&"</td></tr>"
i=i+1
Next
%>
</table>
<br>
<tableborder=1>
<tr><th>ClassMayHaveProperty</th>
<th>DefaultWebSiteCurrentValue</th></tr>
<%
i=1
ForEachThinginasMayHaves
Response.Write"<tr><td>("&CStr(i)&")"&_
Thing&"</td><td>"&_
IISObject.Get(Thing)&"</td></tr>"
i=i+1
Next
%>
</table>
为了获得默许WEB站点的属性,你必要晓得属性的称号,大概isWebServer这一类的属性的列表.在例
4中,我们获得了一切的属性而且列出了他们的值.每一个工具都能够有强迫的和自已的属性.强迫的属
性在每一个工具创建时就发生了.
注重:假如IISWEBSERVER只列出了一些可选的属性,在参考IIS文档之前请不要创建一个新的WEB站
点的工具。ADSI对IIS的实行冲破了这个划定规矩。有一些必需的属性列在了可选的属性列表中。假如
你在创建一个WEB站点时没有对需要的属性举行设置,你的元数据库大概被损坏。
注重:ADSI不会在毛病时停下了,它会持续行进。
创建一个假造目次
在例五中我们将在默许的WEB站点下创建一个假造目次。我们将先列出一个假造目次的一切属性然
后再创建一个假造目次。为了列出一个目次的一切属性,我借用了例3的一些代码,只不外将站点
改成了假造目次,你必需晓得必需的属性:我们要创建如何的WEB服务器,它的名字,它的物理路
径,一旦你创建了一个假造目次后你再将它们的属性逐一设置。例五讲了如何使用这些。
Example5
<%
sComputer="localhost"
sPhyDir="c:adsi"
sVirDir="ADSITest"
GetDefaultWebSiteObject
setwebsvc=GetObject("IIS://"&sComputer&"/W3svc/1")
VerifybyprintingoutServerComment
Response.Write"Comment="&websvc.ServerComment&"<br>"
GetrootofDefaultWebSite
setvRoot=websvc.GetObject("IIsWebVirtualDir","Root")
GetClassDefinitionofvirtualdirectory
SetClassDefinition=GetObject(vRoot.Schema)
Getlistofmandatoryproperties
asMustHaves=ClassDefinition.MandatoryProperties
Getlistofoptionalproperties
asMayHaves=ClassDefinition.OptionalProperties
i=1
%>
<tableborder=1>
<tr><th>ClassMustHaveProperty</th>
<th>RootVirtualDirectoryCurrentValue</th></tr>
<%
onerrorresumenext
ForEachThinginasMustHaves
Response.Write"<tr><td>("&Cstr(i)&")"&_
Thing&"</td><td>"&vRoot.Get(Thing)&_
"</td></tr>"
i=i+1
Next
%>
</table>
<br>
<tableborder=1>
<tr><th>ClassMayHaveProperty</th>
<th>DefaultWebSiteCurrentValue</th></tr>
<%
i=1
ForEachThinginasMayHaves
Response.Write"<tr><td>("&CStr(i)&")"&_
Thing&"</td><td>"&vRoot.Get(Thing)&_
"</td></tr>"
i=i+1
Next
onerrorgoto0
CreateVirtualDirectory
Param1isclassname
Param2isthenewobjectname
SetvDir=vRoot.Create("IIsWebVirtualDir",sVirDir)
Onlysettingtwoproperties
vDir.AccessRead=true
vDir.Path=sPhyDir
WriteinformationbacktoMetabase
vDir.SetInfo
%>
在这个例子中,为了创建一个工具的实例,父工具被用到了。创建对像的实例用的是工具的class
称号。而这个工具没有强迫的属性,一些工具有强迫的属性。假如你没有设置这些需要的属性,当
你利用object.setinfo时就会堕落。
为了查验这个假造目次是不是已创建了,你能够翻开IIS看一下。另外一个办法是再运转一遍程序,
假如前次已创建了,你此次就会失掉毛病了局。(保举前一种,SUNWEN)
别一个ADSI的特性是在OBJECT。SETINFO被运转之前,一切的属性设置都不会失效。这使你的站点
不会受一些非正轨的影响(假如一团体正在哀求这个站点的话,就会呈现毛病)。这比一个干系型
的数据库加倍复杂。ADSI会主动完成一切相干的数据的设置,你就能够不必利用N次的INSERT语句
(嘻嘻,老外和SUNWEN一样滑稽!)。更新也一样。你只需一次则可。
到场一个默许的文档
在这个例子中,我们将把"index.htm"这个文件到场到默许文档的列表中。为了完成这一方针,我
们要从数据源中失掉这个假造目次,改动与默许文档相干的属性,然后把信息写归去。
Example6
<%
sComputer="localhost"
sPhyDir="c:dinaadsi"
sVirDir="ADSITest"
GetDefaultWebSiteObject
setwebsvc=GetObject("IIS://"&sComputer&"/W3svc/1")
VerifybyprintingoutServerComment
Response.Write"Comment="&websvc.ServerComment&"<br>"
GetrootofDefaultWebSite
setvRoot=websvc.GetObject("IIsWebVirtualDir","Root")
CreateVirtualDirectory
SetvDir=vRoot.Create("IIsWebVirtualDir",sVirDir)
Getlocalcopyofobject
vDir.GetInfo
Response.Write"OldDefaultDocs="&vDir.DefaultDoc&"<BR>"
Onlysettingtwoproperties
vDir.DefaultDoc=vDir.DefaultDoc&",index.htm"
WriteinformationbacktoMetabase
vDir.SetInfo
GetObjectAgain
vDir.GetInfo
Response.Write"NewDefaultDocs="&vDir.DefaultDoc
%>
在这个例子中,我们是用了objec.getinfo这个语句把信息取回的。它一次性把一切的信息都取回
了。然后我们用setinfo这个语句把信息从头设置了归去。
删除一个假造目次
在这个例子中,你将进修到怎样删除一个假造目次。当创建一个工具时,你必需有它的父工具。这
个真谛也一样合用于删除。例七标明了怎样做。
Example7
<%
onerrorresumenext
sComputer="localhost"
sPhyDir="c:dinaadsi"
sVirDir="ADSITest"
GetDefaultWebSiteObject
setwebsvc=GetObject("IIS://"&sComputer&"/W3svc/1")
VerifybyprintingoutServerComment
Response.Write"Comment="&websvc.ServerComment&"<br>"
GetrootofDefaultWebSite
setvRoot=websvc.GetObject("IIsWebVirtualDir","Root")
DeleteVirtualDirectory
SetvDir=vRoot.Delete("IIsWebVirtualDir",sVirDir)
%>
楼上说交互性不好,太牵强了吧。在微软提供的一套框架中,利用asp做网站,开发效率高,使用人数少,减少不必要的开销。交互性是互动方式,是有开发人员决定的。 它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。 多看多学多思。多看一些关于ASP的书籍,一方面可以扩展知识面一方面可以鉴借别人是如何掌握、运用ASP的;多学善于关注别人,向同学老师多多学习,不论知识的大小;多思则是要将学到的知识灵活运用。 作为IE上广为流传的动态网页开发技术,ASP以它简单易学博得了广大WEB程序爱好这的青睐,而且它对运行环境和开发品台的不挑剔,以及有大量有效的参考手册,极大的推广了它的发展。 ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp),它可以看作是VC和Java的混合体吧。 下面简单介绍一下我学习ASP的方法,希望对想学习ASP的朋友有所帮助... ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码,能产生和执行动态、交互式、高效率的站占服务器的应用程序。 Session:这个存储跟客户端会话过程的数据,默认20分钟失效 ASP主要是用好六个对象,其实最主要的是用好其中两个:response和request,就可以随心所欲地控制网页变换和响应用户动作了。 兴趣爱好,那么你无须学编程,申请一个域名和空间,在网上下载一些免费开源的CMS系统,你不用改代码,只须熟悉它们的后台操作,像office一样简单方便,很快就能建一个站点,很多站长都是这样做的 用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
页:
[1]