第二部分 技术难点及解决方案
一、技术难点
分析完整个系统的功能以后,我们来看一下关键的技术难点:
(1)在线实时开通ftp帐号;
(2)在线实时开通虚拟站点;
(3)在线实时开通email帐号;
(4)操作iis/mssql/ftp/mail系统的启动、停止;
除以上难点以外,其他的功能无非就是简单的数据库录入、查询、修改、删除操作,所以,只要解决以上难点,系统即实现基本功能。
二、解决方案
(1)在线实时开通ftp帐号:
在这里,我们使用的ftp服务器端系统为serv-u 6.0版,通过改写servudaemon.ini文件来增加、删除、修改用户。以下是增加ftp用户的原代码:
<%
'**************************************************
'* 原作者:awaysrain(绝对零度) *
'* 完成时间:2003-10-10 *
'* 修改时间:2005-01-11 *
'* 测试环境:win2000server,serv-u 6.0beta版 *
'**************************************************
dim inipath,inifilename,inistr,tmpstr,n
dim username,password,tmp
username = "myfso222" '用户名
password = "awaysrain" '密码
'tmp = "ai" '随机生成两个小写字母,(应该是随机生成的,但是我这里省略了)
'password = tmp & ucase(md5(password)) '密码,是md5加密过的,用动网的md5加密程序,具体算法是随机生成两位小写字母,然后和你的密码连接后进行md5加密,把随机生成的密码和md5加密后的结果作为密码存放,举个例子来说比如下面的awaysrain用户,我的密码为awaysrain先随机生成两位小写字母ai,和我的密码awaysrain连接得到aiawaysrain把aiawaysrain进行md5加密得到9118bfd94a9ce9cf37ae5baa947ed596把随机生成两位小写字母ai和md5加密后的结果9118bfd94a9ce9cf37ae5baa947ed596连接得到密码ai9118bfd94a9ce9cf37ae5baa947ed596
inipath="d:\program files\serv-u" 'ini文件的路径
inifilename = "servudaemon.ini" 'ini的文件名
set fso=server.createobject("scripting.filesystemobject")
set servuini = fso.opentextfile(inipath & "\" & inifilename,1,false)
inistr = ""
n = 0
addeduserlist = false
set tf = fso.createtextfile(inipath & "\" & inifilename & "._awaysrain.tmp", true)
'生成新的临时ini文件
do while not servuini.atendofstream
tmpstr = servuini.readline
if instr("awaysrain||" & tmpstr,"awaysrain||user")>0 then
'记录用户原来的数量
n = n+1
end if
if instr("awaysrain||" & tmpstr,"awaysrain||[user=")>0 and not addeduserlist then
'往用户列表的部分添加现在的用户
n = n +1
tf.writeline("user" & n & "=" & username & "|1|0")
addeduserlist = true
end if
tf.writeline(tmpstr)
loop
servuini.close
'添加新用户的信息,具体内容可以在serv-u中新建用户并对照ini文件
tf.writeline("[user=" & username & "|1]") '用户名
tf.writeline("password=" & password) '密码
tf.writeline("homedir=d:\temp") '主目录
tf.writeline("relpaths=1") '是否锁定用户于主目录
tf.writeline("maxusersloginperip=1") '相同ip同时登录数
tf.writeline("speedlimitdown=102400") '最大下载速度
tf.writeline("timeout=600") '空闲超时时间(秒)
tf.writeline("access1=d:\temp|rlp") '可访问目录,可以不是一个,比如 'access2=e:\temp1|rlp'
tf.close
'--------------------备份原来的ini文件--------------------------
set f1 = fso.getfile(inipath & "\" & inifilename)
f1.copy (inipath & "\" & inifilename & "._awaysrain.bak")
f1.delete
'--------------------把生成的临时ini文件改为正式的ini--------------------------
set f1 = fso.getfile(inipath & "\" & inifilename & "._awaysrain.tmp")
f1.copy (inipath & "\" & inifilename)
f1.delete
set fso = nothing
%>
这里我对原作者的程序进行了一点修改,把原有的对密码的加密去了,这样,存在ini文件中的密码是直接看见的,为什么要这样呢……因为6.0和4.2的加密算法好象不大一样(如果有知道加密算法的朋友请告诉我),而且,我们现在做虚拟主机管理系统的重点也不在这里,所以把这一部分舍去了。此处的serv-u的设置有以下几点需要注意的:
1 必须已经有一个域,且有至少一个用户存在的情况下,才能成功。
2 因为去除了对密码的加密算法,所以在域的设置里的高级选项中的“将密码存储于加密的窗体中”选项去除。
(2)在线实时开通虚拟站点:
为了将来能满足域名转向功能,所以,我们这里要求在线实时开通“虚拟站点”,而不是开通“虚拟目录”,目录是不能控制转向的。
网上找了一些资料可以建立虚拟站点的,可是都失败了……不知道为什么,比如通过“adsi修改iis信息”,不行,提示“权限不够”。后来查了些资料,发现基本上都是通过c:\inetpub\adminscript下的vbs脚本来实现对iis的管理的,我通过asp来调用时,出现了权限不够的问题,所有就换个思路,通过组件来调用这些脚本来控制iis。
首先先些了个vb的组件:
一、建立一个activex dll工程
二、更改工程名servershell
三、更改类名:cmd
四、修改类代码:
public function servercmd(strcmd)
shell strcmd, vbhide
'就这么简单就行了!