IIS中如何利用ADSI編程實現添加虛擬目錄 2 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 整理: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 發送簡訊給我 |
{ *********************************************** }
{ }
{ }
{ 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 發送簡訊給我 |
小弟用上述方法成功的建立虛擬目錄,可是實際執行時會出現錯誤訊息: 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 發送簡訊給我 |
引言: 小弟用上述方法成功的建立虛擬目錄,可是實際執行時會出現錯誤訊息: 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, 可以做的到. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |