发信人: qcrsoft(网痞)
整理人: qcrsoft(2002-05-13 17:18:28), 站内信件
|
前言
在一个大型网络中,如何标识和定位网络资源,一直是一个很重要的研究课题。目前人们对这一问题的解决方法,就是使用目录服务来解决。网络中的目录,其功能就相当于我们日常生活中的电话号码簿。通过电话号码簿,我们可以通过一个人的名字,找到对应的电话号码和家庭住址等信息,同样的道理,给出网络资源的标识信息,就可以通过目录服务来找出与该资源相关的其他信息。
目录服务能够解决网络资源的标识和定位问题,各公司都在这一领域投入大量的人员、资金进行研究,并且都推出了各自的目录服务产品。在一个企业的网络环境中,可能存在着多种目录服务,如NDS,Active Directory,如何能够将这些目录服务集成在一起,使应用程序能够使用这些目录服务,是目前所要解决的问题。
ADSI(Active Directory Service Interfaces,活动目录访问接口)是微软推出的一套目录服务的访问接口,其目标是提供一套简单、统一、开放的接口,通过该接口,应用程序可以管理、使用各种目录服务。
本文简要介绍ADSI的基本情况,并且假定读者已经了解COM、OLE和目录服务的概念。
目录服务的现状
从其作用上看,目录可以分为两大类:网络目录和特定应用程序中所包含的目录。
前者的目的是标识与定位网络上的共享资源,如共享打印机,这种目录是与具体的应用无关的,就是说,网络目录服务提供了一种定位、使用共享资源的手段,任何的网络用户,任何应用程序都可以通过这一目录去使用共享的网络资源。目前人们所指的目录就是指这种类型的目录,产品有微软的Active Directory, Banyan的StreetTalk,和Novell的NDS。
第二种目录是与特定应用程序有关的,许多大的应用程序中,如Lotus Notes, cc:Mail, 和Microsoft Mail,都包含了他们自己的目录,这些目录只供这些程序自己使用,相互之间没有共享。应该说随着目录技术的成熟和目录访问协议的统一,这种类型的目录要逐渐消亡。
在目前的企业网络上,可能部署着多个目录服务,如NDS,Active Directory,Lotus Notes,如图1所示。
图1 可能存在的目录
在同一个网络环境中存在着多个目录,带来很多问题,包括使用、管理,目录部署等方面,最明显的一点是,当我们在编写一个应用软件时,如果该软件要用到目录,那么我们面临着选择,使用哪种目录?因为存在着多种目录,而各自的访问方式又各不相同,所以对开发者来说,如果要使用目录服务的话,不得不对每一种目录服务编写相关的代码,带来的程序维护上的困难。
实际上对于目录访问目前所存在的困境,在软件业中以前也出现过。回想一下,在数据库发展的初期,许多厂家都推出了自己的DBMS产品,并且每个厂家都提供了自己的数据库访问API接口,这样数据库开发人员在开发自己的系统时,不得不针对每一种DBMS来编写特定的代码。直到ODBC的出现,才彻底解决了这一问题。
为了解决这一问题,微软推出了ADSI接口。ADSI实际上是一套COM组件,提供了一套访问目录的接口。ADSI之于目录,其作用就相当于ODBC之于DBMS:通过该接口,开发人员可以使用同一的方法去访问各种目录。
ADSI的结构可以用图2来表示。熟悉ODBC的一眼就可以看出,其结构与ODBC非常相似:SP(Service Provider)相当于ODBC中的Driver,而ADSI层则相当于ODBC中的Driver Manger。
图2 ADSI的结构
ADSI接口
优点:
开放 每一个目录开发商都可以按照ADSI规范来实现自己的Service Provider。
应用程序开发简单 使用ADSI后,应用程序与具体的目录无关,无论是Active Directory还是NDS,只要他们提供了自己的Provier,应用程序都可以访问,并且在目录之间的迁移不需要改动代码。
支持Java 通过Java COM技术,Java程序可以使用ADSI接口。
安全 ADSI 通过用户的认证和授权机制来保证安全性。
灵活、可扩展 ADSI是可以通过扩展来支持新的特性,满足特定的需要。
ADSI对象
前面我们已经提过,ADSI是一套COM组件,在其中封装了很多目录对象,微软称之为ADSI对象。ADSI对象又分为两大类:容器对象(Container Objects)和叶子对象(Leaf Objects),这两类对象其作用分别相当于文件系统的目录和文件。
ADSI规范中定义了一些标准的容器对象和叶子对象,如果需要的话,还可以再扩展。
资源遍历
ADSI提供了IADsContainer 接口。通过该接口可以遍历对象:
Set ou = GetObject(“LDAP://host1/OU=Sales, DC=ArcadiayBay,DC=COM”)
For each obj in ou
Debug.Print obj.Name
Next
资源查找
ADSI是一个OLE DB provider,因此可以使用ADO来查询目录中的数据:
Dim con As New Connection, rs As New Recordset
Dim Com As New Command
'Open a Connection object
con.Provider = "ADsDSOObject"
con.Open "Active Directory Provider"
‘Create a command object on this connection
Set Com.ActiveConnection = con
Com.CommandText = "select name from 'LDAP://DC=ArcadiayBay,DC=COM' where objectClass='*' ORDER BY NAME"
'-----------------------------------------
'Set the preferences for Search
'--------------------------------------
Com.Properties("Page Size") = 1000
Com.Properties("Timeout") = 30 'seconds
Com.Properties("searchscope") = ADS_SCOPE_SUBTREE
'--------------------------------------------
'Execute the query
'--------------------------------------------
Set rs = Com.Execute
'--------------------------------------
' Navigate the record set
'----------------------------------------
While Not rs.EOF
Debug.Print rs.Fields( Name ).Value
rs.MoveNext
Wend
使用ADSI的几个例子
1.遍历用户
在实际的应用中,经常需要遍历某单位的用户,找到这些用户的信息以供进一步处理。下面的例子就给出了这方面的例子:找到每个用户,然后打印该用户的信息。
dim MyUserContainer as IADsContainer
dim MyUser as IADsUser
set MyUserContainer as GetObject( WinNT://ABX )
for each MyUser in MyUserContainer
PrintUser MyUser.Name, MyUser.TelephoneNumber
next MyUser
2.填加用户到用户组
在日常的网络管理中,出于安全的考虑,经常需要将用户加入或移出用户组。下面的例子给出了这种应用:首先判断用户是否属于Manufacturing组,如果不是,则加入。
dim MyUserContainer as IADsContainer
dim MyUser as IADsUser
dim MyGroup as IADsGroup
dim Filter as Variant
Filter = Array( user );
set MyUserContainer = GetOBject( WinNT://ABX )
MyContainer.Filter = Filter filter out all objects except users
set MyGroup = GetObject( WinNT://ABX/Manufacturing_Users )
for each MyUser in MyUserContainer
if not MyGroup.IsMember(MyUser) then
MyGroup.Add(MyUser)
end if
next MyUser
3.启动和停止网络服务
下面的例子给出如何通过ADSI接口来控制NT服务。
Set dom = GetObject(“WinNT://ABX”)
Dom.Filter = Array(Computer)
For each comp in dom
comp.Filter = Array(“Service”)
For each svc in comp
If ( svc.Name = Browser ) then
svc.Stop
End if
Next
Next
结束语
企业的网络环境中可能存在多种网络目录,ADSI提供了一套统一、开放的接口,通过这些接口,我们可以管理、访问这些不同的目录,减轻了管理、开发方面的负担。
创建用户、目录和站点
关键词:ASP, WSH, NT 作者: white
本讲将使用到ADSI,即活动目录服务接口.可以到15Seconds.com找到一些相关的资料.
1.创建用户
下面这段代码在独立服务器white上创建用户user1,初始口令user1,用到了ADSI.
Dim Username,UserPass
Dim oDomain,oUser
Username = "user1"
UserPass = "user1"
Set oDomain = GetObject("WinNT://white")
Set oUser = oDomain.Create ("user", UserName)
If (err.number = 0) Then
oUser.SetInfo
oUser.SetPassword UserPass
oUser.SetInfo
Else
WScript.Echo "创建用户" & UserName & "出错!"
End If
Set oUser = Nothing
Set oDomain = Nothing
2.创建目录
使用FileSystemObject创建目录:
Dim FsObject
Dim tmpFolder
Set FsObject = WScript.CreateObject("Scripting.FileSystemObject")
tmpFolder = "D:\userdate\user1"
If Not FsObject.FolderExists(tmpFolder) Then
FsObject.CreateFolder(tmpFolder)
If Err.Number<>0 Then
WScript.Echo "创建目录" & tmpFolder & "失败!"
End If
End If
注意在创建目录前,先检查了目录是否存在,如果存在,则不用创建了.
3.创建站点
下面这个子程序负责创建一个WWW站点,各个参数的意义为:站点IP地址,站点根目录,站点说明,主机名,端口号,计算机名(一搬为LOCALHOST),是否立即启动,匿名访问时所使用的帐号,匿名访问时所用帐号的口令,LOG文件的目录.
函数返回所建站点在IIS中的序号(在IIS中,所有站点依次编号,第一个为1).
一个调用示例:siteid = ASTCreateWebSite("10.1.3.122","d:\userdata\user1","www_user1","","80","LocalHost",True,"IUSR_user1","8iui%#","D:\Logfiles")
Function ASTCreateWebSite(IPAddress, RootDirectory, ServerComment, HostName, PortNum, Computer, Start,AnonymousUserName,AnonymousUserPass,LogFileDirectory)
Dim w3svc, WebServer, NewWebServer, NewDir
Dim Bindings, BindingString, NewBindings, Index, SiteObj, bDone
On Error Resume Next
Err.Clear
Set w3svc = GetObject("IIS://" & Computer & "/w3svc")
If Err.Number <> 0 Then
WScript.Echo "无法打开: "&"IIS://" & Computer & "/w3svc" & VbCrlf & "程序将退出."
WScript.Quit (1)
End If
BindingString = IpAddress & ":" & PortNum & ":" & HostName
For Each WebServer in w3svc
If WebServer.Class = "IIsWebServer" Then
Bindings = WebServer.ServerBindings
If BindingString = Bindings(0) Then
WScript.Echo "IP地址冲突:" & IpAddress & ",请检测IP地址!." & VbCrlf & "取消创建本站点。"
Exit Function
End If
End If
Next
Index = 1
bDone = False
While (Not bDone)
Err.Clear
Set SiteObj = GetObject("IIS://"&Computer&"/w3svc/" & Index)
If (Err.Number = 0) Then
Index = Index + 1
Else
Err.Clear
Set NewWebServer = w3svc.Create("IIsWebServer", Index)
If (Err.Number <> 0) Then
Index = Index + 1
Else
Err.Clear
Set SiteObj = GetObject("IIS://"&Computer&"/w3svc/" & Index)
If (Err.Number = 0) Then
bDone = True
Else
Index = Index + 1
End If
End If
End If
If (Index > 10000) Then
WScript.Echo "看起来不能创建站点,正在创建的站点的序号为: "&Index&"." & VbCrlf & "取消创建本站点。"
Exit Function
End If
Wend
NewBindings = Array(0)
NewBindings(0) = BindingString
NewWebServer.ServerBindings = NewBindings
NewWebServer.ServerComment = ServerComment
NewWebServer.AnonymousUserName = AnonymousUserName
NewWebServer.AnonymousUserPass = AnonymousUserPass
NewWebServer.KeyType = "IIsWebServer"
NewWebServer.FrontPageWeb = True
NewWebServer.EnableDefaultDoc = True
NewWebServer.DefaultDoc = "Default.htm, Default.asp, Index.htm, Index.asp"
NewWebServer.LogFileDirectory = LogFileDirectory
NewWebServer.SetInfo
Set NewDir = NewWebServer.Create("IIsWebVirtualDir", "ROOT")
NewDir.Path = RootDirectory
NewDir.AccessRead = true
NewDir.AppFriendlyName = "应用程序" & ServerComment
NewDir.AppCreate True
NewDir.AccessScript = True
Err.Clear
NewDir.SetInfo
If (Err.Number = 0) Then
Else
WScript.Echo "主目录创建时出错."
End If
If Start = True Then
Err.Clear
Set NewWebServer = GetObject("IIS://" & Computer & "/w3svc/" & Index)
NewWebServer.Start
If Err.Number <> 0 Then
WScript.Echo "启动站点时出错!"
Err.Clear
Else
End If
End If
ASTCreateWebSite = Index
End Function
下面函数创建FTP站点:
Function ASTCreateFtpSite(IPAddress, RootDirectory, ServerComment, HostName, PortNum, Computer, Start,LogFileDirectory)
Dim MSFTPSVC, FtpServer, NewFtpServer, NewDir
Dim Bindings, BindingString, NewBindings, Index, SiteObj, bDone
On Error Resume Next
Err.Clear
Set MSFTPSVC = GetObject("IIS://" & Computer & "/MSFTPSVC")
If Err.Number <> 0 Then
WScript.Echo "无法打开: "&"IIS://" & Computer & "/MSFTPSVC" & VbCrlf & "程序将退出."
WScript.Quit (1)
End If
BindingString = IpAddress & ":" & PortNum & ":" & HostName
For Each FtpServer in MSFTPSVC
If FtpServer.Class="IIsFtpServer" Then
Bindings = FtpServer.ServerBindings
If BindingString = Bindings(0) Then
WScript.Echo "IP地址冲突:" & IpAddress & ",请检测IP地址!." & VbCrlf & "取消创建本站点。"
Exit Function
End If
End If
Next
Index = 1
bDone = False
While (Not bDone)
Err.Clear
Set SiteObj = GetObject("IIS://"&Computer&"/MSFTPSVC/" & Index)
If (Err.Number = 0) Then
Index = Index + 1
Else
Err.Clear
Set NewFtpServer = MSFTPSVC.Create("IIsFtpServer", Index)
If (Err.Number <> 0) Then
Index = Index + 1
Else
Err.Clear
Set SiteObj = GetObject("IIS://"&Computer&"/MSFTPSVC/" & Index)
If (Err.Number = 0) Then
bDone = True
Else
Index = Index + 1
End If
End If
End If
If (Index > 10000) Then
WScript.Echo "看起来不能创建站点,正在创建的站点的序号为: "&Index&"." & VbCrlf & "取消创建本站点。"
Exit Function
End If
Wend
NewBindings = Array(0)
NewBindings(0) = BindingString
NewFtpServer.ServerBindings = NewBindings
NewFtpServer.ServerComment = ServerComment
NewFtpServer.AllowAnonymous = False
NewFtpServer.AccessWrite = True
NewFtpServer.AccessRead = True
NewFtpServer.DontLog = False
NewFtpServer.LogFileDirectory = LogFileDirectory
NewFtpServer.SetInfo
Set NewDir = NewFtpServer.Create("IIsFtpVirtualDir", "ROOT")
NewDir.Path = RootDirectory
NewDir.AccessRead = true
Err.Clear
NewDir.SetInfo
If (Err.Number = 0) Then
Else
WScript.Echo "主目录创建时出错."
End If
If Start = True Then
Err.Clear
Set NewFtpServer = GetObject("IIS://" & Computer & "/MSFTPSVC/" & Index)
NewFtpServer.Start
If Err.Number <> 0 Then
WScript.Echo "启动站点时出错!"
Err.Clear
Else
End If
End If
ASTCreateFtpSite = Index
End Function
注:如果您想引用上面的代码,请与white联系以取得技术支持.
原作者:张为党
来 源:www.mesky.net
|
|