C# 操作IIS

using System; 
using System.DirectoryServices; 
using System.Collections; 
using System.Text.RegularExpressions; 
using System.Text; 
/** 
* @author 吴海燕 
* @email wuhy80-usual@yahoo.com 
* 2004-6-25 第一版 
*/ 
namespace Wuhy.ToolBox 
{ 
/// <summary> 
/// 这个类是静态类。用来实现管理IIS的基本操作。 
/// 管理IIS有两种方式,一是ADSI,一是WMI。由于系统限制的原因,只好选择使用ADSI实现功能。 
/// 这是一个遗憾。只有等到只有使用IIS 6的时候,才有可能使用WMI来管理系统 
/// 不过有一个问题就是,我现在也觉得这样的一个方法在本地执行会比较的好。最好不要远程执行。 
/// 因为那样需要占用相当数量的带宽,即使要远程执行,也是推荐在同一个网段里面执行 
/// </summary> 
public class IISAdminLib 
{ 
#region UserName,Password,HostName的定义 
public static string HostName 
{ 
get 
{ 
return hostName; 
} 
set 
{ 
hostName = value; 
} 
} 
public static string UserName 
{ 
get 
{ 
return userName; 
} 
set 
{ 
userName = value; 
} 
} 
public static string Password 
{ 
get 
{ 
return password; 
} 
set 
{ 
if(UserName.Length <= 1) 
{ 
throw new ArgumentException("还没有指定好用户名。请先指定用户名"); 
} 
password = value; 
} 
} 
public static void RemoteConfig(string hostName, string userName, string password) 
{ 
HostName = hostName; 
UserName = userName; 
Password = password; 
} 
private static string hostName = "localhost"; 
private static string userName; 
private static string password; 
#endregion 
#region 根据路径构造Entry的方法 
/// <summary> 
/// 根据是否有用户名来判断是否是远程服务器。 
/// 然后再构造出不同的DirectoryEntry出来 
/// </summary> 
/// <param name="entPath">DirectoryEntry的路径</param> 
/// <returns>返回的是DirectoryEntry实例</returns> 
public static DirectoryEntry GetDirectoryEntry(string entPath) 
{ 
DirectoryEntry ent; 
if(UserName == null) 
{ 
ent = new DirectoryEntry(entPath); 
} 
else 
{ 
// ent = new DirectoryEntry(entPath, HostName+"\\"+UserName, Password, AuthenticationTypes.Secure); 
ent = new DirectoryEntry(entPath, UserName, Password, AuthenticationTypes.Secure); 
} 
return ent; 
} 
#endregion 
#region 添加,删除网站的方法 
/// <summary> 
/// 创建一个新的网站。根据传过来的信息进行配置 
/// </summary> 
/// <param name="siteInfo">存储的是新网站的信息</param> 
public static void CreateNewWebSite(NewWebSiteInfo siteInfo) 
{ 
if(! EnsureNewSiteEnavaible(siteInfo.BindString)) 
{ 
throw new DuplicatedWebSiteException("已经有了这样的网站了。" + Environment.NewLine + siteInfo.BindString); 
} 
string entPath = String.Format("IIS://{0}/w3svc", HostName); 
DirectoryEntry rootEntry = GetDirectoryEntry(entPath); 
string newSiteNum = GetNewWebSiteID(); 
DirectoryEntry newSiteEntry = rootEntry.Children.Add(newSiteNum, "IIsWebServer"); 
newSiteEntry.CommitChanges(); 
newSiteEntry.Properties["ServerBindings"].Value = siteInfo.BindString; 
newSiteEntry.Properties["ServerComment"].Value = siteInfo.CommentOfWebSite; 
newSiteEntry.CommitChanges(); 
DirectoryEntry vdEntry = newSiteEntry.Children.Add("root", "IIsWebVirtualDir"); 
vdEntry.CommitChanges(); 
vdEntry.Properties["Path"].Value = siteInfo.WebPath; 
vdEntry.CommitChanges(); 
} 
/// <summary> 
/// 删除一个网站。根据网站名称删除。 
/// </summary> 
/// <param name="siteName">网站名称</param> 
public static void DeleteWebSiteByName(string siteName) 
{ 
string siteNum = GetWebSiteNum(siteName); 
string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum); 
DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath); 
string rootPath = String.Format("IIS://{0}/w3svc", HostName); 
DirectoryEntry rootEntry = GetDirectoryEntry(rootPath); 
rootEntry.Children.Remove(siteEntry); 
rootEntry.CommitChanges(); 
} 
#endregion 
#region Start和Stop网站的方法 
public static void StartWebSite(string siteName) 
{ 
string siteNum = GetWebSiteNum(siteName); 
string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum); 
DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath); 
siteEntry.Invoke("Start", new object[] {}); 
} 
public static void StopWebSite(string siteName) 
{ 
string siteNum = GetWebSiteNum(siteName); 
string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum); 
DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath); 
siteEntry.Invoke("Stop", new object[] {}); 
} 
#endregion 
#region 确认网站是否相同 
/// <summary> 
/// 确定一个新的网站与现有的网站没有相同的。 
/// 这样防止将非法的数据存放到IIS里面去 
/// </summary> 
/// <param name="bindStr">网站邦定信息</param> 
/// <returns>真为可以创建,假为不可以创建</returns> 
public static bool EnsureNewSiteEnavaible(string bindStr) 
{ 
string entPath = String.Format("IIS://{0}/w3svc", HostName); 
DirectoryEntry ent = GetDirectoryEntry(entPath); 
foreach(DirectoryEntry child in ent.Children) 
{ 
if(child.SchemaClassName == "IIsWebServer") 
{ 
if(child.Properties["ServerBindings"].Value != null) 
{ 
if(child.Properties["ServerBindings"].Value.ToString() == bindStr) 
{ 
return false; 
} 
} 
} 
} 
return true; 
} 
#endregion 
#region 获取一个网站编号的方法 
/// <summary> 
/// 获取一个网站的编号。根据网站的ServerBindings或者ServerComment来确定网站编号 
/// </summary> 
/// <param name="siteName"></param> 
/// <returns>返回网站的编号</returns> 
/// <exception cref="NotFoundWebSiteException">表示没有找到网站</exception> 
public static string GetWebSiteNum(string siteName) 
{ 
Regex regex = new Regex(siteName); 
string tmpStr; 
string entPath = String.Format("IIS://{0}/w3svc", HostName); 
DirectoryEntry ent = GetDirectoryEntry(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; 
} 
} 
} 
} 
throw new NotFoundWebSiteException("没有找到我们想要的站点" + siteName); 
} 
#endregion 
#region 获取新网站id的方法 
/// <summary> 
/// 获取网站系统里面可以使用的最小的ID。 
/// 这是因为每个网站都需要有一个唯一的编号,而且这个编号越小越好。 
/// 这里面的算法经过了测试是没有问题的。 
/// </summary> 
/// <returns>最小的id</returns> 
public static string GetNewWebSiteID() 
{ 
ArrayList list = new ArrayList(); 
string tmpStr; 
string entPath = String.Format("IIS://{0}/w3svc", HostName); 
DirectoryEntry ent = GetDirectoryEntry(entPath); 
foreach(DirectoryEntry child in ent.Children) 
{ 
if(child.SchemaClassName == "IIsWebServer") 
{ 
tmpStr = child.Name.ToString(); 
list.Add(Convert.ToInt32(tmpStr)); 
} 
} 
list.Sort(); 
int i = 1; 
foreach(int j in list) 
{ 
if(i == j) 
{ 
i++; 
} 
} 
return i.ToString(); 
} 
#endregion 
} 
#region 新网站信息结构体 
public struct NewWebSiteInfo 
{ 
private string hostIP; // The Hosts IP Address 
private string portNum; // The New Web Sites Port.generally is "80" 
private string descOfWebSite; // 网站表示。一般为网站的网站名。例如"www.dns.com.cn" 
private string commentOfWebSite;// 网站注释。一般也为网站的网站名。 
private string webPath; // 网站的主目录。例如"e:\tmp" 
public NewWebSiteInfo(string hostIP, string portNum, string descOfWebSite, string commentOfWebSite, string webPath) 
{ 
this.hostIP = hostIP; 
this.portNum = portNum; 
this.descOfWebSite = descOfWebSite; 
this.commentOfWebSite = commentOfWebSite; 
this.webPath = webPath; 
} 
public string BindString 
{ 
get 
{ 
return String.Format("{0}:{1}:{2}", hostIP, portNum, descOfWebSite); 
} 
} 
public string CommentOfWebSite 
{ 
get 
{ 
return commentOfWebSite; 
} 
} 
public string WebPath 
{ 
get 
{ 
return webPath; 
} 
} 
} 
#endregion 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值