如果在win8,win7情况下报错:未知错误(0x80005000)
见http://blog.csdn.net/ts1030746080/article/details/8741399
1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using System.DirectoryServices; 5 using System.Linq; 6 using System.Net; 7 using System.Text; 8 using System.Threading.Tasks; 9 10 namespace IISControlHelper 11 { 12 ///13 /// IIS 操作方法集合 14 /// http://blog.csdn.net/ts1030746080/article/details/8741399 错误 15 /// 16 public class IISWorker 17 { 18 private static string HostName = "localhost"; 19 20 ///21 /// 获取本地IIS版本 22 /// 23 ///24 public static string GetIIsVersion() 25 { 26 try 27 { 28 DirectoryEntry entry = new DirectoryEntry("IIS://" + HostName + "/W3SVC/INFO"); 29 string version = entry.Properties["MajorIISVersionNumber"].Value.ToString(); 30 return version; 31 } 32 catch (Exception se) 33 { 34 //说明一点:IIS5.0中没有(int)entry.Properties["MajorIISVersionNumber"].Value;属性,将抛出异常 证明版本为 5.0 35 return string.Empty; 36 } 37 } 38 39 /// 40 /// 创建虚拟目录网站 41 /// 42 /// 网站名称 43 /// 物理路径 44 /// 站点+端口,如192.168.1.23:90 45 /// 是否创建新的应用程序池 46 ///47 public static int CreateWebSite(string webSiteName, string physicalPath, string domainPort,bool isCreateAppPool) 48 { 49 DirectoryEntry root = new DirectoryEntry("IIS://" + HostName + "/W3SVC"); 50 // 为新WEB站点查找一个未使用的ID 51 int siteID = 1; 52 foreach (DirectoryEntry e in root.Children) 53 { 54 if (e.SchemaClassName == "IIsWebServer") 55 { 56 int ID = Convert.ToInt32(e.Name); 57 if (ID >= siteID) { siteID = ID + 1; } 58 } 59 } 60 // 创建WEB站点 61 DirectoryEntry site = (DirectoryEntry)root.Invoke("Create", "IIsWebServer", siteID); 62 site.Invoke("Put", "ServerComment", webSiteName); 63 site.Invoke("Put", "KeyType", "IIsWebServer"); 64 site.Invoke("Put", "ServerBindings", domainPort + ":"); 65 site.Invoke("Put", "ServerState", 2); 66 site.Invoke("Put", "FrontPageWeb", 1); 67 site.Invoke("Put", "DefaultDoc", "Default.html"); 68 // site.Invoke("Put", "SecureBindings", ":443:"); 69 site.Invoke("Put", "ServerAutoStart", 1); 70 site.Invoke("Put", "ServerSize", 1); 71 site.Invoke("SetInfo"); 72 // 创建应用程序虚拟目录 73 74 DirectoryEntry siteVDir = site.Children.Add("Root", "IISWebVirtualDir"); 75 siteVDir.Properties["AppIsolated"][0] = 2; 76 siteVDir.Properties["Path"][0] = physicalPath; 77 siteVDir.Properties["AccessFlags"][0] = 513; 78 siteVDir.Properties["FrontPageWeb"][0] = 1; 79 siteVDir.Properties["AppRoot"][0] = "LM/W3SVC/" + siteID + "/Root"; 80 siteVDir.Properties["AppFriendlyName"][0] = "Root"; 81 82 if (isCreateAppPool) 83 { 84 DirectoryEntry apppools = new DirectoryEntry("IIS://" + HostName + "/W3SVC/AppPools"); 85 86 DirectoryEntry newpool = apppools.Children.Add(webSiteName, "IIsApplicationPool"); 87 newpool.Properties["AppPoolIdentityType"][0] = "4"; //4 88 newpool.Properties["ManagedPipelineMode"][0] = "0"; //0:集成模式 1:经典模式 89 newpool.CommitChanges(); 90 siteVDir.Properties["AppPoolId"][0] = webSiteName; 91 } 92 93 siteVDir.CommitChanges(); 94 site.CommitChanges(); 95 return siteID; 96 } 97 98 /// 99 /// 得到网站的物理路径100 /// 101 /// 网站节点102 ///103 public static string GetWebsitePhysicalPath(DirectoryEntry rootEntry)104 {105 string physicalPath = "";106 foreach (DirectoryEntry childEntry in rootEntry.Children)107 {108 if ((childEntry.SchemaClassName == "IIsWebVirtualDir") && (childEntry.Name.ToLower() == "root"))109 {110 if (childEntry.Properties["Path"].Value != null)111 {112 physicalPath = childEntry.Properties["Path"].Value.ToString();113 }114 else115 {116 physicalPath = "";117 }118 }119 }120 return physicalPath;121 }122 123 /// 124 /// 获取站点名125 /// 126 public static ListGetServerBindings()127 {128 List iisList = new List ();129 string entPath = String.Format("IIS://{0}/w3svc", HostName);130 DirectoryEntry ent = new DirectoryEntry(entPath);131 foreach (DirectoryEntry child in ent.Children)132 {133 if (child.SchemaClassName.Equals("IIsWebServer", StringComparison.OrdinalIgnoreCase))134 {135 if (child.Properties["ServerBindings"].Value != null)136 {137 object objectArr = child.Properties["ServerBindings"].Value;138 string serverBindingStr = string.Empty;139 if (IsArray(objectArr))//如果有多个绑定站点时140 {141 object[] objectToArr = (object[])objectArr;142 serverBindingStr = objectToArr[0].ToString();143 }144 else//只有一个绑定站点145 {146 serverBindingStr = child.Properties["ServerBindings"].Value.ToString();147 }148 IISInfo iisInfo = new IISInfo();149 iisInfo.DomainPort = serverBindingStr;150 iisInfo.AppPool = child.Properties["AppPoolId"].Value.ToString();//应用程序池151 iisList.Add(iisInfo);152 }153 }154 }155 return iisList;156 }157 158 159 public static bool CreateAppPool(string appPoolName, string Username, string Password)160 {161 bool issucess = false;162 try163 {164 //创建一个新程序池165 DirectoryEntry newpool;166 DirectoryEntry apppools = new DirectoryEntry("IIS://" + HostName + "/W3SVC/AppPools");167 newpool = apppools.Children.Add(appPoolName, "IIsApplicationPool");168 169 //设置属性 访问用户名和密码 一般采取默认方式170 newpool.Properties["WAMUserName"][0] = Username;171 newpool.Properties["WAMUserPass"][0] = Password;172 newpool.Properties["AppPoolIdentityType"][0] = "3";173 newpool.CommitChanges();174 issucess = true;175 return issucess;176 }177 catch // (Exception ex) 178 {179 return false;180 }181 }182 183 184 /// 185 /// 建立程序池后关联相应应用程序及虚拟目录186 /// 187 public static void SetAppToPool(string appname,string poolName)188 {189 //获取目录190 DirectoryEntry getdir = new DirectoryEntry("IIS://localhost/W3SVC");191 foreach (DirectoryEntry getentity in getdir.Children)192 {193 if (getentity.SchemaClassName.Equals("IIsWebServer"))194 {195 //设置应用程序程序池 先获得应用程序 在设定应用程序程序池196 //第一次测试根目录197 foreach (DirectoryEntry getchild in getentity.Children)198 {199 if (getchild.SchemaClassName.Equals("IIsWebVirtualDir"))200 {201 //找到指定的虚拟目录.202 foreach (DirectoryEntry getsite in getchild.Children)203 {204 if (getsite.Name.Equals(appname))205 {206 //【测试成功通过】207 getsite.Properties["AppPoolId"].Value = poolName;208 getsite.CommitChanges();209 }210 }211 }212 }213 }214 }215 }216 217 218 ///219 /// 判断object对象是否为数组220 /// 221 public static bool IsArray(object o)222 {223 return o is Array;224 }225 }226 }