注意使用时要有服务器管理员权限 ,可在Web.config 添加
<system.web>
<identity impersonate="true" userName="服务器用户名" password="密码" />
</system.web>
IISWorker
using AppMain.model;
using System;
using System.Collections.Generic;
using System.DirectoryServices;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace AppMain.bll
{
public class IISWorker
{
#region 获取IIS版本
/// <summary>
/// 获取本地IIS版本
/// </summary>
/// <returns></returns>
public static string GetIIsVersion()
{
try
{
DirectoryEntry entry = new DirectoryEntry("IIS://localhost/W3SVC/INFO");
string version = entry.Properties["MajorIISVersionNumber"].Value.ToString();
return version;
}
catch (Exception se)
{
//说明一点:IIS5.0中没有(int)entry.Properties["MajorIISVersionNumber"].Value;属性,将抛出异常 证明版本为 5.0
return string.Empty;
}
}
#endregion
#region 获取SiteID
/// <summary>
/// 获取最小SiteId,越小越好
/// </summary>
/// <returns></returns>
public static int SiteId()
{
DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC");
// Find unused ID value for new web site
int siteID = 1;
foreach (DirectoryEntry e in root.Children)
{
if (e.SchemaClassName == "IIsWebServer")
{
int ID = Convert.ToInt32(e.Name);
if (ID >= siteID)
{
siteID = ID + 1;
}
}
}
return siteID;
}
#endregion
#region 建IIS站点
/// <summary>
/// IIS站点
/// </summary>
/// <param name="webSiteName">站点名称</param>
/// <param name="siteID">站点ID</param>
/// <param name="port">站点端口</param>
/// <param name="siteExplain">域名</param>
/// <param name="defaultDoc">默认文档</param>
/// <param name="pathToRoot">物理路径:d:\\iis\8001</param>
/// <param name="UserId">应用程序池名称,如果没有自动创建</param>
public static int CreateSite(string webSiteName,int siteID, string port, string siteExplain, string defaultDoc, string pathToRoot, string UserId)
{
int mark = 0;
try
{
// createAppPool(siteExplain);
DirectoryEntry de = new DirectoryEntry("IIS://localhost/" + "w3svc"); //从活动目录中获取IIS对象。
object[] prams = new object[2] { "IIsWebServer", siteID };
DirectoryEntry site = (DirectoryEntry)de.Invoke("Create", prams); //创建IISWebServer对象。
site.Properties["KeyType"][0] = "IIsWebServer";
site.Properties["ServerComment"][0] = webSiteName; //站点名称
site.Properties["ServerState"][0] = 2; //站点初始状态,1.停止,2.启动,3
site.Properties["ServerSize"][0] = 1;
site.Properties["ServerBindings"].Add(":" + port + ":" + siteExplain); //站点端口
site.CommitChanges(); //保存改变
de.CommitChanges();
DirectoryEntry root = site.Children.Add("Root", "IIsWebVirtualDir"); //添加虚拟目录对象
root.Invoke("AppCreate", true); //创建IIS应用程序
root.Invoke("AppCreate3", new object[] { 2, UserId, true }); //创建应用程序池,并指定应用程序池为"HostPool","true"表示如果HostPool不存在,则自动创建
root.Properties["path"][0] = pathToRoot; //虚拟目录指向的物理目录
root.Properties["EnableDirBrowsing"][0] = true;//目录浏览
root.Properties["AuthAnonymous"][0] = true;
root.Properties["AccessExecute"][0] = true; //可执行权限
root.Properties["AccessRead"][0] = true;
root.Properties["AccessWrite"][0] = true;
root.Properties["AccessScript"][0] = true;//纯脚本
root.Properties["AccessSource"][0] = false;
root.Properties["FrontPageWeb"][0] = false;
root.Properties["KeyType"][0] = "IIsWebVirtualDir";
root.Properties["AppFriendlyName"][0] = siteExplain; //应用程序名
root.Properties["AppIsolated"][0] = 2;
root.Properties["DefaultDoc"][0] = defaultDoc; //默认文档
root.Properties["EnableDefaultDoc"][0] = true; //是否启用默认文档
root.CommitChanges();
site.CommitChanges();
root.Close();
site.Close();
de.CommitChanges(); //保存
site.Invoke("Start", null); //除了在创建过程中置初始状态外,也可在此调用方法改变状态
mark = 1;
}
catch(Exception ex)
{
mark = 0;
}
return mark;
}
#endregion
#region 删除站点
public static void DelSite(string siteName)
{
string siteNum = GetWebSiteNum(siteName);
string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", "localhost", siteNum);
DirectoryEntry siteEntry = new DirectoryEntry(siteEntPath);
string rootPath = String.Format("IIS://{0}/w3svc", "localhost");
DirectoryEntry rootEntry = new DirectoryEntry(rootPath);
rootEntry.Children.Remove(siteEntry);
rootEntry.CommitChanges();
}
#endregion
#region 域名绑定方法
public static int AddHostHeader(int siteid, string ip, int port, string domain)//增加主机头(站点编号.ip.端口.域名)
{
int mark = 0;
try
{
DirectoryEntry site = new DirectoryEntry("IIS://localhost/W3SVC/" + siteid);
PropertyValueCollection serverBindings = site.Properties["ServerBindings"];
string headerStr = string.Format("{0}:{1}:{2}", ip, port, domain);
if (!serverBindings.Contains(headerStr))
{
serverBindings.Add(headerStr);
}
site.CommitChanges();
mark = 1;
}
catch
{
mark = 0;
}
return mark;
}
#endregion
#region 删除主机头
public static void DeleteHostHeader(int siteid, string ip, int port, string domain)//删除主机头(站点编号.ip.端口.域名)
{
DirectoryEntry site = new DirectoryEntry("IIS://localhost/W3SVC/" + siteid);
PropertyValueCollection serverBindings = site.Properties["ServerBindings"];
string headerStr = string.Format("{0}:{1}:{2}", ip, port, domain);
if (serverBindings.Contains(headerStr))
{
serverBindings.Remove(headerStr);
}
site.CommitChanges();
}
#endregion
#region 创建应用程序池
static void createAppPool(string AppPoolName)
{
DirectoryEntry newpool;
DirectoryEntry apppools = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
newpool = apppools.Children.Add(AppPoolName, "IIsApplicationPool");
newpool.CommitChanges();
}
#endregion
#region 删除应用程序池
public void deleteAppPool(string AppPoolName)
{
bool ExistAppPoolFlag = false;
try
{
DirectoryEntry apppools = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
foreach (DirectoryEntry a in apppools.Children)
{
if (a.Name == AppPoolName)
{
ExistAppPoolFlag = true;
a.DeleteTree();
// MessageBox.Show("应用程序池名称删除成功", "删除成功");
}
}
if (ExistAppPoolFlag == false)
{
// MessageBox.Show("应用程序池未找到", "删除失败");
}
}
catch
{
//MessageBox.Show(ex.Message, "错误");
}
}
#endregion
#region 获取指定网站siteID
/// <summary>
/// 获取指定网站siteID
/// </summary>
/// <param name="siteName">站点名称</param>
/// <returns></returns>
public static string GetWebSiteNum(string siteName)
{
Regex regex = new Regex(siteName);
string tmpStr;
string entPath = String.Format("IIS://{0}/w3svc", "localhost");
DirectoryEntry ent = new DirectoryEntry(entPath);
foreach (DirectoryEntry child in ent.Children)
{
if (child.SchemaClassName == "IIsWebServer")
{
if (child.Properties["ServerBindings"].Value != null)
{
tmpStr = child.Properties["ServerBindings"].Value.ToString();
if (regex.Match(tmpStr).Success)
{
return child.Name;
}
}
if (child.Properties["ServerComment"].Value != null)
{
tmpStr = child.Properties["ServerComment"].Value.ToString();
if (regex.Match(tmpStr).Success)
{
return child.Name;
}
}
}
}
return "没有找到要删除的站点";
}
#endregion
#region 获取IIS站点列表
/// <summary>
/// 获取站点列表
/// </summary>
public static List<IISInfo> GetServerBindings()
{
List<IISInfo> iisList = new List<IISInfo>();
string entPath = "IIS://localhost/w3svc";
DirectoryEntry ent = new DirectoryEntry(entPath);
foreach (DirectoryEntry child in ent.Children)
{
if (child.SchemaClassName.Equals("IIsWebServer", StringComparison.OrdinalIgnoreCase))
{
if (child.Properties["ServerBindings"].Value != null)
{
object objectArr = child.Properties["ServerBindings"].Value;
string serverBindingStr = string.Empty;
if (objectArr is Array)//如果有多个绑定站点时
{
object[] objectToArr = (object[])objectArr;
serverBindingStr = objectToArr[0].ToString();
}
else//只有一个绑定站点
{
serverBindingStr = child.Properties["ServerBindings"].Value.ToString();
}
IISInfo iisInfo = new IISInfo();
iisInfo.DomainPort = serverBindingStr;
iisInfo.AppPool = child.Properties["AppPoolId"].Value.ToString();//应用程序池
iisInfo.ServerComment = child.Properties["ServerComment"].Value.ToString();
iisInfo.physicalPath = GetWebsitePhysicalPath(child);
iisList.Add(iisInfo);
}
}
}
return iisList;
}
#endregion
#region 获取网站的物理路径
/// <summary>
/// 得到网站的物理路径
/// </summary>
/// <param name="rootEntry">网站节点</param>
/// <returns></returns>
public static string GetWebsitePhysicalPath(DirectoryEntry rootEntry)
{
string physicalPath = "";
foreach (DirectoryEntry childEntry in rootEntry.Children)
{
if ((childEntry.SchemaClassName == "IIsWebVirtualDir") && (childEntry.Name.ToLower() == "root"))
{
if (childEntry.Properties["Path"].Value != null)
{
physicalPath = childEntry.Properties["Path"].Value.ToString();
}
else
{
physicalPath = "";
}
}
}
return physicalPath;
}
#endregion
#region 判断端口是否被占用
/// <summary>
/// 判断端口是否被占用
/// </summary>
/// <param name="port">端口号</param>
/// <returns></returns>
public static bool PortInUse(int port)
{
bool inUse = false;
IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] ipEndPoints = ipProperties.GetActiveTcpListeners();
foreach (IPEndPoint endPoint in ipEndPoints)
{
if (endPoint.Port == port)
{
inUse = true;
break;
}
}
return inUse;
}
#endregion
}
}
IISInfo类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AppMain.model
{
public class IISInfo
{
/// <summary>
/// 站点+端口
/// </summary>
public string DomainPort { get; set; }
/// <summary>
/// 应用程序池
/// </summary>
public string AppPool { get; set; }
/// <summary>
/// 网站名称
/// </summary>
public string ServerComment { get; set; }
/// <summary>
/// 物理路径
/// </summary>
public string physicalPath { get; set; }
}
}