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

}

另一种办法:

IISServerState
using System;
using System.DirectoryServices;
using System.Collections;

namespace OPS.Component
{
    /** <summary>
    /// IISWebServer的状态
    /// </summary>
    public enum IISServerState
    {
        /** <summary>
        /// 
        /// </summary>
        Starting = 1,
        /** <summary>
        /// 
        /// </summary>
        Started = 2,
        /** <summary>
        /// 
        /// </summary>
        Stopping = 3,
        /** <summary>
        /// 
        /// </summary>
        Stopped = 4,
        /** <summary>
        /// 
        /// </summary>
        Pausing = 5,
        /** <summary>
        /// 
        /// </summary>
        Paused = 6,
        /** <summary>
        /// 
        /// </summary>
        Continuing = 7
    }
}
IISWebServer
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

using System.DirectoryServices;

namespace OPS.Component
{
    /**//// <summary>
    /// IISWebServer
    /// </summary>
    public class IISWebServer
    {
        /**//**/
        /**//// <summary>
        /// 
        /// </summary>
        internal int index = -1;
        /**//**/
        /**//// <summary>
        /// 
        /// </summary>
        public IISWebVirtualDirCollection WebVirtualDirs;
        /**//**/
        /**//// <summary>
        /// 网站说明
        /// </summary>
        public string ServerComment = "Way";
        /**//**/
        /**//// <summary>
        /// 脚本支持
        /// </summary>
        public bool AccessScript = true;
        /**//**/
        /**//// <summary>
        /// 读取
        /// </summary>
        public bool AccessRead = true;
        /**//**/
        /**//// <summary>
        /// 物理路径
        /// </summary>
        public string Path = @"c:/";
        /**//**/
        /**//// <summary>
        /// 端口
        /// </summary>
        public int Port = 80;
        /**//**/
        /**//// <summary>
        /// 目录浏览
        /// </summary>
        public bool EnableDirBrowsing = false;
        /**//**/
        /**//// <summary>
        /// 默认文档
        /// </summary>
        public string DefaultDoc = "index.aspx";
        /**//**/
        /**//// <summary>
        /// 使用默认文档
        /// </summary>
        public bool EnableDefaultDoc = true;

        /**//**/
        /**//// <summary>
        /// IISWebServer的状态
        /// </summary>
        public IISServerState ServerState
        {
            get
            {
                DirectoryEntry server = IISManagement.returnIISWebserver(this.index);
                if (server == null)
                    throw (new Exception("找不到此IISWebServer"));
                switch (server.Properties["ServerState"][0].ToString())
                {
                    case "2":
                        return IISServerState.Started;
                    case "4":
                        return IISServerState.Stopped;
                    case "6":
                        return IISServerState.Paused;
                }
                return IISServerState.Stopped;
            }
        }

        /**//**/
        /**//// <summary>
        /// 停止IISWebServer
        /// </summary>
        public void Stop()
        {
            DirectoryEntry Server;
            if (index == -1)
                throw (new Exception("在IIS找不到此IISWebServer!"));
            try
            {
                Server = new DirectoryEntry("IIS://" + IISManagement.Machinename + "/W3SVC/" + index);
                if (Server != null)
                    Server.Invoke("stop", new object[0]);
                else
                    throw (new Exception("在IIS找不到此IISWebServer!"));
            }
            catch
            {
                throw (new Exception("在IIS找不到此IISWebServer!"));
            }
        }

        /**//**/
        /**//// <summary>
        /// 把基本信息的更改更新到IIS
        /// </summary>
        public void CommitChanges()
        {
            IISManagement.EditIISWebServer(this);
        }

        /**//**/
        /**//// <summary>
        /// 启动IISWebServer
        /// </summary>
        public void Start()
        {
            if (index == -1)
                throw (new Exception("在IIS找不到此IISWebServer!"));

            DirectoryEntry Service = new DirectoryEntry("IIS://" + IISManagement.Machinename + "/W3SVC");
            DirectoryEntry Server;
            IEnumerator ie = Service.Children.GetEnumerator();

            while (ie.MoveNext())
            {
                Server = (DirectoryEntry)ie.Current;
                if (Server.SchemaClassName == "IIsWebServer")
                {
                    if (Server.Properties["Serverbindings"][0].ToString() == ":" + this.Port + ":")
                    {
                        Server.Invoke("stop", new object[0]);
                    }
                }
            }

            try
            {
                Server = new DirectoryEntry("IIS://" + IISManagement.Machinename + "/W3SVC/" + index);
                if (Server != null)
                    Server.Invoke("start", new object[0]);
                else
                    throw (new Exception("在IIS找不到此IISWebServer!"));
            }
            catch
            {
                throw (new Exception("在IIS找不到此IISWebServer!"));
            }
        }

        /**//**/
        /**//// <summary>
        /// 
        /// </summary>
        public IISWebServer()
        {
            WebVirtualDirs = new IISWebVirtualDirCollection(this);
        }
    }
}
IISWebServerCollection
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace OPS.Component
{
    /**//// <summary>
    /// IISWebServerCollection 
    /// </summary>
    public class IISWebServerCollection : CollectionBase
    {
        /**//// <summary>
        /// 
        /// </summary>
        public IISWebServer this[int Index]
        {
            get
            {
                return (IISWebServer)this.List[Index];

            }
        }

        /**//**/
        /**//// <summary>
        /// 
        /// </summary>
        public IISWebServer this[string ServerComment]
        {
            get
            {
                ServerComment = ServerComment.ToLower().Trim();
                IISWebServer list;
                for (int i = 0; i < this.List.Count; i++)
                {
                    list = (IISWebServer)this.List[i];
                    if (list.ServerComment.ToLower().Trim() == ServerComment)
                        return list;
                }
                return null;
            }
        }

        internal void Add_(IISWebServer WebServer)
        {
            this.List.Add(WebServer);
        }

        /**//**/
        /**//// <summary>
        /// 
        /// </summary>
        /// <param name="WebServer"></param>
        public void Add(IISWebServer WebServer)
        {
            try
            {
                this.List.Add(WebServer);
                IISManagement.CreateIISWebServer(WebServer);
            }
            catch
            {
                throw (new Exception("发生意外错误,可能是某节点将该节点的上级节点作为它自己的子级插入"));
            }

        }

        /**//**/
        /**//// <summary>
        /// 是否包含指定的网站
        /// </summary>
        /// <param name="ServerComment"></param>
        /// <returns></returns>
        public bool Contains(string ServerComment)
        {
            ServerComment = ServerComment.ToLower().Trim();
            for (int i = 0; i < this.List.Count; i++)
            {
                IISWebServer server = this[i];
                if (server.ServerComment.ToLower().Trim() == ServerComment)
                    return true;
            }
            return false;
        }

        /**//**/
        /**//// <summary>
        /// 是否包含指定的网站
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public bool Contains(int index)
        {
            for (int i = 0; i < this.List.Count; i++)
            {
                IISWebServer server = this[i];
                if (server.index == index)
                    return true;
            }
            return false;
        }

        /**//**/
        /**//// <summary>
        /// 
        /// </summary>
        /// <param name="WebServers"></param>
        public void AddRange(IISWebServer[] WebServers)
        {
            for (int i = 0; i <= WebServers.GetUpperBound(0); i++)
            {
                Add(WebServers[i]);
            }
        }

        /**//**/
        /**//// <summary>
        /// 
        /// </summary>
        /// <param name="WebServer"></param>
        public void Remove(IISWebServer WebServer)
        {
            for (int i = 0; i < this.List.Count; i++)
            {
                if ((IISWebServer)this.List[i] == WebServer)
                {
                    this.List.RemoveAt(i);
                    return;
                }
            }
            IISManagement.RemoveIISWebServer(WebServer.index);
        }
    }
}
IISWebVirtualDir
using System;
using System.Collections.Generic;
using System.Text;

namespace OPS.Component
{
    /**//// <summary>
    /// IISWebVirtualDir
    /// </summary>
    public class IISWebVirtualDir
    {
        /**//**/
        /**//// <summary>
        /// 
        /// </summary>
        public IISWebServer Parent = null;
        /**//**/
        /**//// <summary>
        /// 虚拟目录

C#操作IIS的代码相关推荐

  1. C#中操作IIS 7.0

    C#中操作IIS 7.0 作者:Jaxu 出处:博客园  2009-3-26 10:17:52 阅读 53  次 <script type="text/javascript" ...

  2. C#操作IIS程序池及站点的创建配置(转)

    C#操作IIS程序池及站点的创建配置(转) 原文:http://www.cnblogs.com/wujy/archive/2013/02/28/2937667.html 最近在做一个WEB程序的安装包 ...

  3. C#操作IIS创建应用程序池出现异常:无效索引(Exception from HRESULT:0x80070585)

    在使用C#操作IIS创建应用程序池出现异常:无效索引(Exception from HRESULT:0x80070585) 相关代码: public static string CreateAppPo ...

  4. 30 个 php 操作 redis 常用方法代码例子

    这篇文章主要介绍了 30 个 php 操作 redis 常用方法代码例子 , 本文其实不止 30 个方法 , 可以操作 string 类 型. list 类型和 set 类型的数据 , 需要的朋友可以 ...

  5. python怎么保存文件代码_Python文件读写保存操作的实现代码

    本篇文章给大家带来的内容是关于Python文件读写保存操作的实现代码 ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 记录下第一次使用Python读写文件的过程,虽然很简单,第一次实 ...

  6. php django mysql配置文件_Mysql学习Django+mysql配置与简单操作数据库实例代码

    <Mysql学习Django+mysql配置与简单操作数据库实例代码>要点: 本文介绍了Mysql学习Django+mysql配置与简单操作数据库实例代码,希望对您有用.如果有疑问,可以联 ...

  7. 无法执行添加/移除操作,因为代码元素**是只读的

    在vs中,大量添加窗体或者控件后,发现无法由系统IDE自动生成代码,如自动添加按钮响应函数等,rc管理器界面双击按钮添加函数,会出现 提示框 "无法执行添加/移除操作,因为代码元素**是只读 ...

  8. Net中如何操作IIS

    Net中实际上已经为我们在这方面做得很好了.FCL中提供了不少的类来帮助我们完成这项工作,让我们的开发工作变非常简单和快乐.编程控制IIS实际上很简单,和ASP一样,.Net中需要使用ADSI来操作I ...

  9. C#和C常用的API操作窗口的代码积累

    C#和C常用的API操作窗口的代码积累 IntPtr awin = MouseHookHelper.FindWindow("WeChatMainWndForPC", "微 ...

最新文章

  1. packettotal.com - PacketTotal - A Free Online PCAP Analysis Engine
  2. sqlmap代理池_sqlmap +外部代理池绕过IP拦截
  3. 使用nginx负载均衡的webservice wsdl访问不到_面试官:关于负载均衡你了解多少
  4. Oracle 多行、多列子查询
  5. HTML5营销代理商设计机构网站模板
  6. jtextarea可以让某一行右对齐吗_单元格对齐还在敲空格吗?几个简单小技巧要学会...
  7. 树莓派 口罩识别 python_RaspberryPi上实现佩戴口罩识别——2020电赛F题小记
  8. IIS Express加入MIME映射
  9. IDEA设置字体大小没反应解决
  10. 5. find操作详解
  11. deepin升级Linux内核,深度 deepin 20.1 (1005)系统开启内测:升级至 Linux Kernel 5.8 稳定内核...
  12. 一年中所有节日的排列顺序_我国一年中的传统节日。(按顺序)
  13. 笑来就是个鸡汤写手啊!
  14. when I want to have a rest
  15. 儿童定位手表、定位器、老人健康手表的工作原理
  16. 校园网dns服务器可以自动么,校园网应有自己的DNS服务
  17. 谈谈红楼梦(第1-5回)
  18. 怎么制作一张5M以上的大图片
  19. 无线物联网技术,在智能门禁系统的应用
  20. 如何查询MySQL表中的数据,这些操作你得明白!

热门文章

  1. oracle ora 00910,ORA-00910: 指定的长度对于数据类型而言过长
  2. 笔记本安装安卓4.2系统尝试
  3. STM32控制编码器电机实现【速度闭环控制】与【位置闭环控制】
  4. 请问哪些CE认证必须要欧盟NB机构发证?
  5. ArchLinux+Win10安装美化及一些常用(装逼神器)软件安装记
  6. 在PHP中使用Mockery进行测试驱动开发(TDD) - 上
  7. 美国大学计算机科学博士生排名,2021美国大学本科计算机专业(高学位博士)排名...
  8. Fight Over Ringtone Firm Heats Up
  9. UVM TLM2: SystemC和SV 通信
  10. uniapp封装ajax请求