用C#操纵IIS(代码)

时间:2021-05-19

usingSystem;
usingSystem.DirectoryServices;
usingSystem.Collections;
usingSystem.Text.RegularExpressions;
usingSystem.Text;
/**
*@author吴海燕
*@emailwuhy80-usual@yahoo.com
*2004-6-25第一版
*/
namespaceWuhy.ToolBox
{
///<summary>
///这个类是静态类。用来实现管理IIS的基本操作。
///管理IIS有两种方式,一是ADSI,一是WMI。由于系统限制的原因,只好选择使用ADSI实现功能。
///这是一个遗憾。只有等到只有使用IIS6的时候,才有可能使用WMI来管理系统
///不过有一个问题就是,我现在也觉得这样的一个方法在本地执行会比较的好。最好不要远程执行。
///因为那样需要占用相当数量的带宽,即使要远程执行,也是推荐在同一个网段里面执行
///</summary>
publicclassIISAdminLib
{
#regionUserName,Password,HostName的定义
publicstaticstringHostName
{
get
{
returnhostName;
}
set
{
hostName=value;
}
}
publicstaticstringUserName
{
get
{
returnuserName;
}
set
{
userName=value;
}
}
publicstaticstringPassword
{
get
{
returnpassword;
}
set
{
if(UserName.Length<=1)
{
thrownewArgumentException("还没有指定好用户名。请先指定用户名");
}
password=value;
}
}
publicstaticvoidRemoteConfig(stringhostName,stringuserName,stringpassword)
{
HostName=hostName;
UserName=userName;
Password=password;
}
privatestaticstringhostName="localhost";
privatestaticstringuserName;
privatestaticstringpassword;
#endregion
#region根据路径构造Entry的方法
///<summary>
///根据是否有用户名来判断是否是远程服务器。
///然后再构造出不同的DirectoryEntry出来
///</summary>
///<paramname="entPath">DirectoryEntry的路径</param>
///<returns>返回的是DirectoryEntry实例</returns>
publicstaticDirectoryEntryGetDirectoryEntry(stringentPath)
{
DirectoryEntryent;
if(UserName==null)
{
ent=newDirectoryEntry(entPath);
}
else
{
//ent=newDirectoryEntry(entPath,HostName+"\\"+UserName,Password,AuthenticationTypes.Secure);
ent=newDirectoryEntry(entPath,UserName,Password,AuthenticationTypes.Secure);
}
returnent;
}
#endregion
#region添加,删除网站的方法
///<summary>
///创建一个新的网站。根据传过来的信息进行配置
///</summary>
///<paramname="siteInfo">存储的是新网站的信息</param>
publicstaticvoidCreateNewWebSite(NewWebSiteInfositeInfo)
{
if(!EnsureNewSiteEnavaible(siteInfo.BindString))
{
thrownewDuplicatedWebSiteException("已经有了这样的网站了。"+Environment.NewLine+siteInfo.BindString);
}
stringentPath=String.Format("IIS://{0}/w3svc",HostName);
DirectoryEntryrootEntry=GetDirectoryEntry(entPath);
stringnewSiteNum=GetNewWebSiteID();
DirectoryEntrynewSiteEntry=rootEntry.Children.Add(newSiteNum,"IIsWebServer");
newSiteEntry.CommitChanges();
newSiteEntry.Properties["ServerBindings"].Value=siteInfo.BindString;
newSiteEntry.Properties["ServerComment"].Value=siteInfo.CommentOfWebSite;
newSiteEntry.CommitChanges();
DirectoryEntryvdEntry=newSiteEntry.Children.Add("root","IIsWebVirtualDir");
vdEntry.CommitChanges();
vdEntry.Properties["Path"].Value=siteInfo.WebPath;
vdEntry.CommitChanges();
}
///<summary>
///删除一个网站。根据网站名称删除。
///</summary>
///<paramname="siteName">网站名称</param>
publicstaticvoidDeleteWebSiteByName(stringsiteName)
{
stringsiteNum=GetWebSiteNum(siteName);
stringsiteEntPath=String.Format("IIS://{0}/w3svc/{1}",HostName,siteNum);
DirectoryEntrysiteEntry=GetDirectoryEntry(siteEntPath);
stringrootPath=String.Format("IIS://{0}/w3svc",HostName);
DirectoryEntryrootEntry=GetDirectoryEntry(rootPath);
rootEntry.Children.Remove(siteEntry);
rootEntry.CommitChanges();
}
#endregion
#regionStart和Stop网站的方法
publicstaticvoidStartWebSite(stringsiteName)
{
stringsiteNum=GetWebSiteNum(siteName);
stringsiteEntPath=String.Format("IIS://{0}/w3svc/{1}",HostName,siteNum);
DirectoryEntrysiteEntry=GetDirectoryEntry(siteEntPath);
siteEntry.Invoke("Start",newobject[]{});
}
publicstaticvoidStopWebSite(stringsiteName)
{
stringsiteNum=GetWebSiteNum(siteName);
stringsiteEntPath=String.Format("IIS://{0}/w3svc/{1}",HostName,siteNum);
DirectoryEntrysiteEntry=GetDirectoryEntry(siteEntPath);
siteEntry.Invoke("Stop",newobject[]{});
}
#endregion
#region确认网站是否相同
///<summary>
///确定一个新的网站与现有的网站没有相同的。
///这样防止将非法的数据存放到IIS里面去
///</summary>
///<paramname="bindStr">网站邦定信息</param>
///<returns>真为可以创建,假为不可以创建</returns>
publicstaticboolEnsureNewSiteEnavaible(stringbindStr)
{
stringentPath=String.Format("IIS://{0}/w3svc",HostName);
DirectoryEntryent=GetDirectoryEntry(entPath);
foreach(DirectoryEntrychildinent.Children)
{
if(child.SchemaClassName=="IIsWebServer")
{
if(child.Properties["ServerBindings"].Value!=null)
{
if(child.Properties["ServerBindings"].Value.ToString()==bindStr)
{
returnfalse;
}
}
}
}
returntrue;
}
#endregion
#region获取一个网站编号的方法
///<summary>
///获取一个网站的编号。根据网站的ServerBindings或者ServerComment来确定网站编号
///</summary>
///<paramname="siteName"></param>
///<returns>返回网站的编号</returns>
///<exceptioncref="NotFoundWebSiteException">表示没有找到网站</exception>
publicstaticstringGetWebSiteNum(stringsiteName)
{
Regexregex=newRegex(siteName);
stringtmpStr;
stringentPath=String.Format("IIS://{0}/w3svc",HostName);
DirectoryEntryent=GetDirectoryEntry(entPath);
foreach(DirectoryEntrychildinent.Children)
{
if(child.SchemaClassName=="IIsWebServer")
{
if(child.Properties["ServerBindings"].Value!=null)
{
tmpStr=child.Properties["ServerBindings"].Value.ToString();
if(regex.Match(tmpStr).Success)
{
returnchild.Name;
}
}
if(child.Properties["ServerComment"].Value!=null)
{
tmpStr=child.Properties["ServerComment"].Value.ToString();
if(regex.Match(tmpStr).Success)
{
returnchild.Name;
}
}
}
}
thrownewNotFoundWebSiteException("没有找到我们想要的站点"+siteName);
}
#endregion
#region获取新网站id的方法
///<summary>
///获取网站系统里面可以使用的最小的ID。
///这是因为每个网站都需要有一个唯一的编号,而且这个编号越小越好。
///这里面的算法经过了测试是没有问题的。
///</summary>
///<returns>最小的id</returns>
publicstaticstringGetNewWebSiteID()
{
ArrayListlist=newArrayList();
stringtmpStr;
stringentPath=String.Format("IIS://{0}/w3svc",HostName);
DirectoryEntryent=GetDirectoryEntry(entPath);
foreach(DirectoryEntrychildinent.Children)
{
if(child.SchemaClassName=="IIsWebServer")
{
tmpStr=child.Name.ToString();
list.Add(Convert.ToInt32(tmpStr));
}
}
list.Sort();
inti=1;
foreach(intjinlist)
{
if(i==j)
{
i++;
}
}
returni.ToString();
}
#endregion
}
#region新网站信息结构体
publicstructNewWebSiteInfo
{
privatestringhostIP;//TheHostsIPAddress
privatestringportNum;//TheNewWebSitesPort.generallyis"80"
privatestringdescOfWebSite;//网站表示。一般为网站的网站名。例如"mentOfWebSite;
}
}
publicstringWebPath
{
get
{
returnwebPath;
}
}
}
#endregion
}

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章