虚拟目录的配置简单来说就是创建虚拟目录。用手工的方式实现非常简单,直接设定“Web sharing”就可以了,让我们看看怎么通过编程的方式实现,两种创建虚拟目录的方法:
1、通过调用iisvdir.vbs,
2、通过System.DirectoryServices.DirectoryEntry。
为了方便描述,我写了两个虚拟目录操作类,简单的封装了iisvdir.vbs和System.DirectoryServices.DirectoryEntry管理虚拟目录的方法,结构如下所示:
Server为iis服务器的ip或机器名,User和Password为该服务器的管理员用户名和密码,Alias为虚拟目录的名称,VirtualRoot为虚拟目录所在根目录的名称(如下图),PhysicalPath为该虚拟目录相应的物理路径。如果想进一步了解IIS虚拟目录的属性,可以参考MSDN
IIsWebVirtualDir。
通过调用iisvdir.vbs创建虚拟目录
看官可以参考一下MSDN的相关资料:
Creating Web Virtual Directories Using Iisvdir.vbs
Deleting Web Virtual Directories Using Iisvdir.vbs
Listing Web Virtual Directories Using Iisvdir.vbs
.
仔细看还会发现, IIS管理器也是通过调用iisvdir.vbs来实现虚拟目录的创建和删除的。我们可以通过命令行的方式来执行iisvdir.vbs脚本,
1)创建虚拟目录:
cscript c:\windows\system32\iisvdir.vbs [
/
s server] [
/
u username
/
p password] /create [virtualRoot] Alias PhysicalPath
2)删除虚拟目录:
1
cscript c:\windows\system32\iisvdir.vbs [
/
s server] [
/
u username
/
p password]
/
delete [virtualRoot]
/
Alias
3)查看指定虚拟目录下的全部子目录:
1
cscript c:\windows\system32\iisvdir.vbs [
/
s server] [
/
u username
/
p password]
/
query virtualRoot
通过封装这三个操作,可以实现iis虚拟目录的创建、删除和判断是否存在:
1)创建虚拟目录:
1
///
<summary>
2
///
创建iis虚拟目录
3
///
</summary>
4
///
<exception cref="CreateIIsDirectory.DirectoryException">
虚拟目录操作异常
</exception>
5
public
override
void
CreateDirectory()
6
{
7
//
已不覆盖的方式创建虚拟目录,当虚拟目录存在时抛出异常
8
this
.CreateDirectory(
false
);
9
}
10
11
///
<summary>
12
///
创建iis虚拟目录
13
///
</summary>
14
///
<param name="bReplace">
是否覆盖掉原有的虚拟目录
</param>
15
///
<exception cref="CreateIIsDirectory.DirectoryException">
虚拟目录操作异常
</exception>
16
public
override
void
CreateDirectory(
bool
bReplace)
17
{
18
//
判断目录是否存在
19
if
(
this
.Exist())
20
{
21
if
(bReplace)
22
{
23
//
若允许覆盖则先删除原有的虚拟目录
24
this
.DeleteDirectory();
25
}
26
else
27
{
28
//
若不允许覆盖直接抛出目录已存在的异常
29
DirectoryException.Throw(
"
directory already exist
"
);
30
}
31
}
32
33
ReturnMessage message
=
ScriptDirectory.ExecuteScript(
34
this
, ScriptDirectory.CONST_ACTION_CREATE);
35
36
//
输出message信息供nunit查看
37
Console.WriteLine(
"
return code:
"
+
message.Code);
38
Console.WriteLine(
"
return message: \n
"
+
message.Message);
39
40
//
若创建失败抛出虚拟目录操作异常
41
if
(message.Code
!=
0
)
42
{
43
DirectoryException.Throw(message.Message);
44
}
45
}
2)删除虚拟目录:
1
///
<summary>
2
///
删除iis虚拟目录
3
///
</summary>
4
///
<exception cref="CreateIIsDirectory.DirectoryException">
虚拟目录操作异常
</exception>
5
public
override
void
DeleteDirectory()
6
{
7
ReturnMessage message
=
ScriptDirectory.ExecuteScript(
8
this
, ScriptDirectory.CONST_ACTION_DELETE);
9
10
//
输出message信息供nunit查看
11
Console.WriteLine(
"
return code:
"
+
message.Code);
12
Console.WriteLine(
"
return message: \n
"
+
message.Message);
13
14
//
若删除失败抛出虚拟目录操作异常
15
if
(message.Code
!=
0
)
16
{
17
DirectoryException.Throw(message.Message);
18
}
19
}
3) 判断虚拟目录是否存在:
1
///
<summary>
2
///
判断iis虚拟目录是否存在
3
///
</summary>
4
///
<returns>
目录是否存在
</returns>
5
public
override
bool
Exist()
6
{
7
ReturnMessage message
=
ScriptDirectory.ExecuteScript(
8
this
, ScriptDirectory.CONST_ACTION_QUERY);
9
bool
bExist
=
false
;
10
11
//
输出message信息供nunit查看
12
Console.WriteLine(
"
return code:
"
+
message.Code);
13
Console.WriteLine(
"
return message: \n
"
+
message.Message);
14
15
//
从返回字符串中判断该虚拟目录是否存在
16
if
(message.Code
==
0
)
17
{
18
Regex reg
=
new
Regex(
"
/
"
+
this
.m_strAlias
+
@"
\s+
"
);
19
message.Message
=
message.Message.Substring(
20
message.Message.IndexOf(
"
/
"
));
21
22
bExist
=
reg.IsMatch(message.Message);
23
}
24
25
return
bExist;
26
}
ScriptDirectory.ExecuteScript函数封装了iisvdir.vbs的调用和参数的组合,代码比较长,大家可以在/Files/chwkai/CreateIIsDirectory.rar下载到本文所讨论的代码。