• C#操作IIS程序池及站点的创建配置(转)


    原文:http://www.cnblogs.com/wujy/archive/2013/02/28/2937667.html

    最近在做一个WEB程序的安装包;对一些操作IIS进行一个简单的总结;主要包括对IIS进行站点的新建以及新建站点的NET版本的选择,还有针对IIS7程序池的托管模式以及版本的操作;首先要对Microsoft.Web.Administration进行引用,它主要是用来操作IIS7;

    using System.DirectoryServices; using Microsoft.Web.Administration;

    1:首先是对本版IIS的版本进行配置:

    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:删除应用程序池

    复制代码
            /// <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:创建应用程序池 (对程序池的设置主要是针对IIS7;IIS7应用程序池托管模式主要包括集成跟经典模式,并进行NET版本的设置)

    复制代码
                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 修改应用程序的配置(包含托管模式及其NET运行版本)
                ServerManager sm = new ServerManager();
                sm.ApplicationPools[AppPoolName].ManagedRuntimeVersion = "v4.0";
                sm.ApplicationPools[AppPoolName].ManagedPipelineMode = ManagedPipelineMode.Classic; //托管模式Integrated为集成 Classic为经典
                sm.CommitChanges();
                MessageBox.Show(AppPoolName + "程序池托管管道模式:" + sm.ApplicationPools[AppPoolName].ManagedPipelineMode.ToString() + "运行的NET版本为:" + sm.ApplicationPools[AppPoolName].ManagedRuntimeVersion);
    复制代码

    运用C#代码来对IIS7程序池托管管道模式及版本进行修改;

    5:针对IIS6的NET版进行设置;因为此处我是用到NET4.0所以V4.0.30319 若是NET2.0则在这进行修改 v2.0.50727

    复制代码
                //启动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);
                //启动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:平常我们可能还得对IIS中的MIME类型进行增加;下面主要是我们用到两个类型分别是: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:下面是做安装时一段对IIS进行操作的代码;兼容IIS6及IIS7;新建虚拟目录并对相应的属性进行设置;对IIS7还进行新建程序池的程序;并设置程序池的配置;

    复制代码
    /// <summary>
        /// 创建网站
        /// </summary>
        /// <param name="siteInfo"></param>
          public  void CreateNewWebSite(NewWebSiteInfo siteInfo)
            {
                if (!EnsureNewSiteEnavaible(siteInfo.BindString))
                {
                    throw new Exception("该网站已存在" + 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);//创建应用程序
    
                vdEntry.Properties["AccessRead"][0] = true; //设置读取权限
                vdEntry.Properties["AccessWrite"][0] = true;
                vdEntry.Properties["AccessScript"][0] = true;//执行权限
                vdEntry.Properties["AccessExecute"][0] = false;
                vdEntry.Properties["DefaultDoc"][0] = "Login.aspx";//设置默认文档
                vdEntry.Properties["AppFriendlyName"][0] = "LabManager"; //应用程序名称           
                vdEntry.Properties["AuthFlags"][0] = 1;//0表示不允许匿名访问,1表示就可以3为基本身份验证,7为windows继承身份验证
                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 针对IIS7
                DirectoryEntry getEntity = new DirectoryEntry("IIS://localhost/W3SVC/INFO");
                int Version =int.Parse(getEntity.Properties["MajorIISVersionNumber"].Value.ToString());
                if (Version > 6)
                {
                    #region 创建应用程序池
                    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 修改应用程序的配置(包含托管模式及其NET运行版本)
                    ServerManager sm = new ServerManager();
                    sm.ApplicationPools[AppPoolName].ManagedRuntimeVersion = "v4.0";
                    sm.ApplicationPools[AppPoolName].ManagedPipelineMode = ManagedPipelineMode.Classic; //托管模式Integrated为集成 Classic为经典
                    sm.CommitChanges();
                    #endregion
    
                    vdEntry.Properties["AppPoolId"].Value = AppPoolName;
                    vdEntry.CommitChanges();
                }
                #endregion
    
    
                //启动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);
                //启动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;   // 主机IP
                private string portNum;   // 网站端口号
                private string descOfWebSite; // 网站表示。一般为网站的网站名。例如"www.dns.com.cn"
                private string commentOfWebSite;// 网站注释。一般也为网站的网站名。
                private string webPath;   // 网站的主目录。例如"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); //网站标识(IP,端口,主机头值)
                    }
                }
    
                public string PortNum
                {
                    get
                    {
                        return portNum;
                    }
                }
    
                public string CommentOfWebSite
                {
                    get
                    {
                        return commentOfWebSite;
                    }
                }
    
                public string WebPath
                {
                    get
                    {
                        return webPath;
                    }
                }
            }
    复制代码

    8:下面的代码是对文件夹权限进行设置,下面代码是创建Everyone 并给予全部权限

    复制代码
            /// <summary>
            /// 设置文件夹权限 处理给EVERONE赋予所有权限
            /// </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);
            }
    复制代码
  • 相关阅读:
    1.常用命令
    虚拟机共享文件夹
    Docker安装 和简单使用
    js方法名通过参数传递调用实例
    highcharts参数说明
    绘制HightCharts饼状图
    附加数据库失败,操作系统错误 5:”5(拒绝访问。)”的解决办法
    ckeditor相关使用
    针对MySQL提高百万条数据的查询速度优化
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
  • 原文地址:https://www.cnblogs.com/wangjingblogs/p/2938160.html
Copyright © 2020-2023  润新知