C#操作IIS完整解析
A :版本问题这是你在进行编程前必须要要考虑的一个实际问题. 因为IIS 版本不同对应编程上基本上完全不同方式来进行的. 先了解一下Iss 版本在操作系统个具体要求.ISS6.0时代主要以using
A :版本问题
这是你在进行编程前必须要要考虑的一个实际问题. 因为IIS 版本不同对应编程上基本上完全不同方式来进行的. 先了解一下Iss 版本在操作系统个具体要求.
ISS6.0时代主要以using System.DirectoryServices 空间下的Directory Entry 对象作为编程访问一个主要载体. 但随着ISS 7.0发布.NET 的Web 程序由ISS6.0开始逐渐过渡到 7.0版本. 而且在编程控制ISS 上新添加的Microsoft.Web.Administration 名称空间, 提出多个用于管理 操作 和访问ISS 的对象, 使操作ISS 的编程更加简洁 高效.
B:我们要做什么
实际用户操作环境中主要以Windows XP/2000/2003操作系统为主, 这就导致了ISS 版本主要在5. 0/5.1/6.0之间, 所以本次演示的代码编程实例都是ISS 7.0版本以下(不包含Iss7.0).
为了达到演示目的, 我们现在需求是这样的: 把硬盘上Silverlight 应用程序成功部署到本地机器ISS 上. 并支持通过局域网访问. 需求很简单吧就是一句话, 其实当进入实际编程时因为客户的局域网环境是不可预知的, 这也就导致影响部署Silverlight 程序到ISS 上诸多未知因素. 所以要在编程中使Si lverlight 应用程序部署成功, 我们必须利用编程除了控制ISS 外还要控制其他主要影响ISS 因素

.
,C:进入编程
既然提出需求我
们大概确定一下
解决思路:
在默认站点下创建一个虚拟目录承载Silverlight 应用程序, 新建的虚拟目录运行在独立应用程序池中, 支持本地局域网匿名访问其实就是对访问权限控制, 为了直接使更改的应用生效需要多次重新启动ISS 的服务, 这就需要对ISS 服务进行编程控制.
<1>ISS版本的获取
在进入客户环境前我们先检测下是否存在安装了ISS, 以及ISS 版本获取提示, 目前获取ISS 版本的方式主要有两种, 第一种方法是通过遍历Directory Entry 实体目录 第二种方式是通过获取注册表的ISS 修改版本值[经测试这种方式获取版本不稳定].
1: public static void GetIssVersionByDri(string domainname) 2: {
3: try
4: {
5: if (string.IsNullOrEmpty(domainname))
6: {
7: //如果为空 则默认为本地机器
8: domainname = "LOCALHOST";
9: }
10: DirectoryEntry getEntity=new DirectoryEntry("IIS:

//" domainname "/W3SVC/INFO");
,11: string Version=getEntity.Properties["MajorIISVersionNumber"].Value.ToString();
12: MessageBox.Show(Version);
13: }
14: catch (Exception se)
15: {
16: //说明一点:IIS5.0中没有(int)entry.Properties["MajorIISVersionNumber"].Value;属性,将抛出异常 证明版本为 5.0
17: MessageBox.Show("获取ISS 的版本是发生异常信息:" se.Message);
18: }
19: }
通过系统注册表获取ISS 版本的值:[测试发现不稳定] 1: public static string GetIssVersion()
2: {
3: //RegistryKey表示 Windows 注册表中的项级节点. 此类是注册表封装
4: string issversion = string .Empty;
5: RegistryKey getkey = Registry.LocalMachine.OpenSubKey("softwaremicrosoftinetstp");
6: if (getkey != null )
7: {
8: issversion= Convert.ToInt32(getkey.GetValue("majorv ersion" , -1)).ToString();
,9: MessageBox.Show(issversion.ToString());
10: } 11:

return iss
version;
12: }
<2>创建虚拟目录
每个Internet 服务可以从多个目录中发布, 通过以通用命名约定 (UNC) 名、用户名及用于访问权限的密码指定目录,可将每个目录定位在本地驱动器或网络上, 虚拟目录可以一个宿主程序, 这可发布的操作目录即为虚拟目录. 再来看看在ISS6.0中创建的虚拟目录的步骤和控制的属性.
新建虚拟目录:
1: ///
2: /// 添加一个虚拟目录
3: ///
4: public void CreateVirtualDir(string virtualdirname, string logicDir)
5: {
6: //如果存在重复 就直接删除虚拟目录
7: if (IsExitesVirtualDir(virtualdirname))
,8: DeleteVirtualDir(virtualdirname);
9:
10: DirectoryEntry rootEntry;
11: rootEntry = new DirectoryEntry("IIS://localhost/W3SVC/1/root");
12:
13: DirectoryEntry newVirDir;
14: newVirDir = rootEntry.Children.Add(virtualdirname, "IIsWebVirtualDir" );
15: newVirDir.Invoke("AppCreate" , true );
16:
17: newVirDir.CommitChanges();
18: rootEntry.CommitChanges();
19:
20: newVirDir.Properties["AnonymousPasswordSync" ][0] = true ;
21: newVirDir.Properties["Path" ][0] = logicDir;// @"virtualdirentryvirtualname";
22:
23: //设置的端口绑定数据
24: //_newVirDir.Properties["ServerBindings"].Value =AppEntitys.WebAppInfor.HostIp AppEntitys.WebAppInfor.HostProt AppEntitys.WebAppInfor.AppDesc;
25:
26: //设置起始默认页:
,27: newVirDir.Properties["EnableDefaultDoc" ][0] = t rue ;
28: newVirDir.Properties["DefaultDoc" ][0] =

"Defaul t.aspx" ;
29:
30: //_newVirDir
31: newVirDir.CommitChanges();
32: }
这个方法在创建时主要有两个参数 一个是新建虚拟目录名称 另外一个要部署Silverlight 应用程序物理路径. 在获取根节目录时需要制定ISS 的路径. ISS的路径格式如:IIS://ComputerName/Service/Website/Directory
,找到根目录后添加新建虚拟目录. 制定参数为Schema-指每个结点的类型:IIsVirtualDir:——虚拟目录 IIsWebDir :——普通目录, 添加完成后调用ADSI 中的"AppCreate" 方法将目录真正创建. 创建完成后通过根目录和新目录提交保存.
<3>目录属性设置
在DirectoryEntity 虚拟目录属性可以说是非常多的, 当时在编程时我为了区分属性间区别做了一个方法去遍历整个属性集合PropertyCollection. 然后把常用重要的属性跳出来进入赋值设置. 因为关于虚拟目录的属性在MSDN 上的API 中并没有直接提到, 特别是对虚拟目录访问权限控制非常重要属性等 .先说明局部的常用的属性:
例如修改程序起始页: 1: //设置起始默认页:

2: newVirDir.Properties["EnableDefaultDoc" ][0] = true ;
,3: newVirDir.Properties["DefaultDoc" ][0] = "Default.asp x,Index.Html,index.asp" ;
4: newVirDir.CommitChanges();
DefaultDoc 选项可以支持多个但注意选择性排序. 一般修改目录属性后都选通过CommitChanges()方法提交保存, 但有时你会发现我明明修改属性 却没有保存生效. 这是因为ISS 中部分属性设置需要重新启动ISS 服务才能生效. 这个时候我们需要对ISS 服务进行控制.
<4>ISS服务控制
关于ISS 服务控制微软提供一个命名空间System.ServiceProcess 提供能够快速操作本地系统服务A PI. 对于ISS 服务控制我们最常用的是重新启动使当前设置生效. 在设置服务时我先找到服务名称, 打开计算机管理 在服务和应用程序目录下打开服务.
我们能看到ISS 服务命名是:ISSAdmin 我们通过编码来控制:启动ISS. 1: //获取IIS Serivcer控制声明 . 参数为Server 在系统标识该服务的简称

,.
2: ServiceController getservicecon = new ServiceController("IISADMIN" );
3: getservicecon.Start();
重启/暂停/停止ISS 服务:
,1: if (getservicecon.Status == ServiceControllerStatus.Running)
2: {
3: //停止服务
4: getservicecon.Stop();
5: //暂停服务
6: getservicecon.Pause();
7: //重启服务
8: //Process提供对本地和远程进程的访问并使您能够启动和停止本地系统进程
9: //利用Start 方法调用:启动(或重用)此 Process 组件的 StartInfo 属性指定的进程资源,并将其与该组件关联
10: //如果启动了进程资源,则为 true;如果没有启动新的进程资源(例如,如果重用了现有进程),则为 false
11: //通过指定文档或应用程序文件的名称来启动进程资源,并将资源与新的 Process 组件关联
12: Process.Start("iisreset" );
13: }
如上就是简单利用编程有效控制ISS 服务运行状态.
<5>应用程序池创建与控制
ISS 应用程序池是将一个或多个应用程序链接到一个或多个工作进程集合的配置。因为应用程序池中的应用程序与其他应用程序被工作进程边界分隔,所以某个应用程序池中的应用程序不会受到其他应
,用程序池中应用程序所产生的问题的影响, 当我们新建一个应用程序时 有时客户端环境我们无法清除预知, 为了尽量减少影响ISS 设置外在因素, 我们把新建虚拟目录放到一个独立应用程序池中. 当创建一个虚拟目录后, 也同时创建一个程序池 把虚拟目录放到其中: 1: ///
2: /// 建立程序池后关联相应应用程序及虚拟目录
3: ///
4: public static void SetAppToPool(string appname) 5: {
6: //获取目录
7: DirectoryEntry getdir = new DirectoryEntry("IIS://localhost/W3SVC");
8: foreach (DirectoryEntry getentity in getdir.Children)
9: {
10: if (getentity.SchemaClassName.Equals("IIsWe bServer" ))
11: {
12: //设置应用程序程序池 先获得应用程序 在设定应用程序程序池
13: //第一次测试根目录
14: foreach (DirectoryEntry getchild in getentity.Children)
15: {