利用ADSI对IIS进行编程

iis|编程

译者注:这是一篇有关ADSI的文章,由SUNWEN翻译。在阅读它之前,请您确保您至少已经知道了什么是AD和ADSI。笔者不再敷述。如果您对IIS和EXCHANGE SERVER和其它M$产品的编程感兴趣的话,(ADSI可以说是它们的接口),请务必读完它,因为这篇文章是很精彩的!后面翻译的更流利些,E文不是太好,嘻嘻!
理解ADSI
你曾经相通过VBS添加一个虚拟目录吗?(我想过~)自动建立ISAPI服务器扩展?或者建立一整个站点,包括权限?你可以用ADSI做这些和更多的事情.
ADSI (Active Directory Services Interface)是一种应用程序数据接口.微软的操作系统支持ADSI的有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方法和一个指定服务器和联接位置的参数.例子一有两个ETOBJECT的例子.在第一种情况下,代码建立了一个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 %>"<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站点的这
些属性的值.
Example 4

<%
strMachineName = "localhost"
strObjectPath = "W3SVC/1" 'find first web server listed in w3svc
strPath = "IIS://" & strMachineName & "/" & strObjectPath
Set IISObject = GetObject (strPath)

'find location of web server's definition
Set ClassDefinition = GetObject(IISObject.Schema)
%>
<table border=1>
<tr><th>Default Web Server Property</th><th>Default Web Server Value</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>
<table border=1>
<tr><th>Class Property</th><th>Class Value</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>
<%
on error resume next

asMustHaves = ClassDefinition.MandatoryProperties
asMayHaves = ClassDefinition.OptionalProperties

i=1
%>
<table border=1>
<tr><th>Class Must Have Property</th>
<th>Default Web Site Current Value</th></tr>
<%
For Each Thing in asMustHaves
Response.Write "<tr><td>("& Cstr(i) & ") " &_
Thing & "</td><td>" &_
IISObject.Get(Thing) & "</td></tr>"
i = i + 1
Next
%>
</table>
<br>
<table border=1>
<tr><th>Class May Have Property</th>
<th>Default Web Site Current Value</th></tr>
<%
i=1
For Each Thing in asMayHaves
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服务器,它的名字,它的物理路
径,一旦你建立了一个虚拟目录后你再将它们的属性一一设置。例五讲了怎样利用这些。
Example 5

<%
sComputer ="localhost"
sPhyDir = "c:\adsi"
sVirDir = "ADSITest"

'Get Default Web Site Object
set websvc = GetObject("IIS://" & sComputer & "/W3svc/1")

'Verify by printing out ServerComment
Response.Write "Comment = " & websvc.ServerComment & "<br>"

'Get root of Default Web Site
set vRoot = websvc.GetObject("IIsWebVirtualDir", "Root")

'Get Class Definition of virtual directory
Set ClassDefinition = GetObject(vRoot.Schema)

'Get list of mandatory properties
asMustHaves = ClassDefinition.MandatoryProperties

'Get list of optional properties
asMayHaves = ClassDefinition.OptionalProperties

i=1
%>
<table border=1>
<tr><th>Class Must Have Property</th>
<th>Root Virtual Directory Current Value</th></tr>
<%
on error resume next

For Each Thing in asMustHaves
Response.Write "<tr><td>("& Cstr(i) & ") " &_
Thing & "</td><td>" & vRoot.Get(Thing) &_
"</td></tr>"
i = i + 1
Next
%>
</table>
<br>
<table border=1>
<tr><th>Class May Have Property</th>
<th>Default Web Site Current Value</th></tr>
<%
i=1
For Each Thing in asMayHaves
Response.Write "<tr><td>("& CStr(i) & ") " &_
Thing & "</td><td>" & vRoot.Get(Thing) &_
"</td></tr>"
i = i + 1
Next
on error goto 0

'Create Virtual Directory
'Param 1 is class name
'Param 2 is the new object name
Set vDir = vRoot.Create("IIsWebVirtualDir",sVirDir)

'Only setting two properties
vDir.AccessRead = true
vDir.Path = sPhyDir

'Write information back to Metabase
vDir.SetInfo
%>

在这个例子中,为了建立一个对象的实例,父对象被用到了。建立对像的实例用的是对象的class
名称。而这个对象没有强制的属性,一些对象有强制的属性。如果你没有设置这些必要的属性,当
你使用object.setinfo时就会出错。
为了检验这个虚拟目录是否已经建立了,你可以打开IIS看一下。另一个方法是再运行一遍程序,
如果上次已经建立了,你这次就会得到错误结果。(推荐前一种,SUNWEN)

别一个ADSI的特征是在OBJECT。SETINFO被运行之前,所有的属性设置都不会生效。这使你的站点
不会受一些非正规的影响(如果一个人正在请求这个站点的话,就会出现错误)。这比一个关系型
的数据库更加简单。ADSI会自动完成所有相关的数据的设置,你就可以不用使用N次的INSERT语句
(嘻嘻,老外和SUNWEN一样幽默!)。更新也一样。你只需一次则可。

加入一个默认的文档

在这个例子中,我们将把"index.htm"这个文件加入到默认文档的列表中。为了实现这一目标,我
们要从数据源中得到这个虚拟目录,改变与默认文档相关的属性,然后把信息写回去。
Example 6

<%
sComputer ="localhost"
sPhyDir = "c:\dina\adsi"
sVirDir = "ADSITest"

'Get Default Web Site Object
set websvc = GetObject("IIS://" & sComputer & "/W3svc/1")

'Verify by printing out ServerComment
Response.Write "Comment = " & websvc.ServerComment & "<br>"

'Get root of Default Web Site
set vRoot = websvc.GetObject("IIsWebVirtualDir", "Root")

'Create Virtual Directory
Set vDir = vRoot.Create("IIsWebVirtualDir",sVirDir)

'Get local copy of object
vDir.GetInfo

Response.Write "Old Default Docs = " & vDir.DefaultDoc & "<BR>"

'Only setting two properties
vDir.DefaultDoc = vDir.DefaultDoc & ",index.htm"

'Write information back to Metabase
vDir.SetInfo

'Get Object Again
vDir.GetInfo

Response.Write "New Default Docs = " & vDir.DefaultDoc
%>

在这个例子中,我们是用了objec.getinfo这个语句把信息取回的。它一次性把所有的信息都取回
了。然后我们用setinfo这个语句把信息重新设置了回去。

删除一个虚拟目录

在这个例子中,你将学习到如何删除一个虚拟目录。当建立一个对象时,你必须有它的父对象。这
个真理也同样适用于删除。例七表明了如何做。
Example 7

<%
on error resume next

sComputer ="localhost"
sPhyDir = "c:\dina\adsi"
sVirDir = "ADSITest"

'Get Default Web Site Object
set websvc = GetObject("IIS://" & sComputer & "/W3svc/1")

'Verify by printing out ServerComment
Response.Write "Comment = " & websvc.ServerComment & "<br>"

'Get root of Default Web Site
set vRoot = websvc.GetObject("IIsWebVirtualDir", "Root")

'Delete Virtual Directory
Set vDir = vRoot.Delete("IIsWebVirtualDir",sVirDir)
%>

时间: 2024-11-01 20:12:33

利用ADSI对IIS进行编程的相关文章

Python中利用生成器实现的并发编程

  这篇文章主要介绍了简单介绍Python中利用生成器实现的并发编程,使用yield生成器函数进行多进程编程是Python学习进阶当中的重要知识,需要的朋友可以参考下 我们都知道并发(不是并行)编程目前有四种方式,多进程,多线程,异步,和协程. 多进程编程在python中有类似C的os.fork,当然还有更高层封装的multiprocessing标准库,在之前写过的python高可用程序设计方法中提供了类似nginx中master process和worker process间信号处理的方式,保

VBScript使用ADSI为IIS批量添加屏蔽或允许访问的IP_vbs

复制代码 代码如下: '/*========================================================================= ' * Intro VBScript使用ADSI为IIS批量添加屏蔽或允许访问的IP ' * FileName VBScript-ADSI-IIS-Add-Deny-Grant-IP-Change-MetaBase.xml.vbs ' *===========================================

利用Spring框架改进J2EE编程

j2ee|编程 摘要 J2EE编程正在变得越来越复杂.J2EE已经发展为一个API.复杂化的编程和配置的复杂网络.为了应对这种复杂性,新的框架和方法不断涌现.这些框架高度依赖于一个称为IoC(Inversion of Control,反向控制)的概念.本文将探讨这种方法的一些特性和优点,因为这种方法与J2EE编程相关,而且可以使J2EE编程变得更轻松. 简介 马克·吐温的一句话常被引用:"--关于我死亡的报道是一种夸张."现在已经出现了很多关于.Net的流言,以及认为J2EE API的

用ADSI控制IIS创建网站, 虚拟目录…… (C#)

iis|创建|控制|虚拟目录  这是当年赶工的网站用到的东东, 结果快做完了警察叔叔来个网站要备案,朋友不干了,我也停工了, 翻出来共享了~ 据说,控制IIS和别的MS的垃圾(MS的FTP, 用户管理.....)可以用ADSI和WMI(WIN2k3的才好), 参考了网友们的资料,有版权问题麻烦EMAIL一下 原来是按三层写的代码没有整理, 权当笔记,省点稿纸, 大家看个大概, 详细的MSDN都有! 三个文件: ////////FileName: hostservice.cs //////////

利用Socket进行Java网络编程

Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递.在Java中,有专门的Socket类来处理用户的请求和响应.利用Socket类的方法,就可以实现两台计算机之间的通讯.这里就介绍一下在Java中如何利用Socket进行网络编程. 在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法.getInp

利用C#创建IIS站点并设置.NET Framework版本为ASP.NET 2.0的方法(一)

IIS 6.0以后使用MetaBase.xml存储IIS信息,因此,可以直接修改这个文件即可. 代码如下:很显然,这种方法比较复杂,不直观,而且需要停止IIS,影响现有网站. /// <summary> /// 本方法创建一个站点(当然,创建虚拟目录也完全没有任何问题,做法类似),并设置IIS中ASP.NET版本为2.0 /// </summary> /// <param name="sender"></param> /// <pa

利用JAVA技术进行XML编程(第一部分)

xml|编程 在过去几年中,XML 已经成为一种通用的数据格式.这篇经过修订的教程将向您介绍 Java 语言中处理 XML 文档最常用的编程接口. 最普通的 XML 处理工作是 解析 XML 文档.解析包括读取 XML 文档并确定其结构和内容.XML 编程的一个好处是可以使用开放源代码的.免费的 XML 解析器读取 XML 文档.本教程主要讨论创建解析器对象.要求解析器处理 XML 文件.处理解析结果.如您所料,可以使用不同的方式完成这类常见的任务:我将分析所涉及到的标准以及什么时候应该使用这种

一个利用adsi得到局域网信息的asp文件

<%@ Language=VBScript %><HTML><HEAD><META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"><title>ADSI Domain browser</title></HEAD><BODY><!-- Author: Adrian Forbes --> <%s

使用ADSI实现IIS管理,WEB站点管理系统核心代码

代码 using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Collections; using System.DirectoryServices; using IISMModel; using System.Configuration; using System.Web;  namespace IISMBLL {     /// <summary>