当前位置:   article > 正文

用C#操纵IIS_c#控制iis

c#控制iis
  1. using System;
  2. using System.DirectoryServices;
  3. using System.Collections;
  4. using System.Text.RegularExpressions;
  5. using System.Text;
  6. namespace Wuhy.ToolBox
  7. {
  8. /// <summary>
  9. /// 这个类是静态类。用来实现管理IIS的基本操作。
  10. /// 管理IIS有两种方式,一是ADSI,一是WMI。由于系统限制的原因,只好选择使用ADSI实现功能。
  11. /// 这是一个遗憾。只有等到只有使用IIS 6的时候,才有可能使用WMI来管理系统
  12. /// 不过有一个问题就是,我现在也觉得这样的一个方法在本地执行会比较的好。最好不要远程执行。
  13. /// 因为那样需要占用相当数量的带宽,即使要远程执行,也是推荐在同一个网段里面执行
  14. /// </summary>
  15. public class IISAdminLib
  16. {
  17. #region UserName,Password,HostName的定义
  18. public static string HostName
  19. {
  20. get
  21. {
  22. return hostName;
  23. }
  24. set
  25. {
  26. hostName = value;
  27. }}
  28. public static string UserName
  29. {
  30. get
  31. {
  32. return userName;
  33. }
  34. set
  35. {
  36. userName = value;
  37. }
  38. }
  39. public static string Password
  40. {
  41. get
  42. {
  43. return password;
  44. }
  45. set
  46. {
  47. if(UserName.Length <= 1)
  48. {
  49. throw new ArgumentException("还没有指定好用户名。请先指定用户名");
  50. }
  51. password = value;
  52. }
  53. }
  54. public static void RemoteConfig(string hostName, string userName, string password)
  55. {
  56. HostName = hostName;
  57. UserName = userName;
  58. Password = password;
  59. }
  60. private static string hostName = "localhost";
  61. private static string userName;
  62. private static string password;
  63. #endregion
  64. #region 根据路径构造Entry的方法
  65. /// <summary>
  66. /// 根据是否有用户名来判断是否是远程服务器。
  67. /// 然后再构造出不同的DirectoryEntry出来
  68. /// </summary>
  69. /// <param name="entPath">DirectoryEntry的路径</param>
  70. /// <returns>返回的是DirectoryEntry实例</returns>
  71. public static DirectoryEntry GetDirectoryEntry(string entPath)
  72. {
  73. DirectoryEntry ent;
  74. if(UserName == null)
  75. {
  76. ent = new DirectoryEntry(entPath);
  77. }
  78. else
  79. {
  80. // ent = new DirectoryEntry(entPath, HostName+"\\"+UserName, Password, AuthenticationTypes.Secure);
  81. ent = new DirectoryEntry(entPath, UserName, Password, AuthenticationTypes.Secure);
  82. }
  83. return ent;
  84. }
  85. #endregion
  86. #region 添加,删除网站的方法
  87. /// <summary>
  88. /// 创建一个新的网站。根据传过来的信息进行配置
  89. /// </summary>
  90. /// <param name="siteInfo">存储的是新网站的信息</param>
  91. public static void CreateNewWebSite(NewWebSiteInfo siteInfo)
  92. {
  93. if(! EnsureNewSiteEnavaible(siteInfo.BindString))
  94. {
  95. throw new DuplicatedWebSiteException("已经有了这样的网站了。" + Environment.NewLine + siteInfo.BindString);
  96. }
  97. string entPath = String.Format("IIS://{0}/w3svc", HostName);
  98. DirectoryEntry rootEntry = GetDirectoryEntry(entPath);
  99. string newSiteNum = GetNewWebSiteID();
  100. DirectoryEntry newSiteEntry = rootEntry.Children.Add(newSiteNum, "IIsWebServer");
  101. newSiteEntry.CommitChanges();
  102. newSiteEntry.Properties["ServerBindings"].Value = siteInfo.BindString;
  103. newSiteEntry.Properties["ServerComment"].Value = siteInfo.CommentOfWebSite;
  104. newSiteEntry.CommitChanges();
  105. DirectoryEntry vdEntry = newSiteEntry.Children.Add("root", "IIsWebVirtualDir");
  106. vdEntry.CommitChanges();
  107. vdEntry.Properties["Path"].Value = siteInfo.WebPath;
  108. vdEntry.CommitChanges();
  109. }
  110. /// <summary>
  111. /// 删除一个网站。根据网站名称删除。
  112. /// </summary>
  113. /// <param name="siteName">网站名称</param>
  114. public static void DeleteWebSiteByName(string siteName)
  115. {
  116. string siteNum = GetWebSiteNum(siteName);
  117. string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
  118. DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
  119. string rootPath = String.Format("IIS://{0}/w3svc", HostName);
  120. DirectoryEntry rootEntry = GetDirectoryEntry(rootPath);
  121. rootEntry.Children.Remove(siteEntry);
  122. rootEntry.CommitChanges();
  123. }
  124. #endregion
  125. #region Start和Stop网站的方法
  126. public static void StartWebSite(string siteName)
  127. {
  128. string siteNum = GetWebSiteNum(siteName);
  129. string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
  130. DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
  131. siteEntry.Invoke("Start", new object[] {});
  132. }
  133. public static void StopWebSite(string siteName)
  134. {
  135. string siteNum = GetWebSiteNum(siteName);
  136. string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
  137. DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
  138. siteEntry.Invoke("Stop", new object[] {});
  139. }
  140. #endregion
  141. #region 确认网站是否相同
  142. /// <summary>
  143. /// 确定一个新的网站与现有的网站没有相同的。
  144. /// 这样防止将非法的数据存放到IIS里面去
  145. /// </summary>
  146. /// <param name="bindStr">网站邦定信息</param>
  147. /// <returns>真为可以创建,假为不可以创建</returns>
  148. public static bool EnsureNewSiteEnavaible(string bindStr)
  149. {
  150. string entPath = String.Format("IIS://{0}/w3svc", HostName);
  151. DirectoryEntry ent = GetDirectoryEntry(entPath);
  152. foreach(DirectoryEntry child in ent.Children)
  153. {
  154. if(child.SchemaClassName == "IIsWebServer")
  155. {
  156. if(child.Properties["ServerBindings"].Value != null)
  157. {
  158. if(child.Properties["ServerBindings"].Value.ToString() == bindStr)
  159. {
  160. return false;
  161. }
  162. }
  163. }
  164. }
  165. return true;
  166. }
  167. #endregion
  168. #region 获取一个网站编号的方法
  169. /// <summary>
  170. /// 获取一个网站的编号。根据网站的ServerBindings或者ServerComment来确定网站编号
  171. /// </summary>
  172. /// <param name="siteName"></param>
  173. /// <returns>返回网站的编号</returns>
  174. /// <exception cref="NotFoundWebSiteException">表示没有找到网站</exception>
  175. public static string GetWebSiteNum(string siteName)
  176. {
  177. Regex regex = new Regex(siteName);
  178. string tmpStr;
  179. string entPath = String.Format("IIS://{0}/w3svc", HostName);
  180. DirectoryEntry ent = GetDirectoryEntry(entPath);
  181. foreach(DirectoryEntry child in ent.Children)
  182. {
  183. if(child.SchemaClassName == "IIsWebServer")
  184. {
  185. if(child.Properties["ServerBindings"].Value != null)
  186. {
  187. tmpStr = child.Properties["ServerBindings"].Value.ToString();
  188. if(regex.Match(tmpStr).Success)
  189. {
  190. return child.Name;
  191. }
  192. }
  193. if(child.Properties["ServerComment"].Value != null)
  194. {
  195. tmpStr = child.Properties["ServerComment"].Value.ToString();
  196. if(regex.Match(tmpStr).Success)
  197. {
  198. return child.Name;
  199. }
  200. }
  201. }
  202. }
  203. throw new NotFoundWebSiteException("没有找到我们想要的站点" + siteName);
  204. }
  205. #endregion
  206. #region 获取新网站id的方法
  207. /// <summary>
  208. /// 获取网站系统里面可以使用的最小的ID。
  209. /// 这是因为每个网站都需要有一个唯一的编号,而且这个编号越小越好。
  210. /// 这里面的算法经过了测试是没有问题的。
  211. /// </summary>
  212. /// <returns>最小的id</returns>
  213. public static string GetNewWebSiteID()
  214. {
  215. ArrayList list = new ArrayList();
  216. string tmpStr;
  217. string entPath = String.Format("IIS://{0}/w3svc", HostName);
  218. DirectoryEntry ent = GetDirectoryEntry(entPath);
  219. foreach(DirectoryEntry child in ent.Children){
  220. if(child.SchemaClassName == "IIsWebServer")
  221. {
  222. tmpStr = child.Name.ToString();
  223. list.Add(Convert.ToInt32(tmpStr));
  224. }
  225. }
  226. list.Sort();int i = 1;
  227. foreach(int j in list)
  228. {
  229. if(i == j)
  230. {
  231. i++;
  232. }
  233. }
  234. return i.ToString();
  235. }
  236. #endregion
  237. }
  238. #region 新网站信息结构体
  239. public struct NewWebSiteInfo
  240. {
  241. private string hostIP; // The Hosts IP Address
  242. private string portNum; // The New Web Sites Port.generally is "80"
  243. private string descOfWebSite; // 网站表示。一般为网站的网站名。例如www.dns.com.cn
  244. private string commentOfWebSite;// 网站注释。一般也为网站的网站名。
  245. private string webPath; // 网站的主目录。例如"e:\tmp"
  246. public NewWebSiteInfo(string hostIP, string portNum, string descOfWebSite, string commentOfWebSite, string webPath;
  247. {this.hostIP = hostIP;
  248. this.portNum = portNum;
  249. this.descOfWebSite = descOfWebSite;
  250. this.commentOfWebSite = commentOfWebSite;
  251. this.webPath = webPath;
  252. }
  253. public string BindString
  254. {
  255. get{return String.Format("{0}:{1}:{2}", hostIP, portNum, descOfWebSite);}
  256. }
  257. public string CommentOfWebSite
  258. {
  259. get
  260. {
  261. return commentOfWebSite;
  262. }
  263. }
  264. public string WebPath
  265. {
  266. get
  267. {
  268. return webPath;
  269. }
  270. }
  271. }
  272. #endregion
  273. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/252193
推荐阅读
相关标签
  

闽ICP备14008679号