C#操作IIS服务

进入正题:先从使用角度来讲解IIS操作,然后再深入到具体的IIS服务底层原理。
【1】前提掌握要点:
(1)、IIS到目前经历了四个版本分别为 IIS4.0 IIS5.0 IIS6.0 IIS7.0,其中IIS6.0 IIS7.0是在5.0的安全问题的基础上获得的发展,目前为止。6.0版本以后的都是比较安全稳定的,为什么需要了解IIS版本,是因为6.0以后和之前的IIS提供的操作API是不一样的,不过IIS6.0时代主要以using System.DirectoryServices空间下的DirectoryEntry 对象作为编程访问一个主要载体.但随着IIS7.0发布.NET的Web程序由IIS6.0开始逐渐过渡到 7.0版本.而且在编程控制IIS上新添加的Microsoft.Web.Administration名称空间, 可以操作7.0
(2)、平时的站点部署需要配置什么参数或者说是我们一般自己部署站点需要什么场景的操作,考虑可以用程序实现的,然后可以模型化为对象去实现。
我采用的方案是:将部署的站点声明为一个对象,其中包含了一般我们站点部署时设置的参数作为它的属性和字段,将我们一般站点设置实现为一些方法。
可以先定义一个站点类:
//站点身份验证模式public enum autherRight {asp_net模拟, Form身份验证, Windows身份验证, 基本身份验证,匿名身份验证,摘要式身份验证 };/// <summary>/// 站点类/// </summary>public class newWebSiteInfo { //站点设置参数 public string hostIp; //主机ip public string porNum; //端口号 public string hostName;//主机名 public string webName; //网站名 public string appName; //应用程序池 public string webPath; //根目录 public string visualPath;//虚拟目录 public Dictionary<string, string> newMimeType;//需要新添加mime类型 public autherRight autherRight;//身份验证模式 public string defoultPage;//默认文档 public newWebSiteInfo(string hostip, string portnum, string hostname, string webname, string appName, string webpath, string visualPath, Dictionary<string, string> newMimeType, autherRight autherRight,string defoultPage) { this.hostIp = hostip; this.porNum = portnum; this.hostName = hostname; this.webName=webname; this.appName = appName; this.webPath = webpath; this.visualPath = visualPath; this.newMimeType = newMimeType; this.autherRight = autherRight; this.defoultPage = defoultPage; } /// <summary> /// 返回站点绑定信息 /// </summary> /// <returns></returns> public string bindString() { return String.IsNullOrEmpty(hostName) ? String.Format("http://{0}:{1}", hostIp, porNum) : String.Format("http://{0}:{1}", hostName, porNum); }} |
目前IIS操作主要有两种方式:一种是System.DirectoryServices空间下面的类,用于IIS5/6版本,和可以兼容iis6的IIS7版本;Microsoft.Web.Administration空间下面的类,IIS7引入的新的管理类,主要通过ServerManger类进行站点新增。
本次主要通过System.DirectoryServices方式操作IIS,也简要介绍一下ServerManger新建站点:
(1) 添加.net引用Microsoft.Web.Administration.dll,实例化ServerManger新增站点方式如下:
using System;using Microsoft.Web.Administration;class CreateASite{ static void Main(string[] args) { ServerManager serverManager = new ServerManager(); Site mySite = serverManager.Sites.Add( "MySite", "d:\\inetpub\\mysite", 8080); mySite.ServerAutoStart = true; serverManager.CommitChanges(); }} |
(2)通过System.DirectoryServices空间下面的类获取IIS服务,但其实对于高版本的也可以同时引用Microsoft.Web.Administration.dll中通过ServerManger来进行参数设置各有各的好处。
首先介绍一下我用到的几个命名空间:
using System.DirectoryServices; //获取目录实体类using Microsoft.Web.Administration; //ServerManger类所属命名空间using IISOle; //IIS管理添加mime类型using System.Security.AccessControl; //设置文件安全权限类所属命名空间using System.IO; //文件路径类所属命名空间using System.ServiceProcess; //上一节中所用的系统服务对象所属命名空间 |
现在提供我自己的源代码,可以适用一般类需求,对于一些特殊配置的应用程序部署,可以稍微做微调。
|
|
///created by george///date:2014-5-3///QQ:709617880namespace IISmng{ //站点身份验证模式 public enum autherRight {asp_net模拟, Form身份验证, Windows身份验证, 基本身份验证,匿名身份验证,摘要式身份验证 }; /// <summary> /// 站点类 /// </summary> public class newWebSiteInfo { //站点设置参数 public string hostIp; //主机ip public string porNum; //端口号 public string hostName;//主机名 public string webName; //网站名 public string appName; //应用程序池 public string webPath; //物理路径 public string visualPath;//虚拟目录 public Dictionary<string, string> newMimeType;//需要新添加mime类型 public autherRight autherRight;//身份验证模式 public string defoultPage;//默认文档 public newWebSiteInfo(string hostip, string portnum, string hostname, string webname, string appName, string webpath, string visualPath, Dictionary<string, string> newMimeType, autherRight autherRight,string defoultPage) { this.hostIp = hostip; this.porNum = portnum; this.hostName = hostname; this.webName=webname; this.appName = appName; this.webPath = webpath; this.visualPath = visualPath; this.newMimeType = newMimeType; this.autherRight = autherRight; this.defoultPage = defoultPage; } /// <summary> /// 返回站点绑定信息 /// </summary> /// <returns></returns> public string bindString() { return String.IsNullOrEmpty(hostName) ? String.Format("http://{0}:{1}", hostIp, porNum) : String.Format("http://{0}:{1}", hostName, porNum); } } //托管模式 public enum modelType{集成,经典}; //net版本 public enum netVersion{ v2_0 , v4_0}; /// <summary> /// IIS操作类 /// </summary> public class myIIS { /// <summary> /// IIS版本属性 /// </summary> public String IISVersion { get { return IISVersion; } set{ IISVersion = "v"+IISService.Properties["MajorIISVersionNumber"].Value.ToString(); } } /// <summary> /// 检测客户端或服务器是否安装IIS服务 /// </summary> /// <returns>true OR false</returns> public Boolean checkIIS() { Boolean retMsg = false; try { if(IISService.GetType().ToString().Equals("DirectoryEntry")) { if (checkServiceIsRunning("IIS Admin Service")) retMsg=true; } } catch(Exception e){ } return retMsg; } /// <summary> /// 检测服务是否开启 /// </summary> /// <param name="serviceName"></param> /// <returns></returns> public Boolean checkServiceIsRunning(string serviceName) { ServiceController[] allServices = System.ServiceProcess.ServiceController.GetServices(); Boolean runing = false; foreach (ServiceController sc in allServices) { if (sc.DisplayName.Trim() == serviceName.Trim()) { if (sc.Status.ToString() == "Running") { runing = true; } } } return runing; } /// <summary> /// 获取本机IIS版本 /// </summary> /// <returns></returns> public String getIISVersion() { String retStr = ""; if (checkIIS()) { retStr = "v"+IISService.Properties["MajorIISVersionNumber"].Value.ToString(); } return retStr; } /// <summary> /// 判断程序池是否存在 /// </summary> /// <param name="AppPoolName">程序池名称</param> /// <returns>true存在 false不存在</returns> private bool isAppPoolExist(string AppPoolName) { bool result = false; foreach (DirectoryEntry appPool in appPools.Children) { if (appPool.Name.Equals(AppPoolName)) { result = true; } } return result; } /// <summary> /// 创建应用程序池 /// </summary> /// <param name="appName">自定义引用程序池名</param> /// <param name="type">托管类型</param> /// <param name="netV">.net版本</param> /// <returns></returns> public DirectoryEntry creatAppPool(string appName, modelType type, netVersion netV) { if (!isAppPoolExist(appName)) { DirectoryEntry newpool; newpool = appPools.Children.Add(appName, "IIsApplicationPool"); //修改应用程序池配置 setModalAndNetVersionOfappPool(appName, type, netV); newpool.CommitChanges(); return newpool; } else return null; } /// <summary> /// 删除指定程序池 /// </summary> /// <param name="AppPoolName">程序池名称</param> /// <returns>true删除成功 false删除失败</returns> private bool deleteAppPool(string AppPoolName) { bool result = false; if (isAppPoolExist(AppPoolName)) return result; foreach (DirectoryEntry appPool in appPools.Children) { if (appPool.Name.Equals(AppPoolName)) { try { appPool.DeleteTree(); result = true; } catch { result = false; } } } return result; } /// <summary> /// 设置应用程序池的托管模式和.net版本 /// </summary> /// <param name="appPoolName"></param> /// <param name="modelType"></param> /// <param name="netVersion"></param> public void setModalAndNetVersionOfappPool(string appPoolName, modelType mt, netVersion nv) { if (String.IsNullOrEmpty(appPoolName)) return; if (isAppPoolExist(appPoolName)) return; if (nv == null) return; if (mt == null) return; ServerManager sm = new ServerManager(); if (nv == netVersion.v2_0) { sm.ApplicationPools[appPoolName].ManagedRuntimeVersion = "v2.0"; } else if (nv == netVersion.v4_0) { sm.ApplicationPools[appPoolName].ManagedRuntimeVersion = "v4.0"; } if (mt == modelType.集成) { sm.ApplicationPools[appPoolName].ManagedPipelineMode = ManagedPipelineMode.Integrated; } else if(mt==modelType.经典) { sm.ApplicationPools[appPoolName].ManagedPipelineMode = ManagedPipelineMode.Classic; //托管模式Integrated为集成 Classic为经典 } sm.CommitChanges(); } /// <summary> ///检测网站名是否可用 /// </summary> /// <param name="siteInfo"></param> /// <returns>true 可用,false 不可用过</returns> public bool checkWebNameIsAvailble(string webComment) { //检测网站名是否可用 bool isAvalable = true; foreach (DirectoryEntry entry in serviceEntry.Children) { if (entry.SchemaClassName == "IIsWebServer") { string webName = entry.Properties["ServerComment"].Value.ToString(); if (webName == webComment) { isAvalable = false; break; } } } return isAvalable; } /// <summary> /// 检测端口号是否已被占用 /// 注意:端口号输入有限制,在调用该方法前,需要做端口号合理性校验 /// </summary> /// <param name="portNum"></param> /// <returns></returns> public bool checkPortIsVailble(string portNum) { bool isVailble = true; foreach (DirectoryEntry entry in serviceEntry.Children) { if (entry.SchemaClassName == "IIsWebServer") { if (entry.Properties["ServerBindings"].Value != null) { string Binding = entry.Properties["ServerBindings"].Value.ToString().Trim(); string[] Info = Binding.Split(':'); if (Info[1].Trim() == portNum) { isVailble = false; break; } } } } return isVailble; } /// <summary> /// 创建网站 /// </summary> /// <param name="siteInfo"></param> public DirectoryEntry creatNewWeb(newWebSiteInfo siteInfo,modelType type,netVersion netV) { int webID = 0; foreach (DirectoryEntry server in Services.Children) { if (server.SchemaClassName == "IIsWebServer") { if (Convert.ToInt32(server.Name) > webID) { webID = Convert.ToInt32(server.Name); } } } webID++; //创建站点 DirectoryEntry mySitServer = Services.Children.Add(webID.ToString(), "IIsWebServer"); mySitServer.Properties["ServerComment"].Clear(); mySitServer.Properties["ServerComment"].Add(siteInfo.webName); mySitServer.Properties["Serverbindings"].Clear(); mySitServer.Properties["Serverbindings"].Add(":" + siteInfo.porNum + ":"); mySitServer.Properties["Path"].Clear();//注意该path为站点的路径,新增站点时,两者目录一致 mySitServer.Properties["path"].Add(siteInfo.webPath); mySitServer.Properties["DefaultDoc"].Add(siteInfo.defoultPage);//设置默认文档 //创建虚拟目录 DirectoryEntry root = mySitServer.Children.Add("Root", "IIsWebVirtualDir"); root.Properties["path"].Clear();//该路劲属性是站点下虚拟路径的路径,类似于站点的子路径 root.Properties["path"].Add(siteInfo.visualPath); if (string.IsNullOrEmpty(siteInfo.appName)) { root.Invoke("appCreate", 0); } else { //创建引用程序池 string appPoolName = siteInfo.appName; if (!isAppPoolExist(appPoolName)) { DirectoryEntry newpool; newpool = appPools.Children.Add(appPoolName, "IIsApplicationPool"); newpool.CommitChanges(); } //修改应用程序池配置 setModalAndNetVersionOfappPool(appPoolName, type,netV); root.Invoke("appCreate3", 0, appPoolName, true); } root.Properties["AppFriendlyName"].Clear(); root.Properties["AppIsolated"].Clear(); root.Properties["AccessFlags"].Clear(); root.Properties["FrontPageWeb"].Clear(); root.Properties["AppFriendlyName"].Add(root.Name); root.Properties["AppIsolated"].Add(2); root.Properties["AccessFlags"].Add(513); root.Properties["FrontPageWeb"].Add(1); root.CommitChanges(); mySitServer.CommitChanges(); return mySitServer; } /// <summary> /// 设置站点新增自定义mime类型,一次添加一个类型 /// </summary> /// <param name="siteInfo"></param> /// <param name="mysiteServer"></param> public void addMIMEtype(newWebSiteInfo siteInfo,DirectoryEntry mysiteServer) { //需要添加新的mime类型 if (siteInfo.newMimeType.Count > 0) { IISOle.MimeMapClass NewMime = new IISOle.MimeMapClass(); NewMime.Extension = siteInfo.newMimeType.Keys.ToString(); NewMime.MimeType = siteInfo.newMimeType.Values.ToString(); IISOle.MimeMapClass TwoMime = new IISOle.MimeMapClass(); mysiteServer.Properties["MimeMap"].Add(NewMime); mysiteServer.CommitChanges(); } } /// <summary> /// 设置文件夹权限 处理给EVERONE赋予所有权限 /// </summary> /// <param name="FileAdd">文件夹路径</param> public void SetFileRole(newWebSiteInfo siteInfo) { DirectoryInfo dir_info = new DirectoryInfo(siteInfo.webPath); DirectorySecurity dir_security = new DirectorySecurity(); dir_security.AddAccessRule(new FileSystemAccessRule("Everyone ", FileSystemRights.WriteData, AccessControlType.Allow)); dir_info.SetAccessControl(dir_security); } /// <summary> /// 删除网站 /// </summary> /// <param name="webName"></param> public void deletWeb(string webName) { foreach (DirectoryEntry server in Services.Children) { if (server.SchemaClassName == "IIsWebServer") { if (server.Properties["ServerComment"].Value == webName || server.Name==webName) { server.DeleteTree(); break; } } } Services.CommitChanges(); } }} |
C#操作IIS服务的更多相关文章
- bat文件重启SQL服务和IIS服务
sqlserver有自动备份功能,所以要重启两个服务器,下面是重启脚本,脚本名称:sql_restart.bat net stop sqlserveragent net stop mssqlse ...
- WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
原文:[原创]WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿 在上面一篇文章中,我们对不同版本的IIS,以及ASP.NET得的实现机制进行了详细而深入的分析.在介绍IIS7.0的时候,我们 ...
- C#操作IIS完整解析
原文:C#操作IIS完整解析 最近在为公司实施做了一个工具,Silverlight部署早已是轻车熟路, 但对于非技术人员来说却很是头疼的一件事,当到现场实施碰到客户情况也各不相同, 急需一个类似系统备 ...
- 最完整的dos命令字典,IIS服务命令,FTP命令
https://www.cnblogs.com/accumulater/p/10670051.html(优秀博文) 一.最完整的dos命令字典net use ipipc$ " " ...
- C# 在程序中控制IIS服务或应用程序池关闭重启
//停止IIS服务 ServiceController sc = new ServiceController("iisadmin"); if(sc.Status=ServiceCo ...
- 完整安装IIS服务
此文主要是针对前面提到的 IIS支持json.geojson文件 添加脚本映射时,提示找不到asp.dll时的解决方法. 主要参考了此文:http://www.kodyaz.com/articles/ ...
- 在vmware虚拟机下的Window2003服务器下安装IIS服务详细教程——超级详细(解决关于:800a0bb9的解决办法)
总的来说,就是9步: 1.控制面板添加或者删除程序2.删除想要删的3.打开IIS配置4.开始共享5.导入源码6.配置权限7.网站属性.文档.应用程序配置8.web服务扩展9.访问网站 在安装好虚拟机的 ...
- C#操作注册服务卸载服务启动服务停止服务.. .
using Microsoft.Win32; using System; using System.Collections; using System.Collections.Generic; usi ...
- Windows 远程停止iis服务
最近遇到一个小需求,需要重启远程计算机的iis服务. 需求背景是这样的,用jenkins 做ci的时候, 由于项目是有单独的web服务器,项目虽然是一套, 但是分为A,B,C三个web系统,其中A,B ...
随机推荐
- 3 Python+Selenium的元素定位方法(id、class name、name、tag name)
[环境] Python3.6+selenium3.0.2+IE11+Win7 [定位方法] 1.通过ID定位 方法:find_element_by_id('xx') 2.通过name定位 方法:fin ...
- SVN冲突出现原因及解决方法浅谈
缘由 很简单,用svn合base,出现了各种各样奇怪的问题,虽然最终没有造成什么大的线上问题,但过程也是曲折的,耗费个人精力,也占用他人资源,不好不好,一点都不佛系. 究其原因,还是对为什么出现各种冲 ...
- RabbitMQ学习之基于spring-rabbitmq的RPC远程调用
http://blog.csdn.net/zhu_tianwei/article/details/40920985 spring-rabbitmq中实现远程接口调用,主要在com.rabbitmq.s ...
- (转)shiro权限框架详解06-shiro与web项目整合(下)
http://blog.csdn.net/facekbook/article/details/54962975 shiro和web项目整合,实现类似真实项目的应用 web项目中认证 web项目中授权 ...
- Flex元素布局规则总结,以及布局和容器
一.Flex中的元素分类从功能层面可以把Flex中的元素分为组件(Components)和容器(Containers)两大类:组件 - 是指那类具有明确交互或数据展示功能的元素,例如Button.Ch ...
- Python数据分析--------numpy数据打乱
一.shuffle函数: import numpy.random def shuffleData(data): np.random.shufflr(data) cols=data.shape[1] X ...
- 【BZOJ2733】【HNOI2012】永无乡 - 线段树合并
题意: Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通 ...
- vue项目优化--使用CDN和Gzip
使用vue-cli构建的vue项目,在打包发布的时候,发现打包后的文件体积很大,使用webpack-bundle-analyzer分析后,发现占用空间最多的是引用的第三方依赖.第三方的依赖文件可以使用 ...
- 面试准备专题——JVM,类编译,类加载,内存错误
jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 GC分析 命令调优 类的加载机制 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法 ...
- Newton均差插值性质证明
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1cWl1aHVp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...