最新貢獻:使用ADSI、ASP和一對魔術戲法自動地創立一個虛擬目錄(舊帖整理)
發表于:2007-06-30來源:作者:點擊數:
標簽:
Oscar 于 99-6-15 上午 09:44:00 加貼在 Joy ASP: 使用ADSI、ASP和一對魔術戲法自動地創立一個虛擬目錄,第二部分 Tom Moran 和 Jeff Sandquist 1999年2月22日 我們回來了。大家翹首以盼的這篇文章的第二部分現在在這兒。并且我想你將花費整個晚上看你的貓清
Oscar 于 99-6-15 上午 09:44:00 加貼在 Joy ASP:
使用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 。上個月,我們確認一個用戶作為特權組的成員。接著我們顯示了一個表單,表單上包括一個帶有該特殊用戶組中每個人用戶名的列表框。這個表單允許我們選取一個用戶,并且為這個用戶的新的虛擬目錄選擇權限?,F在我們將由這個表單獲取數據并在
網絡服務器上創立一個新的虛擬目錄,把它定義為一個應用,給出開啟腳本權限的選項,并在文件夾上指定適當的權限。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按鈕,接著選擇A
clearcase/" target="_blank" >ccount 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 a
lready 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 gr
anted change permissions<BR>")
%>
</BODY>
</HTML>
那就是它。當尋找問題的解答時最重要的使記住使用多種資源。列表服務器,FAQs和微軟
知識庫就包含了這一類的文章。
現在是
新聞 由于我們在每一期ASP專欄中收到的熱烈的反響,我們將把我們的欄目專門用于這種技術??梢灶A見的變化是,我們將介紹著名的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)的主要負責人。
原文轉自:http://www.kjueaiud.com