最近在做一個(gè)WEB程序的安裝包;對(duì)一些操作IIS進(jìn)行一個(gè)簡(jiǎn)單的總結(jié);主要包括對(duì)IIS進(jìn)行站點(diǎn)的新建以及新建站點(diǎn)的NET版本的選擇,還有針對(duì)IIS7程序池的托管模式以及版本的操作;首先要對(duì)Microsoft.Web.Administration進(jìn)行引用,它主要是用來(lái)操作IIS7;
using System.DirectoryServices;
using Microsoft.Web.Administration;
1:首先是對(duì)本版IIS的版本進(jìn)行配置:
DirectoryEntry getEntity = new DirectoryEntry("IIS://localhost/W3SVC/INFO"); string Version = getEntity.Properties["MajorIISVersionNumber"].Value.ToString(); MessageBox.Show("IIS版本為:" + Version);
2:是判斷程序池是存在;
/// <summary> /// 判斷程序池是否存在 /// </summary> /// <param name="AppPoolName">程序池名稱</param> /// <returns>true存在 false不存在</returns> private bool IsAppPoolName(string AppPoolName) { bool result = false; DirectoryEntry appPools = new DirectoryEntry("IIS://localhost/W3SVC/AppPools"); foreach (DirectoryEntry getdir in appPools.Children) { if (getdir.Name.Equals(AppPoolName)) { result = true; } } return result; }
3:刪除應(yīng)用程序池
/// <summary> /// 刪除指定程序池 /// </summary> /// <param name="AppPoolName">程序池名稱</param> /// <returns>true刪除成功 false刪除失敗</returns> private bool DeleteAppPool(string AppPoolName) { bool result = false; DirectoryEntry appPools = new DirectoryEntry("IIS://localhost/W3SVC/AppPools"); foreach (DirectoryEntry getdir in appPools.Children) { if (getdir.Name.Equals(AppPoolName)) { try { getdir.DeleteTree(); result = true; } catch { result = false; } } } return result; }
4:創(chuàng)建應(yīng)用程序池 (對(duì)程序池的設(shè)置主要是針對(duì)IIS7;IIS7應(yīng)用程序池托管模式主要包括集成跟經(jīng)典模式,并進(jìn)行NET版本的設(shè)置)
string AppPoolName = "LamAppPool"; if (!IsAppPoolName(AppPoolName)) { DirectoryEntry newpool; DirectoryEntry appPools = new DirectoryEntry("IIS://localhost/W3SVC/AppPools"); newpool = appPools.Children.Add(AppPoolName, "IIsApplicationPool"); newpool.CommitChanges(); MessageBox.Show(AppPoolName + "程序池增加成功"); } #endregion #region 修改應(yīng)用程序的配置(包含托管模式及其NET運(yùn)行版本) ServerManager sm = new ServerManager(); sm.ApplicationPools[AppPoolName].ManagedRuntimeVersion = "v4.0"; sm.ApplicationPools[AppPoolName].ManagedPipelineMode = ManagedPipelineMode.Classic; //托管模式Integrated為集成 Classic為經(jīng)典 sm.CommitChanges(); MessageBox.Show(AppPoolName + "程序池托管管道模式:" + sm.ApplicationPools[AppPoolName].ManagedPipelineMode.ToString() + "運(yùn)行的NET版本為:" + sm.ApplicationPools[AppPoolName].ManagedRuntimeVersion);
運(yùn)用C#代碼來(lái)對(duì)IIS7程序池托管管道模式及版本進(jìn)行修改;
5:針對(duì)IIS6的NET版進(jìn)行設(shè)置;因?yàn)榇颂幬沂怯玫絅ET4.0所以V4.0.30319 若是NET2.0則在這進(jìn)行修改 v2.0.50727
//啟動(dòng)aspnet_regiis.exe程序 string fileName = Environment.GetEnvironmentVariable("windir") + @"\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe"; ProcessStartInfo startInfo = new ProcessStartInfo(fileName); //處理目錄路徑 string path = vdEntry.Path.ToUpper(); int index = path.IndexOf("W3SVC"); path = path.Remove(0, index); //啟動(dòng)ASPnet_iis.exe程序,刷新腳本映射 startInfo.Arguments = "-s " + path; startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.UseShellExecute = false; startInfo.CreateNoWindow = true; startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardError = true; Process process = new Process(); process.StartInfo = startInfo; process.Start(); process.WaitForExit(); string errors = process.StandardError.ReadToEnd();
6:平常我們可能還得對(duì)IIS中的MIME類型進(jìn)行增加;下面主要是我們用到兩個(gè)類型分別是:xaml,xap
IISOle.MimeMapClass NewMime = new IISOle.MimeMapClass(); NewMime.Extension = ".xaml"; NewMime.MimeType = "application/xaml+xml"; IISOle.MimeMapClass TwoMime = new IISOle.MimeMapClass(); TwoMime.Extension = ".xap"; TwoMime.MimeType = "application/x-silverlight-app"; rootEntry.Properties["MimeMap"].Add(NewMime); rootEntry.Properties["MimeMap"].Add(TwoMime); rootEntry.CommitChanges();
7:下面是做安裝時(shí)一段對(duì)IIS進(jìn)行操作的代碼;兼容IIS6及IIS7;新建虛擬目錄并對(duì)相應(yīng)的屬性進(jìn)行設(shè)置;對(duì)IIS7還進(jìn)行新建程序池的程序;并設(shè)置程序池的配置;
/// <summary> /// 創(chuàng)建網(wǎng)站 /// </summary> /// <param name="siteInfo"></param> public void CreateNewWebSite(NewWebSiteInfo siteInfo) { if (!EnsureNewSiteEnavaible(siteInfo.BindString)) { throw new Exception("該網(wǎng)站已存在" + Environment.NewLine + siteInfo.BindString); } DirectoryEntry rootEntry = GetDirectoryEntry(entPath); 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(); string ChangWebPath = siteInfo.WebPath.Trim().Remove(siteInfo.WebPath.Trim().LastIndexOf('\\'),1); vdEntry.Properties["Path"].Value = ChangWebPath; vdEntry.Invoke("AppCreate", true);//創(chuàng)建應(yīng)用程序 vdEntry.Properties["AccessRead"][0] = true; //設(shè)置讀取權(quán)限 vdEntry.Properties["AccessWrite"][0] = true; vdEntry.Properties["AccessScript"][0] = true;//執(zhí)行權(quán)限 vdEntry.Properties["AccessExecute"][0] = false; vdEntry.Properties["DefaultDoc"][0] = "Login.aspx";//設(shè)置默認(rèn)文檔 vdEntry.Properties["AppFriendlyName"][0] = "LabManager"; //應(yīng)用程序名稱 vdEntry.Properties["AuthFlags"][0] = 1;//0表示不允許匿名訪問,1表示就可以3為基本身份驗(yàn)證,7為windows繼承身份驗(yàn)證 vdEntry.CommitChanges(); //操作增加MIME //IISOle.MimeMapClass NewMime = new IISOle.MimeMapClass(); //NewMime.Extension = ".xaml"; NewMime.MimeType = "application/xaml+xml"; //IISOle.MimeMapClass TwoMime = new IISOle.MimeMapClass(); //TwoMime.Extension = ".xap"; TwoMime.MimeType = "application/x-silverlight-app"; //rootEntry.Properties["MimeMap"].Add(NewMime); //rootEntry.Properties["MimeMap"].Add(TwoMime); //rootEntry.CommitChanges(); #region 針對(duì)IIS7 DirectoryEntry getEntity = new DirectoryEntry("IIS://localhost/W3SVC/INFO"); int Version =int.Parse(getEntity.Properties["MajorIISVersionNumber"].Value.ToString()); if (Version > 6) { #region 創(chuàng)建應(yīng)用程序池 string AppPoolName = "LabManager"; if (!IsAppPoolName(AppPoolName)) { DirectoryEntry newpool; DirectoryEntry appPools = new DirectoryEntry("IIS://localhost/W3SVC/AppPools"); newpool = appPools.Children.Add(AppPoolName, "IIsApplicationPool"); newpool.CommitChanges(); } #endregion #region 修改應(yīng)用程序的配置(包含托管模式及其NET運(yùn)行版本) ServerManager sm = new ServerManager(); sm.ApplicationPools[AppPoolName].ManagedRuntimeVersion = "v4.0"; sm.ApplicationPools[AppPoolName].ManagedPipelineMode = ManagedPipelineMode.Classic; //托管模式Integrated為集成 Classic為經(jīng)典 sm.CommitChanges(); #endregion vdEntry.Properties["AppPoolId"].Value = AppPoolName; vdEntry.CommitChanges(); } #endregion //啟動(dòng)aspnet_regiis.exe程序 string fileName = Environment.GetEnvironmentVariable("windir") + @"\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe"; ProcessStartInfo startInfo = new ProcessStartInfo(fileName); //處理目錄路徑 string path = vdEntry.Path.ToUpper(); int index = path.IndexOf("W3SVC"); path = path.Remove(0, index); //啟動(dòng)ASPnet_iis.exe程序,刷新腳本映射 startInfo.Arguments = "-s " + path; startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.UseShellExecute = false; startInfo.CreateNoWindow = true; startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardError = true; Process process = new Process(); process.StartInfo = startInfo; process.Start(); process.WaitForExit(); string errors = process.StandardError.ReadToEnd(); if (errors != string.Empty) { throw new Exception(errors); } }
string entPath = String.Format("IIS://{0}/w3svc", "localhost"); public DirectoryEntry GetDirectoryEntry(string entPath) { DirectoryEntry ent = new DirectoryEntry(entPath); return ent; } public class NewWebSiteInfo { private string hostIP; // 主機(jī)IP private string portNum; // 網(wǎng)站端口號(hào) private string descOfWebSite; // 網(wǎng)站表示。一般為網(wǎng)站的網(wǎng)站名。例如"www.dns.com.cn" private string commentOfWebSite;// 網(wǎng)站注釋。一般也為網(wǎng)站的網(wǎng)站名。 private string webPath; // 網(wǎng)站的主目錄。例如"e:\ mp" 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); //網(wǎng)站標(biāo)識(shí)(IP,端口,主機(jī)頭值) } } public string PortNum { get { return portNum; } } public string CommentOfWebSite { get { return commentOfWebSite; } } public string WebPath { get { return webPath; } } }
8:下面的代碼是對(duì)文件夾權(quán)限進(jìn)行設(shè)置,下面代碼是創(chuàng)建Everyone 并給予全部權(quán)限
/// <summary> /// 設(shè)置文件夾權(quán)限 處理給EVERONE賦予所有權(quán)限 /// </summary> /// <param name="FileAdd">文件夾路徑</param> public void SetFileRole() { string FileAdd = this.Context.Parameters["installdir"].ToString(); FileAdd = FileAdd.Remove(FileAdd.LastIndexOf('\\'), 1); DirectorySecurity fSec = new DirectorySecurity(); fSec.AddAccessRule(new FileSystemAccessRule("Everyone",FileSystemRights.FullControl,InheritanceFlags.ContainerInherit|InheritanceFlags.ObjectInherit,PropagationFlags.None,AccessControlType.Allow)); System.IO.Directory.SetAccessControl(FileAdd, fSec); }