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)ÿ