C#對IIS進行操作的代碼

wen5 9年前發布 | 2K 次閱讀 C#

這段代碼是一個IIS操作類,可以最IIS進行站點的添加、刪除、修改等操作

//IISHelper.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.DirectoryServices; using System.Security.Principal; using System.Runtime.InteropServices; using System.Data; using System.Configuration; using System.Web;

namespace IIS_BatchOperate { public class IISHelper {

    #region 臨時模擬IIS管理員用戶

    public const int LOGON32_LOGON_INTERACTIVE = 2;
    public const int LOGON32_PROVIDER_DEFAULT = 0;

    static WindowsImpersonationContext impersonationContext;

    [DllImport("advapi32.dll")]
    public static extern int LogonUserA(String lpszUserName,
        String lpszDomain,
        String lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        ref IntPtr phToken);
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int DuplicateToken(IntPtr hToken,
        int impersonationLevel,
        ref IntPtr hNewToken);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool RevertToSelf();

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern bool CloseHandle(IntPtr handle);

    /// <summary>
    ///
    /// </summary>
    /// <param name="userName"></param>
    /// <param name="domain"></param>
    /// <param name="password"></param>
    /// <returns></returns>
    private static bool impersonateValidUser(String userName)
    {
        string domain = "administrator";
        string password = "123";
        WindowsIdentity tempWindowsIdentity;
        IntPtr token = IntPtr.Zero;
        IntPtr tokenDuplicate = IntPtr.Zero;

        if (RevertToSelf())
        {
            if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
                LOGON32_PROVIDER_DEFAULT, ref token) != 0)
            {
                if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                {
                    tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                    impersonationContext = tempWindowsIdentity.Impersonate();
                    if (impersonationContext != null)
                    {
                        CloseHandle(token);
                        CloseHandle(tokenDuplicate);
                        return true;
                    }
                }
            }
        }
        if (token != IntPtr.Zero)
            CloseHandle(token);
        if (tokenDuplicate != IntPtr.Zero)
            CloseHandle(tokenDuplicate);
        return false;
    }

    /// <summary>
    /// 撤消模擬
    /// </summary>
    private static void undoImpersonation()
    {
        impersonationContext.Undo();
    }

    #endregion


    /// <summary>
    /// 獲取一個網站的編號。根據網站的ServerBindings或者ServerComment來確定網站編號
    /// </summary>
    /// <param name="serverName">服務器名稱(默認為localhost,可以為IP地址)</param>
    /// <param name="siteName">站點名稱</param>
    /// <returns>返回網站的編號</returns>
    private static int GetWebSiteID(string serverName, string siteName)
    {
        int siteID = -1;

        Regex regex = new Regex(siteName);

        if (serverName.Length < 1)
            serverName = "localhost";

        string tmpStr;
        string entPath = String.Format("IIS://{0}/w3svc", serverName);
        DirectoryEntry ent = new DirectoryEntry(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)
                    {
                        siteID = int.Parse(child.Name);
                        break;
                    }
                }
                if (child.Properties["ServerComment"].Value != null)
                {
                    tmpStr = child.Properties["ServerComment"].Value.ToString();
                    if (regex.Match(tmpStr).Success)
                    {
                        siteID = int.Parse(child.Name);
                        break;
                    }
                }
            }
        }
        return siteID;
    }

    /// <summary>
    /// 添加域名綁定
    /// </summary>
    /// <param name="siteName">站點名稱</param>
    /// <param name="ip">ip</param>
    /// <param name="port">端口</param>
    /// <param name="domain">域名</param>
    public static void AddHostHeader(string siteName, string ip, int port, string domain)
    {
        AddHostHeader("localhost", siteName, ip, port, domain);
    }

    /// <summary>
    /// 添加域名綁定
    /// </summary>
    /// <param name="serverName">服務器名稱</param>
    /// <param name="siteName">站點名稱</param>
    /// <param name="ip">ip</param>
    /// <param name="port">端口</param>
    /// <param name="domain">域名</param>
    public static void AddHostHeader(string serverName, string siteName, string ip, int port, string domain)
    {
        if (impersonateValidUser("dsiis"))
        {
            //Insert your code that runs under the security context of a specific user here.
            int siteID = GetWebSiteID(serverName, siteName);
            if (siteID < 1)
                siteID = 1;

            AddHostHeader(serverName, siteID, ip, port, domain);

            undoImpersonation();
        }
        else
        {
            //"臨時模擬IIS管理員用戶"失敗;
        }
    }

    /// <summary>
    /// 添加域名綁定
    /// </summary>
    /// <param name="serverName">服務器名稱</param>
    /// <param name="siteid">站點編號</param>
    /// <param name="ip">ip</param>
    /// <param name="port">端口</param>
    /// <param name="domain">域名</param>
    public static void AddHostHeader(string serverName, int siteid, string ip, int port, string domain)
    {
        DirectoryEntry site = new DirectoryEntry("IIS://" + serverName + "/W3SVC/" + siteid);
        PropertyValueCollection serverBindings = site.Properties["ServerBindings"];
        string headerStr = string.Format("{0}:{1}:{2}", ip, port, domain);
        if (!serverBindings.Contains(headerStr))
        {
            serverBindings.Add(headerStr);
        }
        //默認情況下,對緩存進行本地更改。修改或添加節點之后,
        //必須調用 CommitChanges 方法,以便提交更改,將它們保存到樹中。
        //如果在調用 CommitChanges 之前調用 RefreshCache,則將丟失對屬性緩存的任何未提交的更改。
        site.CommitChanges();
    }

    /// <summary>
    /// 刪除域名綁定
    /// </summary>
    /// <param name="siteName">站點名稱</param>
    /// <param name="ip">ip</param>
    /// <param name="port">端口</param>
    /// <param name="domain">域名</param>
    public static void DeleteHostHeader(string siteName, string ip, int port, string domain)
    {
        DeleteHostHeader("localhost", siteName, ip, port, domain);
    }

    /// <summary>
    /// 刪除域名綁定
    /// </summary>
    /// <param name="serverName">服務器名稱</param>
    /// <param name="siteName">站點名稱</param>
    /// <param name="ip">ip</param>
    /// <param name="port">端口</param>
    /// <param name="domain">域名</param>
    public static void DeleteHostHeader(string serverName, string siteName, string ip, int port, string domain)
    {
        if (impersonateValidUser("dsiis"))
        {
            //Insert your code that runs under the security context of a specific user here.
            int siteID = GetWebSiteID(serverName, siteName);
            if (siteID < 1)
                siteID = 1;

            DeleteHostHeader(serverName, siteID, ip, port, domain);

            undoImpersonation();
        }
        else
        {
            //Your impersonation failed. Therefore, include a fail-safe mechanism here.
        }
    }

    /// <summary>
    /// 刪除域名綁定
    /// </summary>
    /// <param name="serverName">服務器名稱</param>
    /// <param name="siteid">站點編號</param>
    /// <param name="ip">ip</param>
    /// <param name="port">端口</param>
    /// <param name="domain">域名</param>
    public static void DeleteHostHeader(string serverName, int siteid, string ip, int port, string domain)
    {
        DirectoryEntry site = new DirectoryEntry("IIS://" + serverName + "/W3SVC/" + siteid);
        PropertyValueCollection serverBindings = site.Properties["ServerBindings"];
        string headerStr = string.Format("{0}:{1}:{2}", ip, port, domain);
        if (serverBindings.Contains(headerStr))
        {
            serverBindings.Remove(headerStr);
        }
        site.CommitChanges();
    }

    public static List<IISWebSite> LoadIISWebSiteData(string serverName)
    {
        List<IISWebSite> list = new List<IISWebSite>();
        int siteID;
        string siteName;

        string entPath = String.Format("IIS://{0}/w3svc", serverName);
        DirectoryEntry ent = new DirectoryEntry(entPath);

        foreach (DirectoryEntry child in ent.Children)
        {
            string HostName = ConfigurationManager.AppSettings["RencaiHost"].ToString();
            siteName = child.Properties["ServerComment"].Value.ToString();
            //判斷當前站點,是否為所指示的站點。
            if (child.SchemaClassName == "IIsWebServer" && siteName == HostName)
            {
                siteID = int.Parse(child.Name);
                list.Add(new IISWebSite(siteID, siteName));
                HttpCookie Cookie = new HttpCookie("IIsWebServerName");
                Cookie.Value =siteID.ToString();
                HttpContext.Current.Response.Cookies.Add(Cookie);
                break;
            }
        }
        return list;

    }
    public static List<IISWebSiteHostHeader> LoadHostHeaderList(string serverName, int siteID)
    {
        List<IISWebSiteHostHeader> list = new List<IISWebSiteHostHeader>();
        //連接到 Web 目錄。例如“IIS://LocalHost/W3SVC/1/ROOT/<Web 目錄名>”。
        DirectoryEntry site = new DirectoryEntry("IIS://" + serverName + "/W3SVC/" + siteID);
        PropertyValueCollection serverBindings = site.Properties["ServerBindings"];

        if (serverBindings != null && serverBindings.Value != null)
        {
            foreach (string str in serverBindings)
            {
                list.Add(new IISWebSiteHostHeader(siteID, str.Split(':')[0], int.Parse(str.Split(':')[1]), str.Split(':')[2]));
            }
        }
        return list;
    }

    /// <summary>
    /// 在指定IIS服務器中檢測指定主機頭實例是否存在,存在返回true,否則返回false
    /// </summary>
    /// <param name="serverName">IIS服務器</param>
    /// <param name="newHostHeader">待檢測的主機頭實例</param>
    /// <returns></returns>
    public static bool IsHostHeaderExists(string serverName, IISWebSiteHostHeader newHostHeader)
    {
        bool isFind = false;

        List<IISWebSite> siteList = LoadIISWebSiteData(serverName);
        foreach (IISWebSite site in siteList)
        {
            List<IISWebSiteHostHeader> headerList = LoadHostHeaderList(serverName, site.SiteID);
            foreach (IISWebSiteHostHeader header in headerList)
            {
                if (newHostHeader.Equals(header))
                {
                    isFind = true;
                    break;
                }
            }
        }
        return isFind;
    }

    /// <summary>
    /// 在現有綁定主機頭列表中搜索指定的主機頭
    /// </summary>
    /// <param name="serverName"></param>
    /// <param name="hostHeader"></param>
    /// <param name="siteID"></param>
    /// <returns></returns>
    public static List<IISWebSiteHostHeader> SearchHostHeaderList(string serverName, string hostHeader)
    {
        List<IISWebSiteHostHeader> list = new List<IISWebSiteHostHeader>();
        List<IISWebSite> siteList = LoadIISWebSiteData(serverName);
        foreach (IISWebSite site in siteList)
        {
            List<IISWebSiteHostHeader> headerList = LoadHostHeaderList(serverName, site.SiteID);
            foreach (IISWebSiteHostHeader header in headerList)
            {
                if (hostHeader.Equals(header.HostHeader, StringComparison.CurrentCultureIgnoreCase))
                    list.Add(header);
            }
        }
        return list;
    }
}

/// <summary>
/// IIS站點主機頭實體類
/// </summary>
public class IISWebSiteHostHeader
{
    public int SiteID { get; set; }
    public string IP { get; set; }
    public int Port { get; set; }
    public string HostHeader { get; set; }

    public IISWebSiteHostHeader(int siteID, string ip, int port, string hostHeader)
    {
        this.SiteID = siteID;
        this.IP = ip;
        this.Port = port;
        this.HostHeader = hostHeader;
    }

    /// <summary>
    /// 比較兩個站點主機頭實體是否相等,不比較站點ID(SiteID),僅比較IP/Port/HostHeader3項。
    /// </summary>
    /// <param name="obj"></param>
    /// <returns></returns>
    public override bool Equals(object obj)
    {
        IISWebSiteHostHeader header = obj as IISWebSiteHostHeader;
        if (header != null)
        {
            if (header.IP == this.IP && header.Port == this.Port && header.HostHeader == this.HostHeader)
                return true;
            else
                return false;
        }

        return base.Equals(obj);
    }
}

/// <summary>
/// IIS站點實體類
/// </summary>
public class IISWebSite
{
    public int SiteID { get; set; }
    public string SiteName { get; set; }

    public IISWebSite(int siteID, string siteName)
    {
        this.SiteID = siteID;
        this.SiteName = siteName;
    }
}

}</pre>

 本文由用戶 wen5 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!