中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

C#對IIS進行操作的代碼

2018-07-20    來源:open-open

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

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

//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>
        /// 獲取一個網(wǎng)站的編號。根據(jù)網(wǎng)站的ServerBindings或者ServerComment來確定網(wǎng)站編號
        /// </summary>
        /// <param name="serverName">服務(wù)器名稱(默認為localhost,可以為IP地址)</param>
        /// <param name="siteName">站點名稱</param>
        /// <returns>返回網(wǎng)站的編號</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">服務(wù)器名稱</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">服務(wù)器名稱</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);
            }
            //默認情況下,對緩存進行本地更改。修改或添加節(jié)點之后,
            //必須調(diào)用 CommitChanges 方法,以便提交更改,將它們保存到樹中。
            //如果在調(diào)用 CommitChanges 之前調(diào)用 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">服務(wù)器名稱</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">服務(wù)器名稱</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服務(wù)器中檢測指定主機頭實例是否存在,存在返回true,否則返回false
        /// </summary>
        /// <param name="serverName">IIS服務(wù)器</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>
        /// 在現(xiàn)有綁定主機頭列表中搜索指定的主機頭
        /// </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;
        }
    }
}

標簽: 代碼 服務(wù)器 搜索 域名 域名綁定

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:C#導(dǎo)出數(shù)據(jù)到Excel或者Word中的代碼片段

下一篇:C#共享文件夾的代碼片段