線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2061
推到 Plurk!
推到 Facebook!

IIS中如何利用ADSI編程實現添加虛擬目錄 2

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-28 05:33:20 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 整理:IIS中如何利用ADSI編程實現添加虛擬目錄 作者: 千中元 評價: 上站日期: 2001-07-11 內容說明: 來源: http://www.baidao.net -------------------------------------------------------------------------------- IIS中如何編程實現添加虛擬目錄 大富翁上aiminggo總結的.我實在沒法添加什?東東(因?太完美了), 最後我找了asp的實現,來了個狗尾續貂.哈 ADSI 即 active directory service interface , 微軟的東東, 用來控制NT, IIS, EXCHANGER SERVER. 首先確認,API是絕對解決不了這些問題的,必須使用COM,使用ADSI介面。 在WinNT\System32下的adsiis.tlb是MS封裝的ADSI公開介面,非常的全,也非常之龐大。你可 以使用它,也可以去這兒下載一個公開源碼的ADSI COM控制項。但是,它是C寫的。 ftp://ftp.15seconds.com/990107.zip 打開990107.zip,用regsvr32.exe myadsi.dll註冊這個控制項。然後,你就可以開始用Delphi 幹活兒了。 一、生成介面文件 ------------------------------------------------------------------------ 由於myADSI.dll不是OCX/EXE方式的ActiveX服務,所以,必須手工生成TLB介面文件。 運行\Delphi\BIN目錄的TLIBImp.exe文件。如下: tlibimp -L MyADSI.dll // L 參數是生成能夠在Delphi的IDE環境中使用的可視元件。可選。 // 如果你使用adsiis.tlb,也需要用tlibimp來生成介面文件。 這個控制項的編寫者有病,會將COM控制項命名?Contorl,生成的Delphi類名叫TControl,與 Delphi自己的一個控制項會衝突,所以你需要打開生成的myADSILib_TLB.pas文件,將所有的 TControl替換成TIISControl。就成了。——你也可以不替換,但出了問題可被怪我。 二、安裝元件 ------------------------------------------------------------------------ 安裝myADSILib_TLB.pas到元件板,與普通操作無二。不講了。 三、編程 ------------------------------------------------------------------------ 太簡單了。 ^-^。下面假設控制項名:IISConfig var selectDir : integer; //示例中用來控制創建的虛擬目錄類型。 procedure TMainForm.Button1Click(Sender: TObject); const //Permissions Const, From MSDN. IISReadAccess = 1; IISWriteAccess = 2; IISExecuteAccess = 4; //(including ScriptAccess) IISScriptAccess = 512; var VDirName : string; begin VDirName := Edit1.Text; if (VDirName='') or (VDirName[1]='/') then begin showMessage('虛擬目錄不能?空, 且第一個字元不能?''/''.'#$0D'請重新填寫.'); exit; end; IISConfig.Site := 1; //如果IIS中有多個Web Site,這裏可選。 IISConfig.Connect; try if BOOL(IISConfig.ExistsVDir(VDirName)) then showMessage('對不起, 該虛擬目錄已經存在.'#$0D'不能創建虛擬目錄.') else case selectDir of 1 : //普通目錄 begin IISConfig.Permissions := IISReadAccess; if not BOOL(IISConfig.CreateVDir(WideString(PBF.Folder), WideString(VDirName))) then showMessage('對不起, 未知情況導致虛擬目錄不能成功創建.'); end; 2 : //腳本目錄 begin IISConfig.Permissions := IISExecuteAccess; if not BOOL(IISConfig.CreateVDir(WideString(PBF.Folder), WideString(VDirName))) then showMessage('對不起, 未知情況導致虛擬目錄不能成功創建.'); end; end; finally IISConfig.Disconnect; end; end; 就這樣啦。不難的。 TIISControl主要有三個功能:CreateVDir(), ExistsVDir(), DeleteVDir()。 OnStartPage()和OnEndPage()兩個功能我也沒有太搞明白,好象是設置ASP的起始和結束頁的。 Permissions設置的全部定義是: { //Define In MSDN MD_ACCESS_READ 0x00000001 Allow read access. MD_ACCESS_WRITE 0x00000002 Allow write access. MD_ACCESS_EXECUTE 0x00000004 Allow file execution (includes script permission). MD_ACCESS_SOURCE 0x00000010 Allow source access. MD_ACCESS_SCRIPT 0x00000200 Allowscript execution. MD_ACCESS_NO_REMOTE_WRITE 0x00000400 Local write access only. MD_ACCESS_NO_REMOTE_READ 0x00001000 Local read access only. MD_ACCESS_NO_REMOTE_EXECUTE 0x00002000 Local execution only. MD_ACCESS_NO_REMOTE_SCRIPT 0x00004000 Local host access only. } 但注意MyASDI中的Permissions是smallInt類型的。小有區別啦。 ^-^ 四、其他 ------------------------------------------------------------------------ 如果你要發佈軟體的話,當然不能要用戶自已去運行regsvr32.exe來註冊MyADSI.dll了。 如果你不是使用專門的安裝工具來做這件事的話,你可以用一段小程式來完成這件事。 type TRegisterMode = (regRegister, regUnregister); function OLERegisterDLLFile (strFileName : STRING; mode : TRegisterMode) : BOOLEAN; type TOleRegister = function : HResult; var hLib : THandle; fnAdr: TFarProc; begin Result := FALSE; hLib := LoadLibrary(PCHAR(strFileName)); if (hLib > 0) then begin try if (mode = regRegister) then fnAdr := GetProcAddress(hLib, pchar('DllRegisterServer')) else fnAdr := GetProcAddress(hLib, pchar('DllUnregisterServer')); if (fnAdr < > nil) then Result := (TOleRegister(fnAdr) > = 0); finally FreeLibrary(hLib); end; end; end; { RegisterDLLFile } OLERegisterDLLFile()函數可以加到TForm.onCreate和TForm.onClose事件中。即可以完成 自動註冊和卸載。 好了。用Delphi簡單吧?^-^ 五、關於ASP ------------------------------------------------------------------------ 需要的話,去查MSDN,關鍵字:“Virtual directories, creating”。也可以去MS的MSDN網 站,查“Create a Virtual Directory Automatically with ADSI”,就成了。 不過只使用於NT4.0(安裝ADSI)和Win2k的機器:(以下是續的狗尾...) < % '創建物理目錄 Set FS = Server.CreateObject( "Scripting.FileSystemObject" ) FS.CreateFolder "c:\testdir" '創建虛擬目錄 myServer = Request.ServerVariables( "SERVER_NAME" ) ADSIPath = "IIS://" & myServer & "/W3SVC/1/ROOT" Response.Write "ADSIPath = " & ADSIPath Set defaultSite = getObject( ADSIPath ) Set vDir = defaultSite.Create( "IISWebVirtualDir", "StellcomScripts" ) vDir.Path = "c:\testdir" '設置虛擬目錄屬性 vDir.AccessRead = TRUE vDir.AccessScript = TRUE vDir.DefaultDoc = "index.asp" vDir.SetInfo Response.Write "Virtual Directory Created!" %> 保留版權. 你可以在程式中任意使用上面代碼, 可以以不盈利的目的任意傳播上文,但請注明作者和出處
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
Alcohol
一般會員


發表:7
回覆:10
積分:8
註冊:2002-10-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-10-28 08:49:13 IP:203.93.xxx.xxx 未訂閱
{ *********************************************** } { } { } { Copyright zhao zhenhua } { email:zhao-zhenhua@163.net } { *********************************************** } unit MainUnt; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, FileCtrl, Buttons,Activeds_TLB; type TIISConfigFrm = class(TForm) edtAlias: TEdit; Label1: TLabel; dlbIIS: TDirectoryListBox; dcbIIS: TDriveComboBox; Label2: TLabel; edtPath: TEdit; GroupBox1: TGroupBox; cbRead: TCheckBox; cbScript: TCheckBox; cbExecute: TCheckBox; cbWrite: TCheckBox; cbBrowse: TCheckBox; bbtOK: TBitBtn; lblPath: TLabel; procedure dlbIISChange(Sender: TObject); procedure bbtOKClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; function ADsGetObject(const PathName: WideString; const GUID:TGUID; out I: IUnknown): HRESULT; stdcall; var IISConfigFrm: TIISConfigFrm; implementation {$R *.dfm} function ADsGetObject;external 'ActiveDS.dll' name 'ADsGetObject'; procedure TIISConfigFrm.dlbIISChange(Sender: TObject); begin edtPath.Text:=dlbIIS.Directory; end; procedure TIISConfigFrm.bbtOKClick(Sender: TObject); var I: IADsContainer; ADs: IADs; begin if Length(Trim(edtAlias.Text))=0 then begin Application.MessageBox('別名不可以為空!','警告'); Exit; end; if Length(Trim(edtPath.Text))=0 then begin Application.MessageBox('請選定虛擬目錄位置!','警告'); Exit; end; if ADsGetObject('IIS://localhost', IID_IADsContainer, IUnknown(I)) = S_Ok then begin //IIS已經安裝 if ADsGetObject('IIS://localhost/w3svc', IID_IADsContainer, IUnknown(I)) = S_Ok then begin //Web伺服器存在 ADs := IADs(I.GetObject('IIsWebServer', '1')); //取得服務 if ADs.QueryInterface(IID_IADsContainer, I) = S_OK then begin //服務支持 ADs := IADs(I.GetObject('IIsWebVirtualDir', 'Root')); //在Web伺服器的Root下建立虛擬目錄 if ADs.QueryInterface(IID_IADsContainer, I) = S_OK then begin //服務支持 try ADs := IADs(I.Create('IIsWebVirtualDir', edtAlias.Text)); //建立虛擬目錄,別名為edtAlias.Text except Application.MessageBox('這個別名已經存在,請選擇另外的別名!','警告'); Exit; end; //try except ADs.Put('AccessRead', cbRead.Checked); //設定各參數 ADs.Put('AccessWrite', cbWrite.Checked); ADs.put('AccessScript',cbScript.Checked); ADs.Put('AccessExecute',cbExecute.Checked); ADs.put('EnableDirBrowsing',cbBrowse.Checked); ADs.Put('Path', edtPath.text); ADs.Put('DefaultDoc','Default.asp, Default.html, Default.htm, ndex.asp, Index.html, Index.htm, Home.asp, Home.Html, Home.htm'); ADs.Put('EnableDefaultDoc',True);//允許打開默認文件 ADs.SetInfo; //保存參數 Application.MessageBox('您的設定已經保存。','恭喜'); end; end; end; end else Application.MessageBox('您的電腦上沒有安裝IIS或者您無權訪問IIS。','警告'); end;
Natida
一般會員


發表:7
回覆:9
積分:3
註冊:2004-02-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-08 23:33:53 IP:61.62.xxx.xxx 未訂閱
小弟用上述方法成功的建立虛擬目錄,可是實際執行時會出現錯誤訊息: Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately. Parser Error Message: It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS. 但是若用手動的方式建立虛擬目錄則可正確執行, 請問這個問題要如何解決?
OsX
版主


發表:6
回覆:151
積分:111
註冊:2003-05-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-28 23:54:39 IP:219.84.xxx.xxx 未訂閱
引言: 小弟用上述方法成功的建立虛擬目錄,可是實際執行時會出現錯誤訊息: Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately. Parser Error Message: It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS. 但是若用手動的方式建立虛擬目錄則可正確執行, 請問這個問題要如何解決?
沒有建立應用程式集區, 在該虛擬目錄上點滑鼠右鍵的內容, 第一頁靠下方設定, 上面提的方法應該有設好虛擬目錄後, 再設定應用程式集區的function可呼叫吧? 我沒用過, 但我想應該有, 因為我用 InstallShield Build, 可以做的到.
系統時間:2024-07-08 7:07:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!