PC6下载站

分类分类

用ADSI、ASP自动地创立一个虚拟目录

关注+2004-10-07作者:蓝点


上个月,我们的表格存在于一个叫Servin的虚拟目录。我们可以使用IUSR_中的Internet Information Server(IIS)安全环境执行所请求的操作。我们需要一个管理员身份来创建目录和指定权限。 

我们实现这个目的的一种方法是把IUSR_账号迁移到管理员组。而更好的方法是,在Web服务器上创建一个新的虚拟目录(我们将调用ServinSecure),并且把它设置成在管理员环境中操作,而不是在IUSR_环境中。我们的表单将保存在Servin目录中 

而表单的处理器将保存在一个叫ServinSecure的目录中启动微软管理控制台(Microsoft Management Console,MMC)然后用右键击Default Web Site创建一个新的虚拟目录。选择New/Virtual Directory。创建一个叫"ServinSecure"(没有引号)的虚拟目录。你还需要提供一个以前在你的网络服务器文件系统中创建的文件夹的物理路径。一旦你创建了这个虚拟目录,用右键击中在MMC上新创建的虚拟目录,选择Properties显示虚拟目录的属性。 

选择Directory Security标签,选择Edit按钮,接着选择Enable anonymous…,编辑这个资源的身份确认方法。这时候会出现一个标题为Authentication Methods的对话框。选择Edit按钮,接着选择Account used for Anonymous Access。出现一个题为Anonymous User Account的最终对话框。把用户名的缺省值从IUSR_<机器名>改成管理员,取消选定密码同步,并为管理员帐户提供密码。在剩余的每个对话框上选择OK使改变生效。 

下面是对话框的图形: 

ASP代码 

让我们一起看一下代码。我们将为我们的应用程序定义一些变量。创立一个叫CreateDirectory.asp的动态服务器页(Active Server Pages ,ASP)文件,在其中插入以下代码: 
<%@ Language=VBScript %> 
<% Option Explicit %> 
 
 
 
 
 

<% 
Dim strVirtualDirectoryName 'IIS虚拟目录名 
Dim bolInProcessApplication '处理应用标记中的IIS 
Dim objIIS 'ADSI IIS对象 
Dim strVirtualDirectoryPath 'IIS虚拟目录路径 
Dim objFileSystem 'VBScript文件系统对象 
Dim strOwner 'NT文件夹所有者 
Dim objVirtualDirectory 'ADSI IIS虚拟目录对象 
Dim bolScriptPermissions 'IIS脚本权限标记 
Dim strHTTPReferer 'IIS参考页 
Dim strServerName 'NT本地机器名 
Dim objWSH 'Windows脚本主机对象 
Dim objRTC '返回 
Dim strACLCommand '设置ACLs的命令行串 

我们想确保用户是从我们的表单来的,并且没有欺骗我们的服务器。我们将检索HTTPReferer服务器变量和服务器名来测试它。这儿你可以做许多检查;在我们的测试中不必十分坚固。关于安全站点的优秀文章,请查看由Dmitry Khanine整理的Easy Application State Securely ( http://www.15seconds.com/Issue/990114.htm)。在代码的结尾插入以下代码: 
strHTTPReferer = Request.ServerVariables("HTTP_REFERER") 
strServerName = Request.ServerVariables("SERVER_NAME") 

' 我们是从我们的表格来的吗?如果不是,则拒绝存取 

If strHTTPReferer <> "http://" & strServerName & "/Servin/Default.asp" then 
Response.Write("Access Denied") 
Response.End 
End If 

现在我们的网页已证实我们的用户是从我们的表单传递结果的,我们可以获取虚拟目录(Virtual Directory)、所有者(Owner)和脚本权限(Script Permissions)标记的值。请注意我们是怎样根据从checkboxScript获取的值来改变的,如果它被选定,就设为True,如果没有被选定就设为False。在你的最后一位代码后插入以下代码: 
strVirtualDirectoryName = Request.Form("textVirtualDirectory") 
strOwner = Request.Form("selectOwner") 

If Request.Form("checkboxScript") = "on" Then 
bolScriptPermissions = "True" 
Else 
bolScriptPermissions = "False" 
End If 

我们需要确认IIS应用程序是否存在。使用IIS Admin对象,我们检查是否应用程序早已存在并且把相应的警告传递给用户。 

' Does this IIS application already exist in the metabase? 

On Error Resume Next 
Set objIIS = GetObject("IIS://localhost/W3SVC/1/Root/" & strVirtualDirectoryName) 

If Err.Number = 0 Then 
Response.Write ("An application with this name already exists. Click ") 
Response.Write ("") 
Response.Write ("here
 to choose a different name.") 
Response.End 
End If 

Set objIIS = Nothing 
现在我们将使用IIS管理对象在meta数据库中创建IIS应用程序。 

'创建IIS应用程序 
Set objIIS = GetObject("IIS://localhost/W3SVC/1/Root") 
strVirtualDirectoryPath = objIIS.Path & "\" & strVirtualDirectoryName 
使用VBScript的FileSystemObject对象,我们将测试文件夹是否存在于这个文件系统;如果不存在,我们将使用CreateFolder命令创建它。 
Set objFileSystem = Server.CreateObject("Scripting.FileSystemObject") 

'Test to see if the folder exists in the filesystem. If not, create it 

On Error Resume Next 
Set Folder = objFileSystem.GetFolder(strVirtualDirectoryPath) 
If Hex(Err.number) = "4C" Then 
objFileSystem.CreateFolder strVirtualDirectoryPath 
End If 

Set objFileSystem = Nothing 

使用Administration对象(在这篇文章中我们多次使用),我们开启脚本权限(加入用户选择了这这选项)并定义虚拟目录作为一个进程中的应用。 
'在文件系统上创建文件夹 

Set objVirtualDirectory = objIIS.Create("IISWebVirtualDir",strVirtualDirectoryName) 
objVirtualDirectory.AccessScript = bolScriptPermissions 
objVirtualDirectory.Path = strVirtualDirectoryPath 
objVirtualDirectory.SetInfo 
objVirtualDirectory.AppCreate bolInProcessApplication 

现在看一下这个魔术:设置权限。我们确实认为这是很简单的部分。不幸地是,在ADSI中不存在能为虚拟目录设置权限的对象。惊慌失措,并且还有一点不舒服的感觉。(或者是由于昨天晚上大吃泰国饭菜引起的?) 

搜索15seconds.com的ADSI列表服务器,发现一篇引用DOS CACLS.exe文件的通讯( http://listserv.15seconds.com/scripts/wa15seconds.exe?A2=ind9806C&L=ADSI&P=R1861 )并且通过DOS CMD文件使用它。我们认为我们可以为这个功能写一个Visual Basic封装并把它卷入一个定制组件(下个月的文章主题),但是一定有一个更快的方法。 

我们在Ian Morris整理的Windows Scripting Host FAQ ( http://wsh.glazier.co.nz/frame.htm )继续我们的搜索,发现了从Windows Scripting Host?调用DOS命令的几行代码。 

我们试图使用Windows Scripting host从asp文件调用CACLS.exe,我们的网页不能执行。应用失败了。为什么会这样?我们从DOS命令提示单步调试这个命令发现CACLS.EXE命令在等待我们使用Y作为Yes来确认操作。一定有一种方法使Yes作为缺省值。 

检查命令行选项没有发现任何隐藏开关。就这一点,打开浏览器,访问在线支持发现CACLS.EXE好象应该小心应用。 

我们兴奋的发抖,发现了文章Q135268:How to Use CACLS.EXE in a Batch File ( http://support.microsoft.com/support/kb/articles/q135/2/68.asp )。啊哈,好的老DOS重定向。使用通道传输一个Y给CACLS.exe代表Yes。 

下面是我们用来建立命令串和从ASP文件调用Windows Scripting Host shell的代码。 

'Set Change Permissions for the developer using CACLS.exe 
strACLCommand = "cmd /c echo y| CACLS " 
strACLCommand = strACLCommand & strVirtualDirectoryPath 
strACLCommand = strACLCommand & " /g " & strOwner & ":C" 

Set objWSH = Server.CreateObject("WScript.Shell") 
objRTC = objWSH.Run (strACLCommand , 0, True) 

Set objWSH = Nothing 

这可能不是可伸缩性最好的解决方案。一个定制组件可以在大型的应用程序上更好的帮助你。如果你需要一个,Artisans软件有一个免费组件( http://www.softartisans.com/softartisans/safilemanager.html )允许你通过他的对象模型改变文件夹上的权限。(它也有一些其他很酷的特性,例如以点式输入/输出图像,操作.ini文件和更多。) 

我们最终的代码证实我们所做的一切是值得的。 

Response.Write("Web Application Created Sucessfully
") 
Response.Write("Path : "& strVirtualDirectoryPath & "
") 
Response.Write("Script Permissions : "& bolScriptPermissions & "
") 
Response.Write( strOwner & " has been granted change permissions
") 
%> 
 
 

那就是它。当寻找问题的解答时最重要的使记住使用多种资源。列表服务器,FAQs和微软知识库就包含了这一类的文章。
展开全部

相关文章

更多+相同厂商

热门推荐

  • 最新排行
  • 最热排行
  • 评分最高
排行榜

    点击查看更多

      点击查看更多

        点击查看更多

        说两句网友评论

          我要评论...
          取消