C#對IIS進行操作的代碼
這段代碼是一個IIS操作類,可以最IIS進行站點的添加、刪除、修改等操作
//IISHelper.csusing 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!