使用ADSI、ASP和一對魔術戲法自動地創立一個虛擬目錄的方法_vbs

來源:互聯網
上載者:User
使用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>帳號遷移到Administrator 群組。而更好的方法是,在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)的主要負責人。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.