`
hugh-lin
  • 浏览: 73426 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

[转]IIS站点管理类

阅读更多
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) { }
    }
}
分享到:
评论

相关推荐

    IIS站点流量统计,查看站点外发数据包

    这对于多站点管理尤其有用,能帮助确定资源分配的优先级。 在提供的压缩包文件列表中,"IISInfoView.exe"可能是一个专用的IIS信息查看工具,它可以提取并显示IIS服务器的各种详细信息,包括但不限于站点设置、应用...

    IIS管理类-创建站点、虚拟目录,删除虚拟目录

    本篇文章将详细探讨如何使用IIS管理类来创建站点、虚拟目录以及删除虚拟目录。 一、创建IIS站点 创建IIS站点是为Web服务分配一个特定的标识,通常包括一个主机头名称、IP地址和端口号。以下是一步一步创建IIS站点...

    C#创建IIS站点,C#在2003系统创建站点

    这通常涉及到使用System.DirectoryServices和System.DirectoryServices.AccountManagement命名空间中的类,如DirectoryEntry和DirectorySearcher,它们允许我们以编程方式操作Active Directory服务,包括管理IIS站点...

    iis站点和目录备份工具

    **IIS站点与目录备份工具详解** 在IT行业中,IIS(Internet Information Services)是微软提供的一个用于Windows操作系统的Web服务器软件,它允许我们在本地或远程服务器上托管各种Web应用程序和服务。IIS站点备份...

    IIS多站点_C#_iis_多站点源码_

    总的来说,IIS多站点管理系统源码展示了如何利用C#和IIS管理API来高效地管理和控制Web服务器上的多站点环境,提供了一个方便的工具,使得系统管理员无需手动操作IIS管理控制台即可完成常见任务。

    IIS控制类,操作IIS管理类

    生成一个新的IIS站点是通过ServerManager类的CreateSite方法实现的。首先,你需要指定新站点的名称、绑定信息(包括IP地址、端口和主机头)以及物理路径。例如: ```csharp ServerManager iisManager = new Server...

    易语言枚举IIS站点模块

    通过掌握这些,你就能编写出枚举IIS站点模块的易语言程序,实现对IIS服务器的有效管理和监控。 请注意,进行此类操作时,确保你有适当的权限,并遵循安全编程原则,以防止潜在的安全风险。同时,由于易语言的动态...

    易语言IIS创建站点模块例程

    5. **文件系统操作**:创建IIS站点通常涉及配置文件的读写,如`web.config`或`applicationHost.config`。开发者需要熟悉易语言的文件操作命令,如打开、读取、写入和关闭文件。 6. **错误处理和调试**:编写这类...

    IIS站点备份还原双模式

    在实际操作中,使用HDIISBackup这样的工具可以显著提高IIS站点管理的效率,简化备份和恢复流程,从而降低IT人员的工作负担。对于任何IIS管理员来说,了解并掌握这样的工具是提高工作效率和保障服务稳定性的必备技能...

    .NET2008实现,动态创建IIS站点

    在.NET 2008框架下,动态创建IIS...总结,动态创建IIS站点是.NET 2008框架下的一项核心功能,主要通过DirectoryEntry类和其Properties属性来实现。了解和掌握这项技术,对于提升开发效率和管理水平具有重要意义。

    易语言源码易语言IIS创建站点模块例程源码.rar

    通过编写IIS创建站点的程序,我们可以实现自动化创建和管理IIS站点,提高工作效率。 易语言IIS创建站点的模块通常会涉及以下几个关键知识点: 1. **IIS管理对象**:在易语言中,需要通过调用Windows API或者使用...

    用C#在IIS中创建一个Web站点源代码

    首先,要使用C#与IIS进行交互,我们需要引用`System.Web.Administration`命名空间,这个命名空间包含了管理IIS所需的各种类。通过`ServerManager`类,我们可以读取、创建、修改和删除IIS的配置信息。 以下是一个...

    zz.IIsAdmin.rar_C# IIS_IIS管理_csharp iis_iis_zz.IISADMIN

    这个项目可能包含了一个用户友好的界面,允许用户直观地管理IIS站点和服务,同时也可能提供了命令行工具供自动化脚本使用。 5. **API使用示例**:例如,创建一个新的IIS站点可以这样实现: ```csharp ...

    e语言-易语言IIS站点流量查看

    《易语言IIS站点流量查看》 在信息技术领域,服务器管理是至关重要的环节,而IIS...通过掌握以上知识点,开发者不仅可以实现IIS站点流量查看,还可以进一步开发出更多针对服务器管理的实用工具,提升运维效率。

    直接通过右键某个文件夹来建立IIS站点,快速建IIS站巨酷

    2. **站点创建**:传统方式下,创建IIS站点需要在IIS管理器中手动配置,包括设置站点名称、绑定(IP地址、端口号和主机头)、应用程序池以及物理路径等。而“右键建站”工具则自动完成这些步骤,大大提高了效率。 3...

    C# 自动安装IIS,以及创建网站

    总结起来,使用C#自动化安装IIS并创建网站涉及对Windows管理接口的理解,特别是PowerShell的使用。通过这个过程,我们可以提高部署效率,减少手动设置的工作量,特别是在大规模部署或持续集成的场景下。

    C#实现获取IIS站点及虚拟目录信息的方法

    通过检查每个子项的`SchemaClassName`属性,我们可以判断其是否为"IIsWebServer",即IIS站点。 对于每个IIS站点,我们打印出站点的名称、物理路径和`ServerBindings`属性。`ServerBindings`包含站点的IP地址、端口...

    易语言IIS站点流量查看源码.zip

    【标题】中的“易语言IIS站点流量查看源码”表明了这个压缩包包含的是用易语言编写的一个程序,该程序能够用来监控和查看Internet Information Services(IIS)服务器上的站点流量情况。易语言是中国本土开发的一种...

    IIS Log处理工具

    "IIS Location"指的是IIS站点的位置,即IIS服务正在监听并服务请求的网络位置,这可能是通过HTTP、HTTPS等协议。在进行日志管理时,了解站点位置有助于确定哪些日志需要被处理。 "Log Tool"则直指该软件的主要功能...

    IIS管理API-MWA的使用

    `Microsoft.Web.Administration`库是IIS管理API的核心,包含一系列类,每个类都代表IIS中的一个特定实体,如`ServerManager`、`Site`、`Application`、`VirtualDirectory`等。以下是一些主要类的简要说明: 1. **...

Global site tag (gtag.js) - Google Analytics