现在的位置: 首页 > 综合 > 正文

利用C#创建 IIS 站点并设置.NET Framework版本为ASP.NET 2.0 的方法(一)

2013年12月05日 ⁄ 综合 ⁄ 共 12657字 ⁄ 字号 评论关闭
利用C#创建 IIS 站点并设置.NET Framework版本为ASP.NET 2.0 的方法(一) 

IIS 6.0以后使用MetaBase.xml存储IIS信息,因此,可以直接修改这个文件即可。

代码如下: 很显然,这种方法比较复杂,不直观,而且需要停止IIS,影响现有网站。

 

/// <summary>
/// 本方法创建一个站点(当然,创建虚拟目录也完全没有任何问题,做法类似),并设置IIS中ASP.NET版本为2.0
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
    
//站点名称和物理路径
    String webSiteName = "mengxianhui";
    String pathToRoot 
= @"c:/mengxianhui";
    DirectoryEntry root 
= new DirectoryEntry("IIS://localhost/W3SVC");// Find unused ID value for new web site
    int siteID = 1;
    
//得到现有的站点标识
    foreach (DirectoryEntry entry in root.Children)
    {
        
if (entry.SchemaClassName == "IIsWebServer")
        {                    
            
int ID = Convert.ToInt32(entry.Name);

            if (ID >= siteID)
            {
                siteID 
= ID + 1;
            }
       }
    }

    //利用配置文件的做法创建站点,需要先停止原来的服务,以便能够顺利写入数据
    label1.Text = "正在停止服务……";
    Application.DoEvents();
    System.ServiceProcess.ServiceController mobServiceController3 
= new System.ServiceProcess.ServiceController("IISAdmin");
    
foreach (System.ServiceProcess.ServiceController dependentService in mobServiceController3.DependentServices)
    {
        
switch (dependentService.Status)
        {
            
case ServiceControllerStatus.Stopped:
                
break;

            case ServiceControllerStatus.StopPending:
                dependentService.WaitForStatus(ServiceControllerStatus.Stopped);
                
break;

            default:
                dependentService.Stop();
                dependentService.WaitForStatus(ServiceControllerStatus.Stopped);
                
break;
        }

    }
    if (mobServiceController3.Status != ServiceControllerStatus.Stopped)
    {
        mobServiceController3.Stop();
        mobServiceController3.WaitForStatus(ServiceControllerStatus.Stopped);
    }
    
//确保服务完全停止
    label1.Text = "停止服务完成!";
    Application.DoEvents();
    String ConfigPath 
= System.Environment.SystemDirectory + @"/inetsrv/MetaBase.xml";
    System.Xml.XmlDocument doc 
= new System.Xml.XmlDocument();
    doc.Load(ConfigPath);

    System.Xml.XmlNamespaceManager xnm = new System.Xml.XmlNamespaceManager(doc.NameTable);
    xnm.AddNamespace(
"mxh""urn:microsoft-catalog:XML_Metabase_V64_0");

    //得到最大的网站的标识,要在其后面加入节点
    string SiteLocation = "/LM/W3SVC/" + (siteID - 1);
    System.Xml.XmlNode LastWebServer 
= doc.SelectSingleNode("/mxh:configuration/mxh:MBProperty/mxh:IIsWebVirtualDir[@Location='" + SiteLocation + "/root']", xnm);
    
if (LastWebServer == null)
    {
        MessageBox.Show(
"没有现有的 Web 服务器。");
        doc 
= null;
        
return;
    }

    //找到AdminACL设置,每次都是变化的 -_-!
    System.Xml.XmlNode LastWebServerFilter = doc.SelectSingleNode("/mxh:configuration/mxh:MBProperty/mxh:IIsFilters[@Location='" + SiteLocation + "/filters']/@AdminACL", xnm);
    
if (LastWebServer == null)
    {
        MessageBox.Show(
"没有现有的 Web 服务器 filters。");
        doc 
= null;
        
return;
    }

    String LastWebServerFilterAdminAcl = LastWebServerFilter.Value;
    
    
//创建新站点
    label1.Text = "创建新站点……";
    Application.DoEvents();
    String NewSiteID 
= "/LM/W3SVC/" + siteID.ToString();
    System.Xml.XmlNode NewWebServer 
= doc.CreateNode(System.Xml.XmlNodeType.Element, """IIsWebServer""urn:microsoft-catalog:XML_Metabase_V64_0");
    System.Xml.XmlAttribute NewWebServerLocation 
= doc.CreateAttribute("Location");
    NewWebServerLocation.Value 
= NewSiteID;
    NewWebServer.Attributes.Append(NewWebServerLocation);

    NewWebServerLocation = doc.CreateAttribute("AuthFlags");
    NewWebServerLocation.Value 
= "0";
    NewWebServer.Attributes.Append(NewWebServerLocation);

    NewWebServerLocation = doc.CreateAttribute("ServerAutoStart");
    NewWebServerLocation.Value 
= "TRUE";
    NewWebServer.Attributes.Append(NewWebServerLocation);

    NewWebServerLocation = doc.CreateAttribute("ServerBindings");
    NewWebServerLocation.Value 
= ":802:";
    NewWebServer.Attributes.Append(NewWebServerLocation);

    NewWebServerLocation = doc.CreateAttribute("ServerComment");
    NewWebServerLocation.Value 
= webSiteName;
    NewWebServer.Attributes.Append(NewWebServerLocation);
    LastWebServer.ParentNode.InsertAfter(NewWebServer, LastWebServer);

    System.Xml.XmlNode NewWebServerFilter = doc.CreateNode(System.Xml.XmlNodeType.Element, """IIsFilters""urn:microsoft-catalog:XML_Metabase_V64_0");
    NewWebServerLocation 
= doc.CreateAttribute("Location");
    NewWebServerLocation.Value 
= NewSiteID + "/filters";
    NewWebServerFilter.Attributes.Append(NewWebServerLocation);

    NewWebServerLocation = doc.CreateAttribute("AdminACL");
    NewWebServerLocation.Value 
= LastWebServerFilterAdminAcl;
    NewWebServerFilter.Attributes.Append(NewWebServerLocation);

    NewWebServer.ParentNode.InsertAfter(NewWebServerFilter, NewWebServer);            

    System.Xml.XmlNode IIsWebVirtualDir = doc.CreateNode(System.Xml.XmlNodeType.Element, """IIsWebVirtualDir""urn:microsoft-catalog:XML_Metabase_V64_0");
    NewWebServerLocation 
= doc.CreateAttribute("Location");
    NewWebServerLocation.Value 
= NewSiteID + "/root";
    IIsWebVirtualDir.Attributes.Append(NewWebServerLocation);

    NewWebServerLocation = doc.CreateAttribute("AccessFlags");
    NewWebServerLocation.Value 
= "AccessRead | AccessScript";
    IIsWebVirtualDir.Attributes.Append(NewWebServerLocation);

    NewWebServerLocation = doc.CreateAttribute("AppFriendlyName");
    NewWebServerLocation.Value 
= "默认应用程序";
    IIsWebVirtualDir.Attributes.Append(NewWebServerLocation);

    NewWebServerLocation = doc.CreateAttribute("AppIsolated");
    NewWebServerLocation.Value 
= "2";
    IIsWebVirtualDir.Attributes.Append(NewWebServerLocation);

    NewWebServerLocation = doc.CreateAttribute("AppRoot");
    NewWebServerLocation.Value 
= NewSiteID + "/Root";
    IIsWebVirtualDir.Attributes.Append(NewWebServerLocation);

    NewWebServerLocation = doc.CreateAttribute("AuthFlags");
    NewWebServerLocation.Value 
= "AuthAnonymous | AuthNTLM";
    IIsWebVirtualDir.Attributes.Append(NewWebServerLocation);

    //关于权限,可以任意组合
    NewWebServerLocation = doc.CreateAttribute("DirBrowseFlags");
    NewWebServerLocation.Value 
= "DirBrowseShowDate | DirBrowseShowTime | DirBrowseShowSize | DirBrowseShowExtension | DirBrowseShowLongDate | EnableDefaultDoc";
    IIsWebVirtualDir.Attributes.Append(NewWebServerLocation);

    NewWebServerLocation = doc.CreateAttribute("Path");
    NewWebServerLocation.Value 
= pathToRoot;
    IIsWebVirtualDir.Attributes.Append(NewWebServerLocation);

    //为安全起见,下面的系统文件夹需要使用程序的方法获取,如System.Environment.SystemDirectory,和System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()
    
//这里为了简单期间,直接写入
    string ScriptMaps = @".asp,C:/WINDOWS/system32/inetsrv/asp.dll,5,GET,HEAD,POST,TRACE
                .cer,C:/WINDOWS/system32/inetsrv/asp.dll,5,GET,HEAD,POST,TRACE
                .cdx,C:/WINDOWS/system32/inetsrv/asp.dll,5,GET,HEAD,POST,TRACE
                .asa,C:/WINDOWS/system32/inetsrv/asp.dll,5,GET,HEAD,POST,TRACE
                .idc,C:/WINDOWS/system32/inetsrv/httpodbc.dll,5,GET,POST
                .shtm,C:/WINDOWS/system32/inetsrv/ssinc.dll,5,GET,POST
                .shtml,C:/WINDOWS/system32/inetsrv/ssinc.dll,5,GET,POST
                .stm,C:/WINDOWS/system32/inetsrv/ssinc.dll,5,GET,POST
                .asax,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .ascx,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .ashx,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG
                .asmx,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG
                .aspx,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG
                .axd,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG
                .vsdisco,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG
                .rem,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG
                .soap,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG
                .config,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .cs,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .csproj,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .vb,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .vbproj,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .webinfo,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .licx,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .resx,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .resources,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .xoml,C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG
                .rules,C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG
                .master,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .skin,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .compiled,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .browser,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .mdb,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .jsl,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .vjsproj,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .sitemap,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .msgx,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG
                .ad,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .dd,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .ldd,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .sd,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .cd,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .adprototype,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .lddprototype,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .sdm,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .sdmDocument,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .ldb,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .svc,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG
                .mdf,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .ldf,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .java,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .exclude,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
                .refresh,c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG
";

    NewWebServerLocation = doc.CreateAttribute("ScriptMaps");
    NewWebServerLocation.Value 
= ScriptMaps;
    IIsWebVirtualDir.Attributes.Append(NewWebServerLocation);

    NewWebServerFilter.ParentNode.InsertAfter(IIsWebVirtualDir, NewWebServerFilter);
    doc.Save(ConfigPath);
    doc = null;

    label1.Text = "创建站点完成!";
    mobServiceController3 
= null;
    mobServiceController3 
= new System.ServiceProcess.ServiceController("w3svc");
    mobServiceController3.Start();
    mobServiceController3.WaitForStatus(ServiceControllerStatus.Running);
    mobServiceController3 
= null;
    label1.Text 
= "恭喜你,全部工作完成!";
    MessageBox.Show(
"恭喜你,全部工作完成!");
}

 

抱歉!评论已关闭.