发新话题
打印

[转载]命令行下建立一个虚拟目录

[转载]命令行下建立一个虚拟目录

文章作者:臭要饭的!

很久,很久没有和大家聊天了,很想大家的。见面先就给大家送个小礼吧。其实也不是什么好东西。

在研究和学习中进步,没有研究,没有深入的去了解,就没有进步。认真的学习态度+穷追不舍+十万个为什么。

得到的结果就是成就!

好了,屁话放了太多了。明白的人,不看上面的话都明白。不明白的人,看了也许永远也不会明白。


系统中有个VBS也可以实现这样的功能的。不过我认为,如果在台虚拟主机中,存在多个网站的情况下。

建立虚拟目录,也只能在第一个默认的站点中。一般情况下虚拟主机默认是关掉的。也就是你建好了,通过HTTP也不能访问。

从MSDN中,我找到了一些相关的技术资料,写了个小工具。可以建立在其它站点中。这里看来说起来有点混乱。

我举例给大家说说吧。

拿个虚拟主机的 Internet 信息服务中的列表给大家看看就明白了

+默认 web 站点(已停止)
+管理 web 站点(已停止)
+163.com
+263.com
+363.com

好,上面大家看到了,有三个站点是开放的。而前面那个默认的已经被关闭了。

这时,我们用VBS建立虚拟目录,是建立在默认的站点中,而站点被停止了,所以建立成功后,也不能访问。

比如:我们怎么能在263.com这个站中,建立一个目录,比如:VDIR,通过http://www.163.com/VDIR就可以访问了呢?

通过查找资料,我得到了,在建立的时候,允许指定一个序号,比如:1..N

1 : 表示,在默认的站点中,然后按着这个顺序来,而363.com对应的序号就是5.

明白了这个道理后,用程序来实现这个功能就比较简单了。当然,你会说,那么我想在263.com这个站中,建立。

但是我不知道,这个站对应的序号是多少,对于这个问题,我们只能从序号3开始一直往下建立,(1,2对应的是前面默认的)

当建立一个后,可以读出他的配置信息,返回给大家。建一个后,你就明白是不是建立在你想要建的那个站中,如果不是。

也可以把他删掉。再增加序号。:)(有没有一个工具,可以在命令行下,实现把所有的主机站点信息,比如:名称,对应目录之类的列出来?原理差不多,你看完代码应该会写了)

以下是代码:

program VDir;

{$APPTYPE CONSOLE}

uses
ActiveX,SysUtils,ComObj;
Var
VName,
VPath,
Vattrib : String;

createVpath : Boolean;
WebIndex : integer;

Procedure ShowHelp;
Begin
WriteLn('=========== VDir by CYFD! ============');
WriteLn('');
WriteLn(&#39;Useag:&#39;+ParamStr(0)+&#39; <-n:VName> <-p:VPath> <-i:WebIndex> <-c:CmdType> [-r:Vattrib]&#39;);
WriteLn(&#39;&#39;);
WriteLn(&#39;Sample:&#39;+ParamStr(0)+&#39; -n:yfd -p:c:\ -i:1 -c:1 -r:0,1,3&#39;);
WriteLn(&#39;&#39;);
WriteLn(&#39; CmdType :&#39;);
WriteLn(&#39; 1 : create&#39;);
WriteLn(&#39; 0 : delete&#39;);
WriteLn(&#39; Vattrib :&#39;);
WriteLn(&#39; 0 : AccessScript&#39;);
WriteLn(&#39; 1 : AccessRead&#39;);
WriteLn(&#39; 2 : AccessWrite&#39;);
WriteLn(&#39; 3 : AccessExecute&#39;);
WriteLn(&#39; 4 : EnableDirBrowsing&#39;);
End;

Procedure ParseParam(Str : String);
var
tStr : String;
Begin
tStr := lowercase(Copy(Str,1,3));
if tStr=&#39;-n:&#39; then
VName := Copy(Str,4,Length(Str));
if tStr=&#39;-p:&#39; then
VPath := Copy(Str,4,Length(Str));
if tStr=&#39;-c:&#39; then
createVpath := StrToIntDef(Copy(Str,4,Length(Str)),1) = 1;
if tStr=&#39;-r:&#39; then
Vattrib := Copy(Str,4,Length(Str));
if tStr=&#39;-i:&#39; then
WebIndex := StrToIntDef(Copy(Str,4,Length(Str)),1);

End;

Function GetStrForSpace(SourceStr :String ; JGZF:char ; Index:integer):String;
var
Pchar1 : pchar;
i , count : integer;
cStr : string;
begin
Count := 0;
Pchar1 := pchar(SourceStr);
cStr := &#39;&#39;;
for i:=0 to length(Pchar1)-1 do begin
if pchar1 = JGZF then
begin
Count := Count + 1;
if Count = Index then begin
break;
end;
end
else if Count = Index -1 then cStr := cStr + pchar1;
end;
Result := cStr;
end;


procedure createVDir(Vdirpath:string);
var
WebSite, WebServer, WebRoot, VDir,Binds: Variant;
BindStr : String;
begin
Try
WebSite := createOleObject(&#39;IISNamespace&#39;);
WebSite := WebSite.GetObject(&#39;IIsWebService&#39;, &#39;localhost/w3svc&#39;);
WebServer := WebSite.GetObject(&#39;IIsWebServer&#39;, IntTostr(WebIndex));

// 这里的WebIndex就是你要建立的序号.

WebRoot := WebServer.GetObject(&#39;IIsWebVirtualDir&#39;, &#39;Root&#39;);

if createVpath then Begin
VDir := WebRoot.create(&#39;IIsWebVirtualDir&#39;, VName);
Vdir.AccessScript := pos(&#39;,0,&#39;,Vattrib) >0;
VDir.AccessRead := pos(&#39;,1,&#39;,Vattrib) >0;
VDir.AccessWrite := pos(&#39;,2,&#39;,Vattrib) >0;
VDir.AccessExecute := pos(&#39;,3,&#39;,Vattrib) >0;
VDir.EnableDirBrowsing := pos(&#39;,4,&#39;,Vattrib) >0;

// 以上几行是为你建立的目录设访问权限。可写,可读,可执行,可流览...

VDir.Path :=VDirPath;
VDir.SetInfo;

Binds := WebServer.ServerBindings;
BindStr := Binds[0]+&#39;:&#39;;
WriteLn(&#39;&#39;);
WriteLn(&#39;Result :&#39;);
WriteLn(&#39;&#39;);
WriteLn(&#39;IP : &#39;+ GetStrForSpace(BindStr,&#39;:&#39;,1));
WriteLn(&#39;Port : &#39;+ GetStrForSpace(BindStr,&#39;:&#39;,2));
WriteLn(&#39;HostName : &#39;+ GetStrForSpace(BindStr,&#39;:&#39;,3));
WriteLn(&#39;&#39;);
WriteLN(&#39;Path Is: &#39; + WebRoot.Path);
WriteLN(&#39;Index IS: &#39; + IntTostr(WebIndex));
WriteLn(&#39;Comment : &#39; + WebServer.ServerComment);

// 上面几行就是得到站点的一些信息,IP,端口,主机名,路径,等等..

WriteLn(&#39;&#39;);
WriteLn(&#39;create success.&#39;);
End
Else Begin
WebRoot.delete(&#39;IIsWebVirtualDir&#39;, VName);
Writeln(&#39;delete Success.&#39;);
End;
Except
WriteLn(&#39;Fail.&#39;);
End;

end;

Var
i : integer;
begin

coinitialize(nil);
if ParamCount <4 then Begin
ShowHelp;
Exit;
End;

For i:=1 to ParamCount do
ParseParam(Paramstr(i));

if (ParamCount = 5) and (Vattrib =&#39;&#39;) then Begin
ShowHelp;
Exit;
End;
Vattrib := &#39;,&#39;+Vattrib+&#39;,&#39;;
createVDir(VPath);

{ TODO -oUser -cConsole Main : insert code here }

end.


代码可以用COPY到记事本中,然后保存为VDIR.DPR 文件,用DELPHI打开编译一下就行了。

使用方法:

我要在默认站点(序号为1)中建立一个,可读,可写,可注浏览的目录,名称为: yfd 路径为c:\

那么这么使用:

D:\VDir.exe -n:yfd -p:c:\ -i:1 -c:1 -r:1,2,4


程序帮助显示:

Useag:VDir.exe <-n:VName> <-p:VPath> <-i:WebIndex> <-c:CmdType> [-r:Vattrib]

Sample:D:\VDir.exe -n:yfd -p:c:\ -i:1 -c:1 -r:0,1,3

CmdType :
1 : create
0 : delete
Vattrib :

0 : AccessScript (脚本访问)
1 : AccessRead (可读)
2 : AccessWrite (可写)
3 : AccessExecute (可执行)
4 : EnableDirBrowsing (可浏览)

-n: 建立的目录名称

-P: 建立的目录路径

-i: 序号

-c: (1表示建立,0表示删除)

-r: (当选择建立的时候,请输入他相应的访问权限值,删除的时候可以不写).


返回结果:

D:\>VDir.exe -n:yfd -p:c:\ -i:1 -c:1 -r:1,2,4

Result :

IP : 127.0.0.1
Port : 80
HostName :

Path Is: E:\Script\WEBTEST
Index IS: 1
Comment : 默认 Web 站点

create success.
qq310926是我唯一用号,除此之外有其他号码号自称邪八冰血封情,则非本人。

TOP

发新话题