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:709617880 namespace 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 ...
随机推荐
- 那些年 IE 下踩过的坑
1年过去了,换了一个不用兼容IE8一下浏览器的工作了! 1.:before,:after(伪类) 所有主流浏览器都支持 :before 选择器. 注释:对于 IE8 及更早版本中的 :before,必 ...
- android学习路线总结
感谢安辉作者,学习路线 https://www.cnblogs.com/yishaochu/p/5436094.html https://www.cnblogs.com/jycboy/p/60666 ...
- 洛谷 P2365 任务安排_代价提前计算 + 好题
最开始,笔者将状态 fif_{i}fi 定义为1到i的最小花费 ,我们不难得到这样的一个状态转移方程,即 fi=(sumti−sumtj+S+Costj)∗(sumfi−sumfj)f_{i}=(s ...
- 热重载 预编译 编译器 JS引擎 作用域
热重载就是页面每次改动,不需要手动去刷新,可自动刷新.保持vuex的状态. JS之预编译 JavaScript的预编译 编译器 JS引擎 作用域三者之间的关系 建议你先去看看你不知道的JavaScri ...
- Day 09 文件操作
什么是文件 文件是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位.文件的操作是基于文件,即文件的操作核心就是:读和写.也 就是只要我们想要操作文件就是对操作系统发起请求,然后由操作系统将用户或应 ...
- AM335X用RGB888连接LCD如何以16位色彩模式显示图片
在AM335x中,在连接显示屏的时候,存在一个问题.这个在am335x Sillicon Errata已经提到过 在RGB888模式中 而对于RGB565模式的硬件连接 不难看出,这个RGB是反的 ...
- IDEA热部署配置
一.IDEA热加载的作用: 热加载的作用就是当你保存修改,新增,删除代码或者文件后,不需要重新启动项目,直接就能运行. 二.IDEA热记载的配置方法 1.配置pom文件,加载依赖 Maven. < ...
- NOI 2016 循环之美 (莫比乌斯反演+杜教筛)
题目大意:略 洛谷传送门 鉴于洛谷最近总崩,附上良心LOJ链接 任何形容词也不够赞美这一道神题 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{M}[gcd(i,j) ...
- GOF23设计模式之建造者模式
GOF23设计模式之建造者模式 场景: 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样的一个问题需要处理: 装配这些子组件是不是有个步骤问题? 实际开发中,我们所 ...
- Appium遇到问题:
问题一:问题org.openqa.selenium.remote.UnreachableBrowserException: Could not start a new session. Possibl ...