[C#] C#对IIS进行操作的代码 →→→→→进入此内容的聊天室

来自 , 2020-12-11, 写在 C#, 查看 162 次.
URL http://www.code666.cn/view/8cb94e7a
  1. //IISHelper.cs
  2.  
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Text.RegularExpressions;
  8. using System.DirectoryServices;
  9. using System.Security.Principal;
  10. using System.Runtime.InteropServices;
  11. using System.Data;
  12. using System.Configuration;
  13. using System.Web;
  14.  
  15. namespace IIS_BatchOperate
  16. {
  17.     public class IISHelper
  18.     {
  19.  
  20.         #region 临时模拟IIS管理员用户
  21.  
  22.         public const int LOGON32_LOGON_INTERACTIVE = 2;
  23.         public const int LOGON32_PROVIDER_DEFAULT = 0;
  24.  
  25.         static WindowsImpersonationContext impersonationContext;
  26.  
  27.         [DllImport("advapi32.dll")]
  28.         public static extern int LogonUserA(String lpszUserName,
  29.             String lpszDomain,
  30.             String lpszPassword,
  31.             int dwLogonType,
  32.             int dwLogonProvider,
  33.             ref IntPtr phToken);
  34.         [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  35.         public static extern int DuplicateToken(IntPtr hToken,
  36.             int impersonationLevel,
  37.             ref IntPtr hNewToken);
  38.  
  39.         [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  40.         public static extern bool RevertToSelf();
  41.  
  42.         [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  43.         public static extern bool CloseHandle(IntPtr handle);
  44.  
  45.         /// <summary>
  46.         ///
  47.         /// </summary>
  48.         /// <param name="userName"></param>
  49.         /// <param name="domain"></param>
  50.         /// <param name="password"></param>
  51.         /// <returns></returns>
  52.         private static bool impersonateValidUser(String userName)
  53.         {
  54.             string domain = "administrator";
  55.             string password = "123";
  56.             WindowsIdentity tempWindowsIdentity;
  57.             IntPtr token = IntPtr.Zero;
  58.             IntPtr tokenDuplicate = IntPtr.Zero;
  59.  
  60.             if (RevertToSelf())
  61.             {
  62.                 if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
  63.                     LOGON32_PROVIDER_DEFAULT, ref token) != 0)
  64.                 {
  65.                     if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
  66.                     {
  67.                         tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
  68.                         impersonationContext = tempWindowsIdentity.Impersonate();
  69.                         if (impersonationContext != null)
  70.                         {
  71.                             CloseHandle(token);
  72.                             CloseHandle(tokenDuplicate);
  73.                             return true;
  74.                         }
  75.                     }
  76.                 }
  77.             }
  78.             if (token != IntPtr.Zero)
  79.                 CloseHandle(token);
  80.             if (tokenDuplicate != IntPtr.Zero)
  81.                 CloseHandle(tokenDuplicate);
  82.             return false;
  83.         }
  84.  
  85.         /// <summary>
  86.         /// 撤消模拟
  87.         /// </summary>
  88.         private static void undoImpersonation()
  89.         {
  90.             impersonationContext.Undo();
  91.         }
  92.  
  93.         #endregion
  94.  
  95.  
  96.         /// <summary>
  97.         /// 获取一个网站的编号。根据网站的ServerBindings或者ServerComment来确定网站编号
  98.         /// </summary>
  99.         /// <param name="serverName">服务器名称(默认为localhost,可以为IP地址)</param>
  100.         /// <param name="siteName">站点名称</param>
  101.         /// <returns>返回网站的编号</returns>
  102.         private static int GetWebSiteID(string serverName, string siteName)
  103.         {
  104.             int siteID = -1;
  105.  
  106.             Regex regex = new Regex(siteName);
  107.  
  108.             if (serverName.Length < 1)
  109.                 serverName = "localhost";
  110.  
  111.             string tmpStr;
  112.             string entPath = String.Format("IIS://{0}/w3svc", serverName);
  113.             DirectoryEntry ent = new DirectoryEntry(entPath);
  114.             foreach (DirectoryEntry child in ent.Children)
  115.             {
  116.                 if (child.SchemaClassName == "IIsWebServer")
  117.                 {
  118.                     if (child.Properties["ServerBindings"].Value != null)
  119.                     {
  120.                         tmpStr = child.Properties["ServerBindings"].Value.ToString();
  121.                         if (regex.Match(tmpStr).Success)
  122.                         {
  123.                             siteID = int.Parse(child.Name);
  124.                             break;
  125.                         }
  126.                     }
  127.                     if (child.Properties["ServerComment"].Value != null)
  128.                     {
  129.                         tmpStr = child.Properties["ServerComment"].Value.ToString();
  130.                         if (regex.Match(tmpStr).Success)
  131.                         {
  132.                             siteID = int.Parse(child.Name);
  133.                             break;
  134.                         }
  135.                     }
  136.                 }
  137.             }
  138.             return siteID;
  139.         }
  140.  
  141.         /// <summary>
  142.         /// 添加域名绑定
  143.         /// </summary>
  144.         /// <param name="siteName">站点名称</param>
  145.         /// <param name="ip">ip</param>
  146.         /// <param name="port">端口</param>
  147.         /// <param name="domain">域名</param>
  148.         public static void AddHostHeader(string siteName, string ip, int port, string domain)
  149.         {
  150.             AddHostHeader("localhost", siteName, ip, port, domain);
  151.         }
  152.  
  153.         /// <summary>
  154.         /// 添加域名绑定
  155.         /// </summary>
  156.         /// <param name="serverName">服务器名称</param>
  157.         /// <param name="siteName">站点名称</param>
  158.         /// <param name="ip">ip</param>
  159.         /// <param name="port">端口</param>
  160.         /// <param name="domain">域名</param>
  161.         public static void AddHostHeader(string serverName, string siteName, string ip, int port, string domain)
  162.         {
  163.             if (impersonateValidUser("dsiis"))
  164.             {
  165.                 //Insert your code that runs under the security context of a specific user here.
  166.                 int siteID = GetWebSiteID(serverName, siteName);
  167.                 if (siteID < 1)
  168.                     siteID = 1;
  169.  
  170.                 AddHostHeader(serverName, siteID, ip, port, domain);
  171.  
  172.                 undoImpersonation();
  173.             }
  174.             else
  175.             {
  176.                 //"临时模拟IIS管理员用户"失败;
  177.             }
  178.         }
  179.  
  180.         /// <summary>
  181.         /// 添加域名绑定
  182.         /// </summary>
  183.         /// <param name="serverName">服务器名称</param>
  184.         /// <param name="siteid">站点编号</param>
  185.         /// <param name="ip">ip</param>
  186.         /// <param name="port">端口</param>
  187.         /// <param name="domain">域名</param>
  188.         public static void AddHostHeader(string serverName, int siteid, string ip, int port, string domain)
  189.         {
  190.             DirectoryEntry site = new DirectoryEntry("IIS://" + serverName + "/W3SVC/" + siteid);
  191.             PropertyValueCollection serverBindings = site.Properties["ServerBindings"];
  192.             string headerStr = string.Format("{0}:{1}:{2}", ip, port, domain);
  193.             if (!serverBindings.Contains(headerStr))
  194.             {
  195.                 serverBindings.Add(headerStr);
  196.             }
  197.             //默认情况下,对缓存进行本地更改。修改或添加节点之后,
  198.             //必须调用 CommitChanges 方法,以便提交更改,将它们保存到树中。
  199.             //如果在调用 CommitChanges 之前调用 RefreshCache,则将丢失对属性缓存的任何未提交的更改。
  200.             site.CommitChanges();
  201.         }
  202.  
  203.         /// <summary>
  204.         /// 删除域名绑定
  205.         /// </summary>
  206.         /// <param name="siteName">站点名称</param>
  207.         /// <param name="ip">ip</param>
  208.         /// <param name="port">端口</param>
  209.         /// <param name="domain">域名</param>
  210.         public static void DeleteHostHeader(string siteName, string ip, int port, string domain)
  211.         {
  212.             DeleteHostHeader("localhost", siteName, ip, port, domain);
  213.         }
  214.  
  215.         /// <summary>
  216.         /// 删除域名绑定
  217.         /// </summary>
  218.         /// <param name="serverName">服务器名称</param>
  219.         /// <param name="siteName">站点名称</param>
  220.         /// <param name="ip">ip</param>
  221.         /// <param name="port">端口</param>
  222.         /// <param name="domain">域名</param>
  223.         public static void DeleteHostHeader(string serverName, string siteName, string ip, int port, string domain)
  224.         {
  225.             if (impersonateValidUser("dsiis"))
  226.             {
  227.                 //Insert your code that runs under the security context of a specific user here.
  228.                 int siteID = GetWebSiteID(serverName, siteName);
  229.                 if (siteID < 1)
  230.                     siteID = 1;
  231.  
  232.                 DeleteHostHeader(serverName, siteID, ip, port, domain);
  233.  
  234.                 undoImpersonation();
  235.             }
  236.             else
  237.             {
  238.                 //Your impersonation failed. Therefore, include a fail-safe mechanism here.
  239.             }
  240.         }
  241.  
  242.         /// <summary>
  243.         /// 删除域名绑定
  244.         /// </summary>
  245.         /// <param name="serverName">服务器名称</param>
  246.         /// <param name="siteid">站点编号</param>
  247.         /// <param name="ip">ip</param>
  248.         /// <param name="port">端口</param>
  249.         /// <param name="domain">域名</param>
  250.         public static void DeleteHostHeader(string serverName, int siteid, string ip, int port, string domain)
  251.         {
  252.             DirectoryEntry site = new DirectoryEntry("IIS://" + serverName + "/W3SVC/" + siteid);
  253.             PropertyValueCollection serverBindings = site.Properties["ServerBindings"];
  254.             string headerStr = string.Format("{0}:{1}:{2}", ip, port, domain);
  255.             if (serverBindings.Contains(headerStr))
  256.             {
  257.                 serverBindings.Remove(headerStr);
  258.             }
  259.             site.CommitChanges();
  260.         }
  261.        
  262.         public static List<IISWebSite> LoadIISWebSiteData(string serverName)
  263.         {
  264.             List<IISWebSite> list = new List<IISWebSite>();
  265.             int siteID;
  266.             string siteName;
  267.  
  268.             string entPath = String.Format("IIS://{0}/w3svc", serverName);
  269.             DirectoryEntry ent = new DirectoryEntry(entPath);
  270.  
  271.             foreach (DirectoryEntry child in ent.Children)
  272.             {
  273.                 string HostName = ConfigurationManager.AppSettings["RencaiHost"].ToString();
  274.                 siteName = child.Properties["ServerComment"].Value.ToString();
  275.                 //判断当前站点,是否为所指示的站点。
  276.                 if (child.SchemaClassName == "IIsWebServer" && siteName == HostName)
  277.                 {
  278.                     siteID = int.Parse(child.Name);
  279.                     list.Add(new IISWebSite(siteID, siteName));
  280.                     HttpCookie Cookie = new HttpCookie("IIsWebServerName");
  281.                     Cookie.Value =siteID.ToString();
  282.                     HttpContext.Current.Response.Cookies.Add(Cookie);
  283.                     break;
  284.                 }
  285.             }
  286.             return list;
  287.            
  288.         }
  289.         public static List<IISWebSiteHostHeader> LoadHostHeaderList(string serverName, int siteID)
  290.         {
  291.             List<IISWebSiteHostHeader> list = new List<IISWebSiteHostHeader>();
  292.             //连接到 Web 目录。例如“IIS://LocalHost/W3SVC/1/ROOT/<Web 目录名>”。
  293.             DirectoryEntry site = new DirectoryEntry("IIS://" + serverName + "/W3SVC/" + siteID);
  294.             PropertyValueCollection serverBindings = site.Properties["ServerBindings"];
  295.  
  296.             if (serverBindings != null && serverBindings.Value != null)
  297.             {
  298.                 foreach (string str in serverBindings)
  299.                 {
  300.                     list.Add(new IISWebSiteHostHeader(siteID, str.Split(':')[0], int.Parse(str.Split(':')[1]), str.Split(':')[2]));
  301.                 }
  302.             }
  303.             return list;
  304.         }
  305.  
  306.         /// <summary>
  307.         /// 在指定IIS服务器中检测指定主机头实例是否存在,存在返回true,否则返回false
  308.         /// </summary>
  309.         /// <param name="serverName">IIS服务器</param>
  310.         /// <param name="newHostHeader">待检测的主机头实例</param>
  311.         /// <returns></returns>
  312.         public static bool IsHostHeaderExists(string serverName, IISWebSiteHostHeader newHostHeader)
  313.         {
  314.             bool isFind = false;
  315.  
  316.             List<IISWebSite> siteList = LoadIISWebSiteData(serverName);
  317.             foreach (IISWebSite site in siteList)
  318.             {
  319.                 List<IISWebSiteHostHeader> headerList = LoadHostHeaderList(serverName, site.SiteID);
  320.                 foreach (IISWebSiteHostHeader header in headerList)
  321.                 {
  322.                     if (newHostHeader.Equals(header))
  323.                     {
  324.                         isFind = true;
  325.                         break;
  326.                     }
  327.                 }
  328.             }
  329.             return isFind;
  330.         }
  331.  
  332.         /// <summary>
  333.         /// 在现有绑定主机头列表中搜索指定的主机头
  334.         /// </summary>
  335.         /// <param name="serverName"></param>
  336.         /// <param name="hostHeader"></param>
  337.         /// <param name="siteID"></param>
  338.         /// <returns></returns>
  339.         public static List<IISWebSiteHostHeader> SearchHostHeaderList(string serverName, string hostHeader)
  340.         {
  341.             List<IISWebSiteHostHeader> list = new List<IISWebSiteHostHeader>();
  342.             List<IISWebSite> siteList = LoadIISWebSiteData(serverName);
  343.             foreach (IISWebSite site in siteList)
  344.             {
  345.                 List<IISWebSiteHostHeader> headerList = LoadHostHeaderList(serverName, site.SiteID);
  346.                 foreach (IISWebSiteHostHeader header in headerList)
  347.                 {
  348.                     if (hostHeader.Equals(header.HostHeader, StringComparison.CurrentCultureIgnoreCase))
  349.                         list.Add(header);
  350.                 }
  351.             }
  352.             return list;
  353.         }
  354.     }
  355.  
  356.     /// <summary>
  357.     /// IIS站点主机头实体类
  358.     /// </summary>
  359.     public class IISWebSiteHostHeader
  360.     {
  361.         public int SiteID { get; set; }
  362.         public string IP { get; set; }
  363.         public int Port { get; set; }
  364.         public string HostHeader { get; set; }
  365.  
  366.         public IISWebSiteHostHeader(int siteID, string ip, int port, string hostHeader)
  367.         {
  368.             this.SiteID = siteID;
  369.             this.IP = ip;
  370.             this.Port = port;
  371.             this.HostHeader = hostHeader;
  372.         }
  373.  
  374.         /// <summary>
  375.         /// 比较两个站点主机头实体是否相等,不比较站点ID(SiteID),仅比较IP/Port/HostHeader3项。
  376.         /// </summary>
  377.         /// <param name="obj"></param>
  378.         /// <returns></returns>
  379.         public override bool Equals(object obj)
  380.         {
  381.             IISWebSiteHostHeader header = obj as IISWebSiteHostHeader;
  382.             if (header != null)
  383.             {
  384.                 if (header.IP == this.IP && header.Port == this.Port && header.HostHeader == this.HostHeader)
  385.                     return true;
  386.                 else
  387.                     return false;
  388.             }
  389.  
  390.             return base.Equals(obj);
  391.         }
  392.     }
  393.  
  394.     /// <summary>
  395.     /// IIS站点实体类
  396.     /// </summary>
  397.     public class IISWebSite
  398.     {
  399.         public int SiteID { get; set; }
  400.         public string SiteName { get; set; }
  401.  
  402.         public IISWebSite(int siteID, string siteName)
  403.         {
  404.             this.SiteID = siteID;
  405.             this.SiteName = siteName;
  406.         }
  407.     }
  408. }
  409.  
  410. //csharp/2117

回复 "C#对IIS进行操作的代码"

这儿你可以回复上面这条便签

captcha