PS:概要、背景、結語都是日常“裝X”,可以跳過直接看應用程序池設置
環境:Windows Server 2008、阿里雲ECS、IIS7.0
概要
IIS應用程序默認情況下,是使用內置帳戶運行的,權限比較有限,在一些代碼操作需要以管理員身份運行或指定特定帳戶運行,需要進行特殊的設置。
背景
測試環境用Jenkins搭建了.Net發布平台,但在涉及投產的時候,由於需要集成負載均衡(SLB)、配置發布、測試頁瀏覽,且投產不涉及代碼重新生成,只是把預發布環境的文件復制到投產,切換IIS目錄,再重啟生效,所以想通過C#代碼來實現該功能。
應用程序池設置
情景1、通過C#代碼調用批處理的方式安裝windows服務,在使用IIS內置帳戶的情況,會導致無法運行,需要以管理員身份運行;
情景2、C#提供了類庫對IIS進行管理,如IIS站點新建、刪除、切換IIS目錄、停止站點、啟動站點等(具體相關代碼見:【3、IIS站點管理代碼】),在使用IIS內置帳戶的情況,會導致無法運行,需要指定帳戶才能運行;
1、應用程序池->高級設置->進程模型->標識

2、應用程序池標識 ->自定義帳戶->設置憑據

3、C#對IIS站點管理代碼(復制於網絡)
類庫:Microsoft.Web.Administration.dll
Microsoft.Web.Administration.ServerManager sm = new Microsoft.Web.Administration.ServerManager(); System.Console.WriteLine("應用程序池默認設置:"); System.Console.WriteLine("\t常規:"); System.Console.WriteLine("\t\t.NET Framework 版本:{0}", sm.ApplicationPoolDefaults.ManagedRuntimeVersion); System.Console.WriteLine("\t\t隊列長度:{0}", sm.ApplicationPoolDefaults.QueueLength); System.Console.WriteLine("\t\t托管管道模式:{0}", sm.ApplicationPoolDefaults.ManagedPipelineMode.ToString()); System.Console.WriteLine("\t\t自動啟動:{0}", sm.ApplicationPoolDefaults.AutoStart); System.Console.WriteLine("\tCPU:"); System.Console.WriteLine("\t\t處理器關聯掩碼:{0}", sm.ApplicationPoolDefaults.Cpu.SmpProcessorAffinityMask); System.Console.WriteLine("\t\t限制:{0}", sm.ApplicationPoolDefaults.Cpu.Limit); System.Console.WriteLine("\t\t限制操作:{0}", sm.ApplicationPoolDefaults.Cpu.Action.ToString()); System.Console.WriteLine("\t\t限制間隔(分鍾):{0}", sm.ApplicationPoolDefaults.Cpu.ResetInterval.TotalMinutes); System.Console.WriteLine("\t\t已啟用處理器關聯:{0}", sm.ApplicationPoolDefaults.Cpu.SmpAffinitized); System.Console.WriteLine("\t回收:"); System.Console.WriteLine("\t\t發生配置更改時禁止回收:{0}", sm.ApplicationPoolDefaults.Recycling.DisallowRotationOnConfigChange); System.Console.WriteLine("\t\t固定時間間隔(分鍾):{0}", sm.ApplicationPoolDefaults.Recycling.PeriodicRestart.Time.TotalMinutes); System.Console.WriteLine("\t\t禁用重疊回收:{0}", sm.ApplicationPoolDefaults.Recycling.DisallowOverlappingRotation); System.Console.WriteLine("\t\t請求限制:{0}", sm.ApplicationPoolDefaults.Recycling.PeriodicRestart.Requests); System.Console.WriteLine("\t\t虛擬內存限制(KB):{0}", sm.ApplicationPoolDefaults.Recycling.PeriodicRestart.Memory); System.Console.WriteLine("\t\t專用內存限制(KB):{0}", sm.ApplicationPoolDefaults.Recycling.PeriodicRestart.PrivateMemory); System.Console.WriteLine("\t\t特定時間:{0}", sm.ApplicationPoolDefaults.Recycling.PeriodicRestart.Schedule.ToString()); System.Console.WriteLine("\t\t生成回收事件日志條目:{0}", sm.ApplicationPoolDefaults.Recycling.LogEventOnRecycle.ToString()); System.Console.WriteLine("\t進程孤立:"); System.Console.WriteLine("\t\t可執行文件:{0}", sm.ApplicationPoolDefaults.Failure.OrphanActionExe); System.Console.WriteLine("\t\t可執行文件參數:{0}", sm.ApplicationPoolDefaults.Failure.OrphanActionParams); System.Console.WriteLine("\t\t已啟用:{0}", sm.ApplicationPoolDefaults.Failure.OrphanWorkerProcess); System.Console.WriteLine("\t進程模型:"); System.Console.WriteLine("\t\tPing 間隔(秒):{0}", sm.ApplicationPoolDefaults.ProcessModel.PingInterval.TotalSeconds); System.Console.WriteLine("\t\tPing 最大響應時間(秒):{0}", sm.ApplicationPoolDefaults.ProcessModel.PingResponseTime.TotalSeconds); System.Console.WriteLine("\t\t標識:{0}", sm.ApplicationPoolDefaults.ProcessModel.IdentityType); System.Console.WriteLine("\t\t用戶名:{0}", sm.ApplicationPoolDefaults.ProcessModel.UserName); System.Console.WriteLine("\t\t密碼:{0}", sm.ApplicationPoolDefaults.ProcessModel.Password); System.Console.WriteLine("\t\t關閉時間限制(秒):{0}", sm.ApplicationPoolDefaults.ProcessModel.ShutdownTimeLimit.TotalSeconds); System.Console.WriteLine("\t\t加載用戶配置文件:{0}", sm.ApplicationPoolDefaults.ProcessModel.LoadUserProfile); System.Console.WriteLine("\t\t啟動時間限制(秒):{0}", sm.ApplicationPoolDefaults.ProcessModel.StartupTimeLimit.TotalSeconds); System.Console.WriteLine("\t\t允許 Ping:{0}", sm.ApplicationPoolDefaults.ProcessModel.PingingEnabled); System.Console.WriteLine("\t\t閑置超時(分鍾):{0}", sm.ApplicationPoolDefaults.ProcessModel.IdleTimeout.TotalMinutes); System.Console.WriteLine("\t\t最大工作進程數:{0}", sm.ApplicationPoolDefaults.ProcessModel.MaxProcesses); System.Console.WriteLine("\t快速故障防護:"); System.Console.WriteLine("\t\t“服務不可用”響應類型:{0}", sm.ApplicationPoolDefaults.Failure.LoadBalancerCapabilities.ToString()); System.Console.WriteLine("\t\t故障間隔(分鍾):{0}", sm.ApplicationPoolDefaults.Failure.RapidFailProtectionInterval.TotalMinutes); System.Console.WriteLine("\t\t關閉可執行文件:{0}", sm.ApplicationPoolDefaults.Failure.AutoShutdownExe); System.Console.WriteLine("\t\t關閉可執行文件參數:{0}", sm.ApplicationPoolDefaults.Failure.AutoShutdownParams); System.Console.WriteLine("\t\t已啟用:{0}", sm.ApplicationPoolDefaults.Failure.RapidFailProtection); System.Console.WriteLine("\t\t最大故障數:{0}", sm.ApplicationPoolDefaults.Failure.RapidFailProtectionMaxCrashes); System.Console.WriteLine("\t\t允許32位應用程序運行在64位 Windows 上:{0}", sm.ApplicationPoolDefaults.Enable32BitAppOnWin64); System.Console.WriteLine(); System.Console.WriteLine("網站默認設置:"); System.Console.WriteLine("\t常規:"); System.Console.WriteLine("\t\t物理路徑憑據:UserName={0}, Password={1}", sm.VirtualDirectoryDefaults.UserName, sm.VirtualDirectoryDefaults.Password); System.Console.WriteLine("\t\t物理路徑憑據登錄類型:{0}", sm.VirtualDirectoryDefaults.LogonMethod.ToString()); System.Console.WriteLine("\t\t應用程序池:{0}", sm.ApplicationDefaults.ApplicationPoolName); System.Console.WriteLine("\t\t自動啟動:{0}", sm.SiteDefaults.ServerAutoStart); System.Console.WriteLine("\t行為:"); System.Console.WriteLine("\t\t連接限制:"); System.Console.WriteLine("\t\t\t連接超時(秒):{0}", sm.SiteDefaults.Limits.ConnectionTimeout.TotalSeconds); System.Console.WriteLine("\t\t\t最大並發連接數:{0}", sm.SiteDefaults.Limits.MaxConnections); System.Console.WriteLine("\t\t\t最大帶寬(字節/秒):{0}", sm.SiteDefaults.Limits.MaxBandwidth); System.Console.WriteLine("\t\t失敗請求跟蹤:"); System.Console.WriteLine("\t\t\t跟蹤文件的最大數量:{0}", sm.SiteDefaults.TraceFailedRequestsLogging.MaxLogFiles); System.Console.WriteLine("\t\t\t目錄:{0}", sm.SiteDefaults.TraceFailedRequestsLogging.Directory); System.Console.WriteLine("\t\t\t已啟用:{0}", sm.SiteDefaults.TraceFailedRequestsLogging.Enabled); System.Console.WriteLine("\t\t已啟用的協議:{0}", sm.ApplicationDefaults.EnabledProtocols); foreach (var s in sm.Sites)//遍歷網站 { System.Console.WriteLine(); System.Console.WriteLine("模式名:{0}", s.Schema.Name); System.Console.WriteLine("編號:{0}", s.Id); System.Console.WriteLine("網站名稱:{0}", s.Name); System.Console.WriteLine("物理路徑:{0}", s.Applications["/"].VirtualDirectories["/"].PhysicalPath); System.Console.WriteLine("物理路徑憑據:{0}", s.Methods.ToString()); System.Console.WriteLine("應用程序池:{0}", s.Applications["/"].ApplicationPoolName); System.Console.WriteLine("已啟用的協議:{0}", s.Applications["/"].EnabledProtocols); System.Console.WriteLine("自動啟動:{0}", s.ServerAutoStart); System.Console.WriteLine("運行狀態:{0}", s.State.ToString()); System.Console.WriteLine("網站綁定:"); foreach (var tmp in s.Bindings) { System.Console.WriteLine("\t類型:{0}", tmp.Protocol); System.Console.WriteLine("\tIP 地址:{0}", tmp.EndPoint.Address.ToString()); System.Console.WriteLine("\t端口:{0}", tmp.EndPoint.Port.ToString()); System.Console.WriteLine("\t主機名:{0}", tmp.Host); //System.Console.WriteLine(tmp.BindingInformation); //System.Console.WriteLine(tmp.CertificateStoreName); //System.Console.WriteLine(tmp.IsIPPortHostBinding); //System.Console.WriteLine(tmp.IsLocallyStored); //System.Console.WriteLine(tmp.UseDsMapper); } System.Console.WriteLine("連接限制:"); System.Console.WriteLine("\t連接超時(秒):{0}", s.Limits.ConnectionTimeout.TotalSeconds); System.Console.WriteLine("\t最大並發連接數:{0}", s.Limits.MaxConnections); System.Console.WriteLine("\t最大帶寬(字節/秒):{0}", s.Limits.MaxBandwidth); System.Console.WriteLine("失敗請求跟蹤:"); System.Console.WriteLine("\t跟蹤文件的最大數量:{0}", s.TraceFailedRequestsLogging.MaxLogFiles); System.Console.WriteLine("\t目錄:{0}", s.TraceFailedRequestsLogging.Directory); System.Console.WriteLine("\t已啟用:{0}", s.TraceFailedRequestsLogging.Enabled); System.Console.WriteLine("日志:"); //System.Console.WriteLine("\t啟用日志服務:{0}", s.LogFile.Enabled); System.Console.WriteLine("\t格式:{0}", s.LogFile.LogFormat.ToString()); System.Console.WriteLine("\t目錄:{0}", s.LogFile.Directory); System.Console.WriteLine("\t文件包含字段:{0}", s.LogFile.LogExtFileFlags.ToString()); System.Console.WriteLine("\t計划:{0}", s.LogFile.Period.ToString()); System.Console.WriteLine("\t最大文件大小(字節):{0}", s.LogFile.TruncateSize); System.Console.WriteLine("\t使用本地時間進行文件命名和滾動更新:{0}", s.LogFile.LocalTimeRollover); System.Console.WriteLine("----應用程序的默認應用程序池:{0}", s.ApplicationDefaults.ApplicationPoolName); System.Console.WriteLine("----應用程序的默認已啟用的協議:{0}", s.ApplicationDefaults.EnabledProtocols); //System.Console.WriteLine("----應用程序的默認物理路徑憑據:{0}", s.ApplicationDefaults.Methods.ToString()); //System.Console.WriteLine("----虛擬目錄的默認物理路徑憑據:{0}", s.VirtualDirectoryDefaults.Methods.ToString()); System.Console.WriteLine("----虛擬目錄的默認物理路徑憑據登錄類型:{0}", s.VirtualDirectoryDefaults.LogonMethod.ToString()); System.Console.WriteLine("----虛擬目錄的默認用戶名:{0}", s.VirtualDirectoryDefaults.UserName); System.Console.WriteLine("----虛擬目錄的默認用戶密碼:{0}", s.VirtualDirectoryDefaults.Password); System.Console.WriteLine("應用程序 列表:"); foreach (var tmp in s.Applications) { if (tmp.Path != "/") { System.Console.WriteLine("\t模式名:{0}", tmp.Schema.Name); System.Console.WriteLine("\t虛擬路徑:{0}", tmp.Path); System.Console.WriteLine("\t物理路徑:{0}", tmp.VirtualDirectories["/"].PhysicalPath); //System.Console.WriteLine("\t物理路徑憑據:{0}", tmp.Methods.ToString()); System.Console.WriteLine("\t應用程序池:{0}", tmp.ApplicationPoolName); System.Console.WriteLine("\t已啟用的協議:{0}", tmp.EnabledProtocols); } System.Console.WriteLine("\t虛擬目錄 列表:"); foreach (var tmp2 in tmp.VirtualDirectories) { if (tmp2.Path != "/") { System.Console.WriteLine("\t\t模式名:{0}", tmp2.Schema.Name); System.Console.WriteLine("\t\t虛擬路徑:{0}", tmp2.Path); System.Console.WriteLine("\t\t物理路徑:{0}", tmp2.PhysicalPath); //System.Console.WriteLine("\t\t物理路徑憑據:{0}", tmp2.Methods.ToString()); System.Console.WriteLine("\t\t物理路徑憑據登錄類型:{0}", tmp2.LogonMethod.ToString()); } } } }
結語
對於生產環境,對外的站點只能設置使用IIS內置帳戶運行,但對一些內部管理的站點功能可以使用此設置。
