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

[经验分享] 使用ADSI实现IIS管理,WEB站点管理系统核心代码

[复制链接]

尚未签到

发表于 2015-8-13 11:41:00 | 显示全部楼层 |阅读模式
DSC0000.gif DSC0001.gif 代码

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using System.DirectoryServices;
using IISMModel;
using System.Configuration;
using System.Web;

namespace IISMBLL
{
    /// <summary>
    /// IIS站点管理器
    /// </summary>
    public class IISManager
    {
        const string W3SVC_PATH = "IIS://localhost/W3SVC";
        // Access Flags
        const int MD_ACCESS_READ = 0x00000001; //Allow read access.
        const int MD_ACCESS_SCRIPT = 0x00000200; // Allow script execution.

        /// <summary>
        /// 验证某个虚拟目录是否存在
        /// </summary>
        /// <param name="baseSiteName">虚拟目录所在的基础站点</param>
        /// <param name="virtualDirName">虚拟目录名</param>
        /// <returns>存在返回真,否则返回假</returns>
        public Boolean ValidateVirWebSite(string baseSiteName,string virtualDirName)
        {
            if (string.IsNullOrEmpty(baseSiteName))
            {
                throw new Exception(IISModel_MSG.IISBLL_IISM_ERROR_VIRDIR_SITE_EMPTY);
            }

            if (string.IsNullOrEmpty(virtualDirName))
            {
                throw new Exception(IISModel_MSG.IISBLL_IISM_ERROR_VIRDIR);
            }

            // 站点ID
            int _WebSiteID = 1;
            _WebSiteID = GetSiteID(baseSiteName, "localhost");
            if (_WebSiteID == 0)
            {
                throw new Exception(IISModel_MSG.IISBLL_IISM_ERROR_VIRDIR_SITE_NOTFOUND);
            }

            String siteRoot = "IIS://localhost/W3SVC/" + _WebSiteID.ToString() + "/ROOT";
            DirectoryEntry root = new DirectoryEntry(siteRoot);
            foreach (DirectoryEntry child in root.Children)
            {
                if (child.Name.ToLower() == virtualDirName)
                {
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// 验证某个站点是否存在
        /// </summary>
        /// <param name="siteName"></param>
        /// <returns></returns>
        public Boolean ValidateWebSite(string siteName)
        {
            return
                GetSiteID(siteName, "localhost")>0;
        }

        /// <summary>
        /// 在主机上创建虚拟目录
        /// </summary>
        public void CreateVirWebSite(string _virtualDirName, string _physicalPath)
        {
            try
            {
                // 站点ID
                int _WebSiteID = 1;
                //得到默认站点
                _WebSiteID = GetSiteID(ConfigurationManager.AppSettings["defaultSite"], "localhost");
                if (_WebSiteID == 0)
                {
                    _WebSiteID = 1;
                }
                if (string.IsNullOrEmpty(_virtualDirName))
                {
                    throw new NullReferenceException("创建虚拟目录名不能为空");
                }

                String constIISWebSiteRoot = "IIS://localhost/W3SVC/" + _WebSiteID.ToString() + "/ROOT";
                string virtualDirName = _virtualDirName; //虚拟目录名称:Monitor
                string physicalPath = _physicalPath; //虚拟目录物理路径

                if (String.IsNullOrEmpty(physicalPath))
                {
                    throw new NullReferenceException("创建虚拟目录的物理路径不能为空");
                }

                DirectoryEntry root = new DirectoryEntry(constIISWebSiteRoot);

                // 如果虚拟目录存在则删除
                foreach (System.DirectoryServices.DirectoryEntry v in root.Children)
                {

                    if (v.Name == _virtualDirName)
                    {
                        // Delete the specified virtual directory if it already exists
                        try
                        {
                            root.Invoke("Delete", new string[] { v.SchemaClassName, _virtualDirName });
                            root.CommitChanges();
                        }
                        catch
                        {
                            throw;                             
                        }
                    }
                }

                DirectoryEntry tbEntry = root.Children.Add(virtualDirName, "IIsWebVirtualDir");
                 
                tbEntry.Properties["Path"][0] = physicalPath;  //虚拟目录物理路径
                tbEntry.Invoke("AppCreate", true);
                tbEntry.Properties["AccessRead"][0] = true;   //设置读取权限
                tbEntry.Properties["ContentIndexed"][0] = true;
                tbEntry.Properties["DefaultDoc"][0] = "index.aspx,Default.aspx"; //设置默认文档,多值情况下中间用逗号分割
                tbEntry.Properties["AppFriendlyName"][0] = virtualDirName; //虚拟目录名称:Monitor
                tbEntry.Properties["AccessScript"][0] = true; //执行权限
                tbEntry.Properties["AppIsolated"][0] = "1";
                tbEntry.Properties["DontLog"][0] = true;  // 是否记录日志                 
                tbEntry.Properties["AuthFlags"][0] = 1;// 设置目录的安全性,0表示不允许匿名访问,1为允许,3为基本身份验证,7为windows继承身份验证
                tbEntry.CommitChanges();

                // 增加MIME 的类型:flv
                //SetMimeTypeProperty(constIISWebSiteRoot, ".flv", "flv");

                // 修改IIS属性
                //SetSingleProperty("IIS://localhost/W3SVC/" + _WebSiteID.ToString(), "ServerBindings", ":8080:");

                ////得到现默认站点的IP 端口 描述        
                //string strServerBindings = root.Properties["ServerBindings"].Value.ToString();
                ////解出端口Port
                //string[] strArr = strServerBindings.Split(':');
                ////重新赋值为8080
                //root.Properties["ServerBindings"].Value = strArr[0] + ":8080:" + strArr[2];

                root.CommitChanges();//确认更改

            }
            catch
            {
                 
            }
        }

        /// <summary>
        /// 删除Web虚拟目录
        /// </summary>
        /// <param name="_virtualDirName"></param>
        public void RemoveVirWebSite(string _virtualDirName)
        {
            // 站点ID
            int _WebSiteID = 1;
            //得到默认站点
            _WebSiteID = GetSiteID(ConfigurationManager.AppSettings["defaultSite"], "localhost");
            if (_WebSiteID == 0)
            {
                _WebSiteID = 1;
            }
            if (string.IsNullOrEmpty(_virtualDirName))
            {
                throw new NullReferenceException("创建虚拟目录名不能为空");
            }

            String constIISWebSiteRoot = "IIS://localhost/W3SVC/" + _WebSiteID.ToString() + "/ROOT";
            string virtualDirName = _virtualDirName; //虚拟目录名称:Monitor

            using (DirectoryEntry root = new DirectoryEntry(constIISWebSiteRoot))
            {
                // 如果虚拟目录存在则删除
                foreach (System.DirectoryServices.DirectoryEntry v in root.Children)
                {
                    if (v.Name == _virtualDirName)
                    {
                        root.Invoke("Delete", new string[] { v.SchemaClassName, _virtualDirName });
                        root.CommitChanges();
                        break;
                    }
                }
                root.Close();  
            }
        }

        /// <summary>
        /// 创建独立的Web站点
        /// </summary>
        /// <param name="siteName"></param>
        /// <param name="realPath"></param>
        public void CreateWebSite(string siteName, string realPath)
        {
            if (string.IsNullOrEmpty(siteName))
            {
                throw new NullReferenceException("创建站点的站点名字不能为空");
            }
            if (string.IsNullOrEmpty(realPath))
            {
                throw new NullReferenceException("创建站点的站点真是路径不能为空");
            }

            DirectoryEntry root = new DirectoryEntry(W3SVC_PATH);

            //判断站点是否已经存在,如果存在,则删除已有站点
            int siteID = GetSiteID(siteName, "localhost");
            if (siteID > 0)
            {
                throw new Exception("要创建的站点已经存在");
            }

            siteID = getNewWebSiteID();
            DirectoryEntry currentWeb =
                root.Children.Add(siteID.ToString(), "IIsWebServer");
            currentWeb.CommitChanges();

            //currentWeb.Properties["Location"].Value = "/LM/W3SVC/" + siteID.ToString();
            currentWeb.Properties["AuthFlags"][0] = "0";
            currentWeb.Properties["MaxBandwidth"][0] = "1048576";
            currentWeb.Properties["MaxConnections"][0] = "10";
            currentWeb.Properties["ServerAutoStart"][0] = "true";
            currentWeb.Properties["ServerBindings"].Value = ":80:" + siteName;
            currentWeb.Properties["ServerComment"][0] = siteName;
            
            // 添加web虚拟目录
            DirectoryEntry virEntry = currentWeb.Children.Add("root","IIsWebVirtualDir");
            virEntry.CommitChanges();
            //virEntry.Properties["Location"].Value = "/LM/W3SVC/"+siteID.ToString()+"/root";
            virEntry.Properties["AccessFlags"][0] = MD_ACCESS_READ | MD_ACCESS_SCRIPT;
            virEntry.Properties["AppFriendlyName"][0] = siteName;
            virEntry.Properties["AppIsolated"][0] = "2";
            virEntry.Properties["AppRoot"][0] = "/LM/W3SVC/" + siteID.ToString() + "/Root";
            virEntry.Properties["AuthFlags"][0] = 1 | 7;// 设置目录的安全性,0表示不允许匿名访问,1为允许,3为基本身份验证,7为windows继承身份验证            
            virEntry.Properties["Path"][0] = realPath;  //虚拟目录物理路径
            
            virEntry.CommitChanges();
            currentWeb.CommitChanges();

            virEntry.Close();
            currentWeb.Close();
            root.Close();
        }

        /// <summary>
        /// 删除Web站点
        /// </summary>
        /// <param name="siteName"></param>
        public void RemoveWebSite(string siteName)
        {
            if (string.IsNullOrEmpty(siteName))
            {
                throw new NullReferenceException("创建站点的站点名字不能为空");
            }

            using (DirectoryEntry root = new DirectoryEntry(W3SVC_PATH))
            {
                foreach (DirectoryEntry Child in root.Children)
                {
                    if (Child.SchemaClassName == "IIsWebServer")
                    {
                        string WName = Child.Properties["ServerComment"][0].ToString();
                        if (siteName.ToLower() == WName.ToLower())
                        {
                            Child.DeleteTree();
                            root.CommitChanges();
                            break;
                        }   
                    }
                                       
                }
                root.Close();
            }

            
        }

        /// <summary>
        /// 得到新的站点ID
        /// </summary>
        /// <returns></returns>
        private int getNewWebSiteID()
        {
           using(System.DirectoryServices.DirectoryEntry rootEntry =  
               new System.DirectoryServices.DirectoryEntry(W3SVC_PATH))
           {
               int siteID = 1;
               //得到现有的站点标识
               foreach (System.DirectoryServices.DirectoryEntry entry in rootEntry.Children)
               {
                   if (entry.SchemaClassName == "IIsWebServer")
                   {
                       int ID = Convert.ToInt32(entry.Name);

                       if (ID >= siteID)
                       {
                           siteID = ID + 1;
                       }
                   }
               }
               rootEntry.Close();
               return siteID;
           }
        }

        #region 根据站点名称获取站点ID(标识)

        /// <summary>
        /// 根据站点名称获取站点ID(标识)
        /// </summary>
        /// <param name="webSiteName">站点名称</param>
        /// <param name="serverIP">主机IP</param>
        /// <returns>站点ID</returns>
        private int GetSiteID(string webSiteName, string serverIP)
        {
            int SiteID = 0;
            try
            {
                DirectoryEntry root = new DirectoryEntry(@"IIS://" + serverIP + "/W3SVC");                 
                foreach (DirectoryEntry Child in root.Children)
                {                     
                    string WName = Child.Properties["ServerComment"][0].ToString();
                    if (webSiteName == WName)
                    {                        
                        SiteID = Convert.ToInt32(Child.Name);
                        return SiteID;
                    }
                    WName = "";
                }
            }
            catch
            {
                SiteID = 0;
            }
            return SiteID;
        }

        #endregion

        /// <summary>
        /// 设置IIS的MIME类型,SetMimeTypeProperty("IIS://localhost/W3SVC/1/Root", ".hlp", "application/winhlp");
        /// </summary>
        /// <param name="metabasePath"></param>
        /// <param name="newExtension"></param>
        /// <param name="newMimeType"></param>
        static void SetMimeTypeProperty(string metabasePath, string newExtension, string newMimeType)
        {
            //  metabasePath is of the form "IIS://<servername>/<path>"
            //    for example "IIS://localhost/W3SVC/1/Root"  
            //  newExtension is of the form ".<extension>", for example, ".hlp"
            //  newMimeType is of the form "<application>", for example, "application/winhlp"
            Console.WriteLine("\nAdding {1}->{2} to the MimeMap property at {0}:", metabasePath, newExtension, newMimeType);

            try
            {
                DirectoryEntry path = new DirectoryEntry(metabasePath);
                PropertyValueCollection propValues = path.Properties["MimeMap"];
                Console.WriteLine(" Old value of MimeMap has {0} elements", propValues.Count);

                object exists = null;
                foreach (object value in propValues)
                {
                    // IISOle requires a reference to the Active DS IIS Namespace Provider in Visual Studio .NET
                    IISOle.IISMimeType mimetypeObj = (IISOle.IISMimeType)value;
                    Console.WriteLine("  {0}->{1}", mimetypeObj.Extension, mimetypeObj.MimeType);
                    if (newExtension == mimetypeObj.Extension)
                        exists = value;
                }

                if (null != exists)
                {
                    propValues.Remove(exists);
                    Console.WriteLine(" Found an entry for {0}; removing it before adding the new one.", newExtension);
                }

                IISOle.MimeMapClass newObj = new IISOle.MimeMapClass();
                newObj.Extension = newExtension;
                newObj.MimeType = newMimeType;
                propValues.Add(newObj);
                path.CommitChanges();
                Console.WriteLine(" Done.");

            }
            catch (Exception ex)
            {
                if ("HRESULT 0x80005006" == ex.Message)
                    Console.WriteLine(" Property MimeMap does not exist at {0}", metabasePath);
                else
                    Console.WriteLine("Failed in SetMimeTypeProperty with the following exception: \n{0}", ex.Message);
            }
        }

        /// <summary>
        /// 修改IIS属性
        /// </summary>
        /// <param name="metabasePath"></param>
        /// <param name="propertyName"></param>
        /// <param name="newValue"></param>
        static void SetSingleProperty(string metabasePath, string propertyName, object newValue)
        {
            //  metabasePath is of the form "IIS://<servername>/<path>"
            //    for example "IIS://localhost/W3SVC/1"  
            //  propertyName is of the form "<propertyName>", for example "ServerBindings"
            //  value is of the form "<intStringOrBool>", for example, ":80:"
            Console.WriteLine("\nSetting single property at {0}/{1} to {2} ({3}):",
                metabasePath, propertyName, newValue, newValue.GetType().ToString());

            try
            {
                DirectoryEntry path = new DirectoryEntry(metabasePath);
                PropertyValueCollection propValues = path.Properties[propertyName];
                string oldType = propValues.Value.GetType().ToString();
                string newType = newValue.GetType().ToString();
                Console.WriteLine(" Old value of {0} is {1} ({2})", propertyName, propValues.Value, oldType);
                if (newType == oldType)
                {
                    path.Properties[propertyName][0] = newValue;
                    path.CommitChanges();
                    Console.WriteLine("Done");
                }
                else
                    Console.WriteLine(" Failed in SetSingleProperty; type of new value does not match property");
            }
            catch (Exception ex)
            {
                if ("HRESULT 0x80005006" == ex.Message)
                    Console.WriteLine(" Property {0} does not exist at {1}", propertyName, metabasePath);
                else
                    Console.WriteLine("Failed in SetSingleProperty with the following exception: \n{0}", ex.Message);
            }
        }
         
        /// <summary>
        /// 创建FTP虚拟目录
        /// </summary>
        /// <param name="virDirName"></param>
        /// <param name="realPath"></param>
        public void CreateFTPVirDir(string virDirName,string realPath)
        {
              string   strSchema=   "IIsFtpVirtualDir";   
              string   strRootSubPath   =   "/MSFTPSVC/1/Root";

              string FtpName = virDirName;
              string DirName = realPath;   
                 
              DirectoryEntry   deRoot=   new   DirectoryEntry("IIS://localhost"+   strRootSubPath);

              try
              {
                  deRoot.RefreshCache();   
                  DirectoryEntry   deNewVDir   =   deRoot.Children.Add(FtpName,strSchema);   
                     
                  //deNewVDir.Properties["Path"].Insert(0,DirName);
                  deNewVDir.Properties["Path"][0] = DirName;
                  deNewVDir.Properties["AccessRead"][0] = true;
                  deNewVDir.Properties["AccessWrite"][0] = true;
        
                  deNewVDir.CommitChanges();   
                  deRoot.CommitChanges();                    
                  deNewVDir.Close();   
                  deRoot.Close();   
              }
              catch (Exception)
              {
                  
                  throw;
              }
        }

        /// <summary>
        /// 删除FTP虚拟目录
        /// </summary>
        /// <param name="virDirName"></param>
        public void RemoveFTPVirDir(string virDirName)
        {
            string strSchema = "IIsFtpVirtualDir";
            string strRootSubPath = "/MSFTPSVC/1/Root";
            string FtpName = virDirName;

            using (DirectoryEntry root = new DirectoryEntry("IIS://localhost" + strRootSubPath))
            {
                root.RefreshCache();
                //如果虚拟目录存在则删除
                foreach (DirectoryEntry item in root.Children)
                {                     
                    if (item.Name == virDirName)
                    {
                        root.Invoke("Delete", new string[] { strSchema, virDirName });
                        root.CommitChanges();
                        break;
                    }
                }
                root.Close();
            }
        }

        public string GetBaseUrl(HttpContext context)
        {
            return
                context.Request.Url.Scheme + "://" +
                context.Request.Url.Authority +  
                context.Request.ApplicationPath;
        }
    }

}




  

运维网声明 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-98425-1-1.html 上篇帖子: WCF IIS 用户名消息安全 可能碰到的问题 下篇帖子: XP Home版也玩IIS
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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