IIS站点管理类

轉自:http://www.netfocus.cn/peoplearticle942.html

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.DirectoryServices;
using  System.Text.RegularExpressions;
using  System.Collections;

namespace  IISControlService
{
    
/**/ ///   <summary>
    
///  这个类是静态类。用来实现管理IIS的基本操作。
    
///   </summary>
     public   class  IISManager
    {
        
#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   string  CreateNewWebSite(NewWebSiteInfo siteInfo)
        {
            
if  ( ! EnsureNewSiteEnavaible(siteInfo.BindString))
            {
                
throw   new  SiteExistException( " 已经有了这样的网站了。 "   +  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();

            
// 设置站点IP地址、端口、主机头
            newSiteEntry.Properties[ " ServerBindings " ].Value  =  siteInfo.BindString;
            
// 设置站点名称
            newSiteEntry.Properties[ " ServerComment " ].Value  =  siteInfo.CommentOfWebSite;
            
// 设置站点的访问权限
            newSiteEntry.Properties[ " AccessFlags " ].Value  =   512   |   1 ;
            newSiteEntry.CommitChanges();

            DirectoryEntry vdEntry 
=  newSiteEntry.Children.Add( " root " " IIsWebVirtualDir " );
            vdEntry.CommitChanges();

            
// 创建应用程序,并指定应用程序池为"HostPool","true"表示如果HostPool不存在,则自动创建
            vdEntry.Invoke( " AppCreate3 " new   object []{  2 " HostPool " true  });
            vdEntry.Properties[
" Path " ].Value  =  siteInfo.WebPath;
            
// 设置应用程序名称
            vdEntry.Properties[ " AppFriendlyName " ].Value  =   " HostCreator " ;
            vdEntry.CommitChanges();

            
return  newSiteNum;
        }

        
/**/ ///   <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  Exception( " 没有找到我们想要的站点 "   +  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

    
public   class  SiteExistException : Exception
    {
        
public  SiteExistException( string  message) :  base (message) { }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值