menu

hjk41的日志

Avatar

在Serv-U中使用ODBC存储管理信息的方法

初衷:
在做一个网站,要求给每个注册过的特权用户分配一个ftp账号,及相应的ftp目录。就像一些提供网站空间的网站一样,每个用户注册以后都会有自己的ftp账号及上传目录。

解决方案:
1.使用IIS中的ftp,这样就不用再装serv-U。问题在于IIS中的ftp账号必需是windows登录账号,也就是说得先给这些用户每人一个windows账号,显然不行嘛。还有一种方案是用active directory,问题是它只在server系统中才有,而server系统一般都要1w RMB以上,增加系统成本,而且现在用于开发的机子是xp,所以也放弃。
2.那就是使用serv-U的ODBC功能,serv-U能将管理信息放到odbc数据源中,这样可以通过修改数据库来添加,删除账号信息,所以就决定使用serv-U。

系统要求:
要使用ODBC,就必需使用企业版的serv-U,学校有5.0,里面有个破解补丁,破解后就是企业版。我是从外面下的6.0企业版。要看自己装的是不是企业版,只要看看license就行,是企业版显示的就应该是corporate edition,而且使用期是无限的。
当然,还得有个ODBC数据源,windows支持将foxpro数据库,access,SQL Server等做为odbc数据源。我用的是SQL Server。

动手:
第一步,新建数据库。在SQL Server中建一个数据库,我这里是APTS(这是我做的项目名)。在查询分析器中执行以下命令:


IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('dbo.ftp_groupAccess') AND OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE dbo.ftp_groupAccess
GO

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('dbo.ftp_groupIPs') AND OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE dbo.ftp_groupIPs
GO

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('dbo.ftp_groups') AND OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE dbo.ftp_groups
GO

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('dbo.ftp_userAccess') AND OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE dbo.ftp_userAccess
GO

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('dbo.ftp_userIPs') AND OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE dbo.ftp_userIPs
GO

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id('dbo.ftp_users') AND OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE dbo.ftp_users
GO

CREATE TABLE dbo.ftp_groupAccess (
	indexNo smallint NOT NULL,
	ftpUserName varchar (50) NOT NULL,
	accessRule varchar (200) NOT NULL 
)
GO

CREATE TABLE dbo.ftp_groupIPs (
	indexNo smallint NOT NULL,
	ftpUserName varchar (50) NOT NULL,
	accessRule varchar (80) NOT NULL 
)
GO

CREATE TABLE dbo.ftp_groups (
	id int IDENTITY (1, 1) NOT NULL,
	ftpUserName varchar (50) NOT NULL,
	accessRule varchar (200) NULL,
	notes varchar (255) NULL 
)
GO

CREATE TABLE dbo.ftp_userAccess (
	indexNo smallint NOT NULL,
	ftpUserName varchar (50) NOT NULL,
	accessRule varchar (200) NOT NULL 
)
GO

CREATE TABLE dbo.ftp_userIPs (
	indexNo smallint NOT NULL,
	ftpUserName varchar (50) NOT NULL,
	accessRule varchar (80) NOT NULL 
)
GO

CREATE TABLE dbo.ftp_users (
	id int IDENTITY (1, 1) NOT NULL,
	ftpUserName varchar (50) NOT NULL,
	ftpPassword varchar (50) NOT NULL,
	ftpPasswordType tinyint NULL,
	changePassword bit NOT NULL,
	sKey varchar (50) ,
	accessRule varchar (200) NULL,
	dirHome varchar (200) NOT NULL,
	privilege tinyint NULL,
	loginMsgFile varchar (80) NULL,
	disabled bit NOT NULL,
	sessionEncryption bit NOT NULL,
	dirHomeLock bit NOT NULL,
	hideHidden bit NOT NULL,
	alwaysAllowLogin bit NOT NULL,
	maxUsersConcurrent smallint NOT NULL,
	speedLimitUp int NULL,
	speedLimitDown int NULL,
	maxUsersLoginPerIP smallint NOT NULL,
	timeOutIdle int NULL,
	timeOutSession int NULL,
	quotaEnable bit NOT NULL,
	quotaCurrent bigint NULL,
	quotaMax bigint NULL,
	ratioType tinyint NULL,
	ratioUp smallint NULL,
	ratioDown smallint NULL,
	ratioCredit float NULL,
	expiration smalldatetime NULL,
	groups varchar (80) NULL,
	notes varchar (255) 
)
GO

ALTER TABLE dbo.ftp_groups WITH NOCHECK ADD CONSTRAINT pk_ftp_groups PRIMARY KEY CLUSTERED (id)
GO

ALTER TABLE dbo.ftp_users WITH NOCHECK ADD CONSTRAINT pk_ftp_users PRIMARY KEY CLUSTERED (id)
GO

ALTER TABLE dbo.ftp_groupAccess ADD CONSTRAINT df_ftp_groupAccess_indexNo DEFAULT (2) FOR indexNo
GO

CREATE INDEX ix_ftp_groupAccess__ftpUserName ON dbo.ftp_groupAccess(ftpUserName, indexNo)
GO

ALTER TABLE dbo.ftp_groupIPs ADD CONSTRAINT df_ftp_groupIPs_indexNo DEFAULT (2) FOR indexNo
GO

CREATE INDEX ix_ftp_groupIPs__ftpUserName ON dbo.ftp_groupIPs(ftpUserName, indexNo)
GO

CREATE UNIQUE INDEX ix_ftp_groups__ftpUserName ON dbo.ftp_groups(ftpUserName)
GO

ALTER TABLE dbo.ftp_userAccess ADD CONSTRAINT df_ftp_userAccess_indexNo DEFAULT (2) FOR indexNo
GO

CREATE INDEX ix_ftp_userAccess__ftpUserName ON dbo.ftp_userAccess(ftpUserName, indexNo)
GO

ALTER TABLE dbo.ftp_userIPs ADD CONSTRAINT df_ftp_userIPs_indexNo DEFAULT (2) FOR indexNo
GO

CREATE INDEX ix_ftp_userIPs__ftpUserName ON dbo.ftp_userIPs(ftpUserName, indexNo)
GO

ALTER TABLE dbo.ftp_users ADD
	CONSTRAINT df_ftp_users_changePassword DEFAULT (1) FOR changePassword,
	CONSTRAINT df_ftp_users_sKey DEFAULT ('') FOR sKey,
	CONSTRAINT df_ftp_users_disabled DEFAULT (0) FOR disabled,
	CONSTRAINT df_ftp_users_sessionEncryption DEFAULT (0) FOR sessionEncryption,
	CONSTRAINT df_ftp_users_dirHome DEFAULT ('') FOR dirHome,
	CONSTRAINT df_ftp_users_dirHomeLock DEFAULT (1) FOR dirHomeLock,
	CONSTRAINT df_ftp_users_hideHidden DEFAULT (1) FOR hideHidden,
	CONSTRAINT df_ftp_users_alwaysAllowLogin DEFAULT (0) FOR alwaysAllowLogin,
	CONSTRAINT df_ftp_users_maxUsersConcurrent DEFAULT (10) FOR maxUsersConcurrent,
	CONSTRAINT df_ftp_users_speedLimitUp DEFAULT ((-1)) FOR speedLimitUp,
	CONSTRAINT df_ftp_users_speedLimitDown DEFAULT ((-1)) FOR speedLimitDown,
	CONSTRAINT df_ftp_users_maxUsersLoginPerIP DEFAULT (5) FOR maxUsersLoginPerIP,
	CONSTRAINT df_ftp_users_timeOutSession DEFAULT ((-1)) FOR timeOutSession,
	CONSTRAINT df_ftp_users_quotaEnable DEFAULT (1) FOR quotaEnable,
	CONSTRAINT df_ftp_users_quotaCurrent DEFAULT (0) FOR quotaCurrent,
	CONSTRAINT df_ftp_users_quotaMax DEFAULT (52428800) FOR quotaMax,
	CONSTRAINT df_ftp_users_notes DEFAULT ('') FOR notes
GO

CREATE UNIQUE INDEX ix_ftp_users__ftpUserName ON dbo.ftp_users(ftpUserName)
GO

这样会创建几张表,都是ftp_***形式的表,但是我们只需要修改ftp_users就行。这是serv-U网站上给出的,但是里面有一些项似乎跟我用的6.0版本不一样,主要是在ftp_users表中有几项是不允许空的,但是6.0自动生成的表中却显示为空,我很奇怪它怎么把这些信息插进去的。这些项主要是ftp_user中的SKEY跟NOTES列,在上面我已经把它们改成可以空了。

第二,新建ODBC数据源。选管理工具->ODBC数据源,新建一个SQL Server数据源。注意这里设置的默认数据库应该是ftp_users表所在的数据库,在我这里就是apts。

第三,配置Serv-U。首先得新建一个domain,domain的信息自己填,但是要注意在store infortion in ...的时候要选store infomation in ODBC,因为如果使用其它类型,以后是没办法改到odbc的。建完这个domain以后,它应该是offline状态的,因为你的数据源没设。这时关掉Serv-U,到Serv-U安装目录下找一个ServUDeamon.INI的文件,找到你刚才新建的domain,如果不确定是哪个domain,看看有哪个domain下面有ODBCSource=|||,那就是一个新建的ODBC类型的Domain。把这两行加到那个domain下面,替换原来的ODBCTables和ODBCColumns。


ODBCTables=ftp_users|ftp_groups|ftp_userAccess|ftp_groupAccess|ftp_userIPs|ftp_groupIPs
ODBCColumns=ftpUserName|ftpPassword|sKey|dirHome|loginMsgFile|accessRule|disabled|sessionEncryption|dirHomeLock|hideHidden|alwaysAllowLogin|changePassword|quotaEnable|maxUsersLoginPerIP|speedLimitUp|speedLimitDown|maxUsersConcurrent|timeOutIdle|timeOutSession|ratioUp|ratioDown|ratioCredit|quotaCurrent|quotaMax|expiration|privilege|ftpPasswordType|ratioType|groups|notes|indexNo

这是用来配置serv-U,告诉它到哪里去找信息的。添加完,保存文件。
这里你再打开Serv-U,然后看那个domain的odbc选项卡,就能看到里面多了很多配置信息。但是还有三项没填,那就是DataSource跟username,password。这是数据源的信息。在datasource中填你刚才新建的数据源的名字,username跟password就不用我说了。这时如果上面的步骤都做完了,那就应该完成配置了,这里按下面那个Reload information按钮就能看到这个domain已经是online状态了,这时它的信息已经跟数据库同步了。
这里还有两个设置要设。点新建的domain->settings->advanced,有一个refresh time,默认是60秒,也就是说你把信息填到数据库后,有可能serv-U要在60秒后才知道,可以把它改小一点,比如10秒。另一个设置是密码的加密,即store password in encrypted mode,6.0默认是加密保存密码的,采用的加密技术我没去查,但应该是md5,如果网站使用明文密码,就得把这个选项去掉。

第四,插入信息。
现在设置完成,剩下的就是插入数据了。在ftp_users中各列的意思都比较清楚,可以自己插入数据,如果不太肯定,可以先在serv-U中插入一个用户,这时ftp_users中就会有相应的一行数据,就可以根据这一行来插入自己的数据了。

ok, enjoy

好久没打这么多中文字了,手都累了,休息去了
当然,这里介绍的只是最简单的使用,还可以通过数据库来更改很多信息,比如可以建立组,然后把用户加到组里等等。总之,除了跟数据库相关的那些设置之外,其它的基本上都可以通过数据库来设置。有感兴趣的可以大家一起讨论
over
[/more]

1) 现在比较新的版本是 6.0.0.2,转载文章偏老

2) 6.0.0.2企业版支持直接使用NT用户验证了。

3) 这个功能bug好多,注意溢出。。。

4) blog发大段代码最好使用UBB代码code

5) 楼主能不能留个msn?

汗。。。
自己写的说。。。
不知道网上有
msn: hctiaa@21cn.com

特来向楼主道谢的说

汗。。。
自己写的说。。。
不知道网上有
msn: hctiaa@21cn.com
hjk41 @ 2005-5-7 15:37:47

自己写的话强!Up一个!

ServU plus听说过没有。。

默听说过。。
干什么用的

评论已关闭