设为首页 收藏本站
查看: 917|回复: 0

[经验分享] C#深入操作IIS技术(创建配置站点和设置IIS Web服务扩展) .

[复制链接]

尚未签到

发表于 2015-8-16 07:03:35 | 显示全部楼层 |阅读模式
  1、新建站点
  DirectoryEntry serviceEntry = new DirectoryEntry("IIS://localhost/W3SVC");
  int SiteID = this.GetSiteID();//这里我们获取一个网站的名称,这里需要说明一下的是我们IIS默认安装完成后会有一个默认的站点,这个默 认站点的名称就是1,为了避免我们这里新建的站点我名字与IIS现有的站点名称相同,所以我用GetSiteID()自动得到一个名称,这个函数的实现下面会给出
  DirecotryEntry newEntry = serviceEntry.Children.Add(SiteID.ToString(), "IIsWebServer");
  newEntry.Properties["ServerComment"].Value = "MyWebSite";//这里是设置站点的别名
  int nPort = this.GenerateSitePort(Port);//这里得到一个端口号,由于端口号会出现重复,所以我用GenerateSitePort函数进行处理,如果Port在当前IIS中没有使用,则返回Port,如果使用了,侧随机分配一个,这个函数下面也会给出
  newEntry.Properties["ServerBindings"].Value = ServerIP + ":" + nPort + ":";//这一句设置站点的IP地址和端口号
  newEntry.CommitChanges();//到些站点我们创建完成
  2、创建虚拟目录和应用程序
  DirectoryEntry vdEntry = null;//这里会判断当前站点下是否存在虚拟目录,因为我发现在Windows Server 2003和WindowsServer 2008上面是不一样的,有些是创建完站点它自动为你添加一个虚拟目录,有些则不会,所以这里为了实现通用性,我们判断一下,有的话就去Find查找到,没有就Add添加一个
  if (this.ExistVirtualDirectory(newEntry))
{
     vdEntry = newEntry.Children.Find("ROOT", "IIsWebVirtualDir");
}
else
{
     vdEntry = newEntry.Children.Add("ROOT", "IIsWebVirtualDir");
}
  vdEntry.Properties["Path"].Value = WebSitePath;//这个WebSitePath是站点主目录的路径
vdEntry.CommitChanges();//虚拟目录创建完成
  
vdEntry.Invoke("AppCreate", true);//这里是创建应用程序
vdEntry.Properties["AppFriendlyName"].Value = "默认应用程序";//应用程序的名称
vdEntry.Properties["AccessRead"][0] = true;//读取访问的权限
vdEntry.Properties["AccessScript"][0] = true;//脚本访问权限 PS:可根据需要开放权限
vdEntry.CommitChanges();//应用程序添加完成
  serviceEntry.CommitChanges();//整个站点创建和配置完成
  
  
  //下面我把上面用到的几个函数的代码提供出来
  
  //为新站点分配名称
  private int GetSiteID()
{
     int Result = 1;
     DirectoryEntry serviceEntry = new DirectoryEntry("IIS://localhost/W3SVC");
     foreach (DirecotryEntry entry in serviceEntry.Children)
    {
        if (entry.SchemaClassName == "IIsWebServer")
        {
            int SiteID = 1;
            try
            {
                SiteID = int.Parse(entry.Name);
            }
            catch{continue;};
            if (SiteID == Result)
            {
                Result++;
            }
        }
    }
    return Result;
}
  //获取端口号
  private int GenerateSitePort(int Port)
{
     if (this.SitePortExist(Port))
     {
         Random rand = new Random();
         int newPort = rand.Next(1025, 65535);
         return GenerateSitePort(newPort);
     }
     else
     {
         return Port;
     }
}
  //判断端口号是否存在,true存在,false不存在
  private bool SitePortExist(int Port)
{
     DirectoryEntry serviceEntry = new DirectoryEntry("IIS://localhost/W3SVC");
     foreach (DirectoryEntry entry in serviceEntry.Children)
     {
         if (entry.SchemaClassName == "IIsWebServer")
         {
             if (entry.Properties["ServerBindings"].Value != null)
             {
                 string Binding = entry.Properties["ServerBindings"].Value.ToString().Trim();
                 //这个IP和端口的绑定IIS中是以冒号分隔的,如:127.0.0.1:8000:形式,所以这里我们要分隔一下,取第二个就是端口了
                 string[] Info = Binding.Split(':');
                 if (Port.ToString().Trim() == Info[1].Trim())
                 {
                      return true;
                 }
                 break;
              }
          }
     }
     return false;
}
  3、设置Web服务扩展
  这一点也是让我比较头痛的,查找了N久的MSDN才大概了解怎么做
  在这里因为我的需要,我是需要使用2.0的框架支持,因为Windows Server 2003默认都为安装1.1的框架,所以为了避免这两个的冲突,我在这里判断IIS当前安装的版本
  private void RegisterIIS(string InstallPath)
{
    try
    {
        DirectoryEntry service = new DirectoryEntry("IIS://localhost/W3SVC");
        bool ExistLow = false;//是否存在1.1
        bool ExistHigh = false;//是否存在2.0
        if (service.Properties["WebSvcExtRestrictionList"] == null)
        {
            return;
        }
  //service.Properties["WebSvcExtRestrictionList"]会得到当前IIS的所有Web服务扩展选项,这们这里遍历查找安装了哪些版本的framework
        for (int i = 0; i < service.Properties["WebSvcExtRestrictionList"].Count; i++)
        {
            if (service.Properties["WebSvcExtRestrictionList"].ToString().Trim().IndexOf("ASP.NET v1.1.4322") > -1)
            {
                ExistLow = true;
                break;
            }
            if (service.Properties["WebSvcExtRestrictionList"].ToString().Trim().IndexOf("ASP.NET v2.0.50727") > -1)
            {
                ExistHigh = true;
                break;
            }
        }
  //----begin---因为避免两个版本的冲突,所以这里判断如果存在低版本或高版本的没有安装,这里都会运行一个批处理来卸载所有版本,安装2.0版本
  //这个&#8220;注册IIS.bat&#8221;其实就是下面两行      
  //                   %WINDIR%/Microsoft.NET/Framework/v2.0.50727/aspnet_regiis -ua
  //                   %WINDIR%/Microsoft.NET/Framework/v2.0.50727/aspnet_regiis -i
  
  if (ExistLow == true || ExistHigh == false)
        {
            Process process = new Process();
            process.StartInfo.FileName = InstallPath.TrimEnd('//') + "//注册IIS.bat";
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.CreateNoWindow = true;
            process.Start();
            process.WaitForExit();
            process.Close();
        }
  //--end----
  //这里就是关键了,因为即使安装了2.0版本,但ASP.NET v2.0.50727这一项可能是禁用状态,所以我要启用它
          //这里调用了EnableWebServiceExtension方法,从方法的名称我们可以看出这个函数就是启用Web服务扩展的方法
          //同时在这里我也介绍几个其它的方法
          //DisableWebServiceExtension----表示禁用某一个Web服务扩展,参数就是Web服务扩展的名称
          //RemoveApplication-----------------删除应用程序
          //.....等等,感兴趣的话,大家可以查一下MSDN,这个是提供了很多方法供大家使用
  service.Invoke("EnableWebServiceExtension", "ASP.NET v2.0.50727");
     }
     catch { }
}
  
  
  
  那么这里我们对IIS创建站点,以及站点的设置和IIS的配置就完成了,但是程序中还有一些隐患,就是我们创建的站点的别名是不能相同的,在这里我也用一个函数进行了处理
  //清除相同别名的站点
  private void ClearSameSite(string SiteAlias)
{
    DirectoryEntry rootEntry = new DirectoryEntry("IIS://localhost/W3SVC");
    foreach (DirectoryEntry entry in rootEntry.Children)
    {
        if (entry.SchemaClassName == "IIsWebServer")
        {
            if (entry.Properties["ServerComment"].Value != null && entry.Properties["ServerComment"].Value.ToString().Trim() == SiteAlias)
           {
                  rootEntry.Children.Remove(entry);
                  break;
           }
        }
    }
  }
  
  那么我用了一个函数对创建站点进行了整合
  private void CreateNewWebSite(string SiteAlias, string IPAddress, int Port, string DirPath)
{
     this.ClearSameSite(SiteAlias);
  DirectoryEntry serviceEntry = new DirectoryEntry("IIS://localhost/W3SVC");
     int SiteID = this.GetSiteID();
     DirecotryEntry newEntry = serviceEntry.Children.Add(SiteID.ToString(), "IIsWebServer");
     newEntry.Properties["ServerComment"].Value = SiteAlias;
     int nPort = this.GenerateSitePort(Port);
     newEntry.Properties["ServerBindings"].Value = IPAddress+ ":" + nPort + ":";
     newEntry.CommitChanges();
  DirectoryEntry vdEntry = null;
     if (this.ExistVirtualDirectory(newEntry))
     {
          vdEntry = newEntry.Children.Find("ROOT", "IIsWebVirtualDir");
     }
     else
     {
         vdEntry = newEntry.Children.Add("ROOT", "IIsWebVirtualDir");
     }
     vdEntry.Properties["Path"].Value = DirPath;
     vdEntry.CommitChanges();
  vdEntry.Invoke("AppCreate", true);
     vdEntry.Properties["AppFriendlyName"].Value = "默认应用程序";
     vdEntry.Properties["AccessRead"][0] = true;
     vdEntry.Properties["AccessScript"][0] = true;
     vdEntry.CommitChanges();
  serviceEntry.CommitChanges();
}
  
  PS:还有一个简单的办法启用"ASP.NET v2.0.50727",那就是把上面的脚本文件改为下面两行
  %WINDIR%/Microsoft.NET/Framework/v2.0.50727/aspnet_regiis -ua
  %WINDIR%/Microsoft.NET/Framework/v2.0.50727/aspnet_regiis -i -enable
  当然要是控制其它的项可能就得用上面的程序来实现了

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-99491-1-1.html 上篇帖子: Log Parser 将 IIS Log(IIS 日志)导入到数据库(Sql Server) 中 下篇帖子: 运行 ASP.NET 的进程帐户必须具有对 IIS 元数据库(如 IIS://servername/W3SVC)的读访问权
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表