我正在调查一个project:把一个ASP程序从Winnt Server 4.0+IIS 4.0迁移到Win2000 Server+IIS5。第一次使用ASP,所以愿意把这个过程中遇到的一些问题和解决方法整理出来留在这里。“发表是最好的回忆。”
下面是第一部分,和FileCopy相关的一点讨论。
一、问题本身
ASP程序在部署在Interpub目录下,目录结构大概如下——
############################################
Interpub
---------ABC(我们的ASP目录)
----------*.ASP/*.htm/*.asa
----------doc
----------docbase
----------(其它子目录)
#############################################
ASP程序调用一个叫ABC.dll的动态链接库,执行一组操作。其中一个动作是使用FileCopy函数把一个word文件从docbase目录复制到doc目录。
FileCopy strSrc, strrDis
每次执行到这个语句的时候都出现错误号为75的VB运行时错误(“路径无效”)。其实,docbase里的word文件路径和doc目录都是存在且正确的,但不知道为什么这一步却执行不过去。
我修改ABC.dll代码,做了两个实验——
(1)我把FileCopy的第二个参数改为InterPub目录外的一个位置C:\temp
FileCopy strSrc,"C:\temp\filename.doc"
运行结果:正确。可以把文件复制到"C:\temp"。
(2)我在ABC目录新建一个子目录test,执行下列动作
FileCopy strSrc,"C:\test\filename.doc"
运行结果:不正确。错误号仍然是75(“路径无效”)。
此外,还有其他几点值得注意——
(1)在ASP文件里直接使用VBScript脚本执行FileCopy动作是可以的;
(2)我们的服务器是IIS 5.0。若把程序放在IIS 4.0下却可以顺利执行。
(3)同事们说若是授权方面存在问题,可以考虑使用dcomcnfg命令进行配置。
二、解决方法
修改doc子目录的访问权限即可解决这个问题。
第一个办法:在doc目录的属性页里找到“security” page,向“everyone”用户授予“change/write”权限;
第二个办法:在doc目录的属性页里找到“security” page,添加一个“IUSER”用户,并向其授予“change/write”权限。
第三个办法:把doc目录迁移到Interpub目录外边去。这样,“everyone”用户默认拥有“change/write”权限。
三、原因
在NT下,即使在wwwroot下,everyone用户仍然有“full control”权限;
在2000下,一旦将目录复制到wwwroot下,everyone用户的权限立刻变为“read/run”。
这就是导致FileCopy问题的根源吧。
我这个时候才发觉,在我们这个小小的升级项目调查过程中必须把“操作系统差异”作为重要任务。