使用ADSI、ASP和一对魔术戏法自动地创立一个虚拟目录的方法

所属分类: 脚本专栏 / vbs 阅读数: 1657
收藏 0 赞 0 分享
使用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)

If Err.Number = 0 Then
Response.Write ("An application with this name already exists. Click ")
Response.Write ("<A HREF=http:// " & strServerName & " /servin/default.asp>")
Response.Write ("here</A> 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("<B>Web Application Created Sucessfully</B><BR>")
Response.Write("Path : "& strVirtualDirectoryPath & "<BR>")
Response.Write("Script Permissions : "& bolScriptPermissions & "<BR>")
Response.Write( strOwner & " has been granted change permissions<BR>")
%>
</BODY>
</HTML>

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

现在是新闻 由于我们在每一期ASP专栏中收到的热烈的反响,我们将把我们的栏目专门用于这种技术。可以预见的变化是,我们将介绍著名的Jeff Sandquist。那么有什么让人伤感的呢?Tom Moran将离开Servin' It Up--但是如果你将来在其他地方看到他时不要感到太惊奇。

Jeff Sandquist(微软最好的法裔加拿大人之一)是开发者支持的Active Server Pages扩大组成员之一,也是Visual InterDev MVP程序( http://support.microsoft.com/support/supportnet/supportpartners/mvps/brochuregeneral.asp)的主要负责人。 
更多精彩内容其他人还在看

vbscript Split函数用法详解(字符串转数组函数)

本文详细介绍了vbscript中split函数的用法,有关split函数的一些实例,vbscript中split函数的语法介绍,有需要的朋友参考下
收藏 0 赞 0 分享

VBS实现将Excel表格保存为txt文本

希望能够找到个能给excel表另存为TXT的VBS代码,虽然另存为可以选择,但还是需要直接VBS执行这一步另存为TXT格式的,应该如何写代码呢
收藏 0 赞 0 分享

vbs解决处理TXT文本数据相关问题实现代码

使用vbs处理txt数据时,会遇到一些问题,本文将提供详细的解决方法,希望可以帮助你们
收藏 0 赞 0 分享

关于vbs 生成静态页面过程中出现的问题

访问某个aspx页面,然后把服务器返回的页面以filestream 的形式保存为html格式,接下来将介绍实现代码
收藏 0 赞 0 分享

dim函数第三个参数设置截取字符的长度问题

dim函数的第三个参数,也就是截取字符的长度,我在设置这个的时候,出了些问题,提示无效的过程调用或参数,本文详细介绍如何解决
收藏 0 赞 0 分享

邪恶的eval和new Function使用介绍

这些代码可以干什么?可以肯定的是可以干很多猥琐的事
收藏 0 赞 0 分享

WScript.Shell对象SpecialFolders属性未公开文档分享

WshShell对象的SpecialFolders属性返WshSpecialFolders 对象,该对象是一个特殊文件夹集合,其中包含整套Windows特殊文件夹
收藏 0 赞 0 分享

用VBS修改(设置)系统时间和日期的代码

用 VBS 把系统的时间修改到2038年1月19日3时14分07秒之后,这样某些依赖于 Unix 时间戳的程序就会出问题。那么怎样用 VBS 修改系统的时间呢
收藏 0 赞 0 分享

VBS For Next循环的一些细节

For Next 语句是 VBS 中常用的循环语句,你可能已经用过无数次 For Next 循环,但是你是否注意过它的一些细节呢
收藏 0 赞 0 分享

VBS For Next循环的陷阱分享

在《VBS For Next循环的一些细节》中说到了 For Next 循环的控制变量仅仅在循环开始前求值一次,但是其中存在一处陷阱
收藏 0 赞 0 分享
查看更多