日期:2013-03-26  浏览次数:20927 次


使用ADSI、ASP和一对魔术戏法自动地创立一个虚拟目录,第二部分
Tom Moran 和 Jeff Sandquist
1999年2月22日

我们回来了。大家翘首以盼的这篇文章的第二部分现在在这儿。并且我想你将花费整个晚上看你的猫清洗自己。

这个月,Jeff Sandquist和我完成了我们的动态目录服务接口(Active Directory Services Interfaces ,ADSI)应用程序。如果你来晚了一点,没有问题;只要见这个系列的Part 1 http://www.microsoft.com/workshop/server/asp/server012599.asp 。上个月,我们确认一个用户作为特权组的成员。接着我们显示了一个表单,表单上包括一个带有该特殊用户组中每个人用户名的列表框。这个表单允许我们选取一个用户,并且为这个用户的新的虚拟目录选择权限。现在我们将由这个表单获取数据并在网络服务器上创立一个新的虚拟目录,把它定义为一个应用,给出开启脚本权限的选项,并在文件夹上指定适当的权限。Jeff Sandquist将在这个过程中指导我们。

在这篇文章的结尾,我们有一个重要的、使人伤感的、足以使地球粉碎的公告。Clinton, O.J., Clemens与之相比一切都显得苍白无力。我确信AP会注意到它,但是你将首先看到它。请继续阅读。

展览之中

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

我们实现这个目的的一种方法是把IUSR_<Machine Name>账号迁移到管理员组。而更好的方法是,在Web服务器上创建一个新的虚拟目录(我们将调用ServinSecure),并且把它设置成在管理员环境中操作,而不是在IUSR_<Machine Name>环境中。我们的表单将保存在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 %>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>

<%
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)