太阳不下山 发表于 2021-7-18 15:38:10

C# 操作IIS方法集合

如果在win8,win7情况下报错:未知错误(0x80005000)
using System;
using System.Collections;
using System.Collections.Generic;
using System.DirectoryServices;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace IISControlHelper
{
   ///   <summary>
   ///IIS 操作方法集合
   ///   </summary>   publicclass IISWorker
    {
         privatestaticstring HostName =” localhost ”;

         ///   <summary>
         ///获取本地IIS版本
         ///   </summary>
         ///   <returns></returns>         publicstaticstring GetIIsVersion()
      {
             try
            {
                DirectoryEntry entry =new DirectoryEntry( ” IIS:// ” + HostName +” /W3SVC/INFO ”);
               string version = entry.Properties[ ” MajorIISVersionNumber ”].Value.ToString();
               return version;
            }
             catch (Exception se)
            {
               // 说明一点:IIS5.0中没有(int)entry.Properties[“MajorIISVersionNumber”].Value;属性,将抛出异常 证明版本为 5.0               returnstring.Empty;
            }
      }

         ///   <summary>
         ///创建虚拟目录网站
         ///   </summary>
         ///   <param name=”webSiteName”> 网站名称 </param>
         ///   <param name=”physicalPath”> 物理路径 </param>
         ///   <param name=”domainPort”> 站点+端口,如192.168.1.23:90 </param>
         ///   <param name=”isCreateAppPool”> 是否创建新的应用程序池 </param>
         ///   <returns></returns>         publicstaticint CreateWebSite( string webSiteName,string physicalPath,string domainPort, bool isCreateAppPool)
      {
            DirectoryEntry root =new DirectoryEntry( ” IIS:// ” + HostName +” /W3SVC ”);
             //为新WEB站点查找一个未使用的ID             int siteID =1;
             foreach (DirectoryEntry ein root.Children)
            {
               if (e.SchemaClassName ==” IIsWebServer ”)
                {
                     int ID = Convert.ToInt32(e.Name);
                     if (ID >= siteID) { siteID = ID +1; }
                }
            }
             //创建WEB站点            DirectoryEntry site = (DirectoryEntry)root.Invoke( ” Create ”,” IIsWebServer ”, siteID);
            site.Invoke( ” Put ”,” ServerComment ”, webSiteName);
            site.Invoke( ” Put ”,” KeyType ”,” IIsWebServer ”);
            site.Invoke( ” Put ”,” ServerBindings ”, domainPort +” : ”);
            site.Invoke( ” Put ”,” ServerState ”,2);
            site.Invoke( ” Put ”,” FrontPageWeb ”,1);
            site.Invoke( ” Put ”,” DefaultDoc ”,” Default.html ”);
             //site.Invoke(“Put”, “SecureBindings”, ”:443:”);            site.Invoke( ” Put ”,” ServerAutoStart ”,1);
            site.Invoke( ” Put ”,” ServerSize ”,1);
            site.Invoke( ” SetInfo ”);
             //创建应用程序虚拟目录
            DirectoryEntry siteVDir = site.Children.Add( ” Root ”,” IISWebVirtualDir ”);
            siteVDir.Properties[ ” AppIsolated ”][ 0] =2;
            siteVDir.Properties[ ” Path ”][ 0] = physicalPath;
            siteVDir.Properties[ ” AccessFlags ”][ 0] =513;
            siteVDir.Properties[ ” FrontPageWeb ”][ 0] =1;
            siteVDir.Properties[ ” AppRoot ”][ 0] =” LM/W3SVC/ ” + siteID +” /Root ”;
            siteVDir.Properties[ ” AppFriendlyName ”][ 0] =” Root ”;

             if (isCreateAppPool)
            {
                DirectoryEntry apppools =new DirectoryEntry( ” IIS:// ” + HostName +” /W3SVC/AppPools ”);

                DirectoryEntry newpool = apppools.Children.Add(webSiteName,” IIsApplicationPool ”);
                newpool.Properties[ ” AppPoolIdentityType ”][ 0] =” 4 ”;// 4                newpool.Properties[ ” ManagedPipelineMode ”][ 0] =” 0 ”;// 0:集成模式 1:经典模式                newpool.CommitChanges();
                siteVDir.Properties[ ” AppPoolId ”][ 0] = webSiteName;
            }

            siteVDir.CommitChanges();
            site.CommitChanges();
             return siteID;
      }

         ///   <summary>
         ///得到网站的物理路径
         ///   </summary>
         ///   <param name=”rootEntry”> 网站节点 </param>
         ///   <returns></returns>         publicstaticstring GetWebsitePhysicalPath(DirectoryEntry rootEntry)
      {
             string physicalPath =“”;
             foreach (DirectoryEntry childEntryin rootEntry.Children)
            {
               if ((childEntry.SchemaClassName ==” IIsWebVirtualDir ”) && (childEntry.Name.ToLower() ==” root ”))
                {
                     if (childEntry.Properties[ ” Path ”].Value !=null)
                  {
                        physicalPath = childEntry.Properties[ ” Path ”].Value.ToString();
                  }
                     else
                  {
                        physicalPath =“”;
                  }
                }
            }
             return physicalPath;
      }

         ///   <summary>
         ///获取站点名
         ///   </summary>         publicstatic List<IISInfo> GetServerBindings()
      {
            List<IISInfo> iisList =new List<IISInfo>();
             string entPath = String.Format( ” IIS://{0}/w3svc ”, HostName);
            DirectoryEntry ent =new DirectoryEntry(entPath);
             foreach (DirectoryEntry childin ent.Children)
            {
               if (child.SchemaClassName.Equals( ” IIsWebServer ”, StringComparison.OrdinalIgnoreCase))
                {
                     if (child.Properties[ ” ServerBindings ”].Value !=null)
                  {
                         object objectArr = child.Properties[ ” ServerBindings ”].Value;
                         string serverBindingStr =string.Empty;
                         if (IsArray(objectArr)) // 如果有多个绑定站点时                        {
                           object[] objectToArr = ( object[])objectArr;
                            serverBindingStr = objectToArr[ 0].ToString();
                        }
                         else // 只有一个绑定站点                        {
                            serverBindingStr = child.Properties[ ” ServerBindings ”].Value.ToString();
                        }
                        IISInfo iisInfo =new IISInfo();
                        iisInfo.DomainPort = serverBindingStr;
                        iisInfo.AppPool = child.Properties[ ” AppPoolId ”].Value.ToString(); // 应用程序池                        iisList.Add(iisInfo);
                  }
                }
            }
             return iisList;
      }


         publicstaticbool CreateAppPool( string appPoolName,string Username,string Password)
      {
             bool issucess =false;
             try
            {
               // 创建一个新程序池                DirectoryEntry newpool;
                DirectoryEntry apppools =new DirectoryEntry( ” IIS:// ” + HostName +” /W3SVC/AppPools ”);
                newpool = apppools.Children.Add(appPoolName,” IIsApplicationPool ”);

               // 设置属性 访问用户名和密码 一般采取默认方式                newpool.Properties[ ” WAMUserName ”][ 0] = Username;
                newpool.Properties[ ” WAMUserPass ”][ 0] = Password;
                newpool.Properties[ ” AppPoolIdentityType ”][ 0] =” 3 ”;
                newpool.CommitChanges();
                issucess =true;
               return issucess;
            }
             catch//(Exception ex)             {
               returnfalse;
            }
      }


         ///   <summary>
         ///建立程序池后关联相应应用程序及虚拟目录
         ///   </summary>         publicstaticvoid SetAppToPool( string appname, string poolName)
      {
             // 获取目录            DirectoryEntry getdir =new DirectoryEntry( ” IIS://localhost/W3SVC ”);
             foreach (DirectoryEntry getentityin getdir.Children)
            {
               if (getentity.SchemaClassName.Equals( ” IIsWebServer ”))
                {
                     // 设置应用程序程序池 先获得应用程序 在设定应用程序程序池
                     // 第一次测试根目录                     foreach (DirectoryEntry getchildin getentity.Children)
                  {
                         if (getchild.SchemaClassName.Equals( ” IIsWebVirtualDir ”))
                        {
                           // 找到指定的虚拟目录.                           foreach (DirectoryEntry getsitein getchild.Children)
                            {
                                 if (getsite.Name.Equals(appname))
                              {
                                     // 【测试成功通过】                                    getsite.Properties[ ” AppPoolId ”].Value = poolName;
                                    getsite.CommitChanges();
                              }
                            }
                        }
                  }
                }
            }
      }


         ///   <summary>
         ///判断object对象是否为数组
         ///   </summary>         publicstaticbool IsArray( object o)
      {
             return ois Array;
      }
    }
}

文档来源:51CTO技术博客https://blog.51cto.com/u_11739124/3118150
页: [1]
查看完整版本: C# 操作IIS方法集合