`
paulfzm
  • 浏览: 873886 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

添加域名、虚拟目录到主机头值

阅读更多

本文介绍了ASP.NET如何通过WMI创建站点、添加虚拟目录和添加主机头。并且已在Windows Server 2003及IIS6的环境下测试通过。

这玩意儿花了老子3天时间才搞定,用了几个小时写代码,而且当中还花了不少时间解决Win32: Access denied error的问题。当然我要指出的是,无论NETWORK SERVER帐户还是IUSR_<servername>帐户都不要设置过大的权限。对于WMI和IIS metabase的安全机理,我还是一无所知的。我只不过解决问题而已。

看代码

首先要从Internet信息服务(IIS)管理器中获取网站标识符,点击“网站”根节点,右侧“标识符”显示的就是网站的ID。默认网站的标识符通常是1。

获取网站标识的功能,我们要用到一个namespace,代码如下:

using System.Management;

下文所有’ServerName’都表示你的服务器名称,或者如果你的代码是本地运行的,也可以用一个点来表示。

创建一个站点,你会用到如下函数。这个函数返回新网站的ID,这样你可以进一步对这个网站进行操作。

public static string CreateWebsite(string serverName, string appPoolName, string ip,string pathToRoot, string hostName, string domainName, int port)
{
    ConnectionOptions options = new ConnectionOptions();
    options.Authentication = AuthenticationLevel.Connect;
    options.EnablePrivileges = true;
    options.Impersonation = ImpersonationLevel.Impersonate;
    ManagementScope scope = new ManagementScope(string.Format(@\\{0}\root\MicrosoftIISv2,
                            serverName), options);
    scope.Connect();
    ManagementObject oW3SVC = new ManagementObject(scope,
    new ManagementPath(@"IIsWebService='W3SVC'"), null);

    ManagementBaseObject[] serverBindings = new ManagementBaseObject[1];
    serverBindings[0] = CreateServerBinding(scope,
                        string.Format("{0}.{1}", hostName, domainName), ip, port);
    ManagementBaseObject inputParameters = oW3SVC.GetMethodParameters("CreateNewSite");
    inputParameters["ServerComment"] = string.Format("{0}.{1}", hostName, domainName);
    inputParameters["ServerBindings"] = serverBindings;
    inputParameters["PathOfRootVirtualDir"] = pathToRoot;
    ManagementBaseObject outParameter =
      oW3SVC.InvokeMethod("CreateNewSite", inputParameters, null);

    string siteId = Convert.ToString(
     outParameter.Properties["ReturnValue"].Value).Replace(
     "IIsWebServer='W3SVC/", "").Replace("'", "");
    ManagementObject oWebVirtDir = new ManagementObject(scope,
    new ManagementPath(string.Format(
        @"IIsWebVirtualDirSetting.Name='W3SVC/{0}/root'", siteId)), null);
    oWebVirtDir.Properties["AppFriendlyName"].Value =
             string.Format("{0}.{1}", hostName, domainName);
    oWebVirtDir.Properties["AccessRead"].Value = true;
    oWebVirtDir.Properties["AuthFlags"].Value = 5; // Integrated Windows Auth.
    oWebVirtDir.Properties["AccessScript"].Value = true;
    oWebVirtDir.Properties["AuthAnonymous"].Value = true;
    oWebVirtDir.Properties["AppPoolId"].Value = appPoolName;
    oWebVirtDir.Put();

    ManagementObject site = new ManagementObject(scope,
      new ManagementPath(Convert.ToString(
      outParameter.Properties["ReturnValue"].Value)), null);
    site.InvokeMethod("Start", null);
    return siteId;
}

创建一个虚拟目录:

public static void AddVirtualFolder(string serverName, string websiteId,string name, string path)
{
    ManagementScope scope = new ManagementScope(string.Format(@"\\{0}\root\MicrosoftIISV2", serverName));
    scope.Connect();

    string siteName = string.Format("W3SVC/{0}/Root/{1}", websiteId, name);

    ManagementClass mc = new ManagementClass(scope,new ManagementPath("IIsWebVirtualDirSetting"), null);
    ManagementObject oWebVirtDir = mc.CreateInstance();

    oWebVirtDir.Properties["Name"].Value = siteName;
    oWebVirtDir.Properties["Path"].Value = path;
    oWebVirtDir.Properties["AuthFlags"].Value = 5; // Integrated Windows Auth.
    oWebVirtDir.Properties["EnableDefaultDoc"].Value = true;
    // date, time, size, extension, longdate ;
    oWebVirtDir.Properties["DirBrowseFlags"].Value = 0x4000003E;
    oWebVirtDir.Properties["AccessFlags"].Value = 513; // read script
    oWebVirtDir.Put();

    ManagementObject mo = new ManagementObject(scope,
      new System.Management.ManagementPath("IIsWebVirtualDir='" +
      siteName + "'"), null);
    ManagementBaseObject inputParameters = mo.GetMethodParameters("AppCreate2");
    inputParameters["AppMode"] = 2;
    mo.InvokeMethod("AppCreate2", inputParameters, null);
    mo = new ManagementObject(scope, new System.Management.ManagementPath(
             "IIsWebVirtualDirSetting='" + siteName + "'"), null);
    mo.Properties["AppFriendlyName"].Value = name;
    mo.Put();
}

给网站添加一个主机头:

public static void AddHostHeader(string serverName, string hostHeader, string ip, int port, string websiteID)
{
    ManagementScope scope = new ManagementScope(string.Format(
           @"\\{0}\root\MicrosoftIISV2", serverName));
    scope.Connect();

    string siteName = string.Format("'W3SVC/{0}'", websiteID);

    ManagementObject mo = new ManagementObject(scope,
      new System.Management.ManagementPath("IIsWebServerSetting=" + siteName), null);
    ManagementBaseObject[] websiteBindings =
      (ManagementBaseObject[])mo.Properties["ServerBindings"].Value;

    ManagementObject mco = CreateServerBinding(scope, hostHeader, ip, port);

    ManagementBaseObject[] newWebsiteBindings =
      new ManagementBaseObject[websiteBindings.Length+1];
    websiteBindings.CopyTo(newWebsiteBindings, 0);
    newWebsiteBindings[newWebsiteBindings.Length - 1] = mco;

    mo.Properties["ServerBindings"].Value = newWebsiteBindings;

    mo.Put();
}

最后别忘了这个函数,它可以为网站绑定一个网络标识。

private static ManagementObject CreateServerBinding(ManagementScope scope,string hostName, string ip, int port)
{
    ManagementClass mc = new ManagementClass(scope,
           new ManagementPath("ServerBinding"), null);
    ManagementObject mco = mc.CreateInstance();

    mco.Properties["Hostname"].Value = hostName;
    mco.Properties["IP"].Value = ip;
    mco.Properties["Port"].Value = port;
    mco.Put();

    return mco;
}
 

注意的几点

安全。如果之用上面的那坨代码还不行。我千方百计想让其运行,但貌似忽视了2件事情。访问WMI和IIS metabase。

ASP.NET在Windows Server 2003和IIS6.0上运行默认使用的是NETWORK SERVICE帐户。但是,我们还是要使用客户端模拟。

所以在Web.config中添加下面一个配置:

<identity impersonate="true" />
 

使用了这个配置,IUSR_<servername>会使用客户端模拟的方式去访问IIS metabase。在后面的文章里,我就用IUSR_来表示这个帐户。不要忘记,在IUSR_后面加上你的服务器名称才是这个帐户的名字。

WMI权限设置

  • 控制面板 –> 管理工具 –> 计算机管理 –> 服务和应用程序。
  • 右键WMI控制,点击“属性”。
  • 选择“安全”选项卡。
  • 展开Root树
  • 点击MicrosoftIISv2。
  • 点击“安全设置”。
  • 点击“高级”。
  • 双击IUSR_(如果“组或用户名称”里面没有的话,就把它添加进去)
  • 把IUSR_ “应用到”设置成“这个名称控件和子名称空间”
  • “允许”所有权限。
  • 所有窗口都点击“确定”。

IIS metabase权限设置

  • 下载并安装IIS6 Resource Kit
  • 运行MetaBase Explorer (在开始菜单的IIS Resource Kit中可以找到)。
  • 展开树形目录,右键第一个或第二个节点并且选择“Permissions”。
  • 如果提示你“The current key inherits its security permissions from the key /”,点击“是”。
  • 选择“IIS_IUSRS”,如果没有的话,把它添加进去。
  • 选择“Full Control”。
  • 所有窗口都点击“确定”。

有了足够的权限就能运行了。

如果有高人能对这个方法谈谈自己的感想,并且能指出更好的配置IIS和WMI的方法,那就更赞了。记得之前,我都是自己捣鼓出来的,所以我不知道这个方法是不是最佳的方案。

如果你在运行代码的时候碰到任何问题,我愿意效劳。

分享到:
评论

相关推荐

    虚拟主机管理(功能强大,全面,智能)

    虚拟主机系统是针对网络公司销售域名、主机、邮局、数据库等产品时效率低、管理难等问题而自主研发的集产品自动化开通、管理、续费、升级等功能为一体的软件系统。通过多年的改进与运作,软件已具有功能强大、安全...

    EasyHost虚拟主机管理 v3.0.rar

    EasyHost虚拟主机系统是针对网络公司销售域名、主机、邮局、数据库等产品时效率低、管理难等问题而自主研发的集产品自动化开通、管理、续费、升级等功能为一体的软件系统。通过多年的改进与运作,软件已具有功能强大...

    开源团免费虚拟主机管理系统

    ④ 强大的虚拟主机管理功能,如:站点状态、FTP帐号状态、日志状态、FTP密码、默认文档、自定义错误页面、绑定域名、自定义脚本错误消息 、IP访问限制、关闭/恢复站点执行权限、在线压缩、在线解压缩、.NET版本切换...

    清竹虚拟主机管理系统 v5.94

    客户下单后后台对订单进行管理小型普通商品功能,后台可添加日期服务型或单次交易商品,客户下单后在总后台可对其发货等操作四、产品面板虚拟主机面板,用户可自行修改FTP帐号、密码,域名绑定、默认首页等虚拟主机...

    宝塔面板转换为虚拟主机系统源码下载 MN梦奈宝塔主机系统V1.5版.zip

    梦奈宝塔主机系统又称 MNBT ,是一种将宝塔面板 (bt.cn) 转换为虚拟主机并且提供操作面板的系统 ,它由 PHP+MySQL 编写的后端 , 前端使用的为光年开源框架,由于其极快大响应速度和独特的功能深受用户的喜爱。...

    虚拟主机评测系统源码

    用户可以自由添加虚拟主机 模块化的程序设计,使用参数调用更加便捷 开放源代码,所有文件代码可以自由修改,没有任何加密,没有任何DLL组件 没有空间域名及使用时间的任何限制 栏目设定简明便捷,采用无限级...

    DebianLNMP虚拟主机管理工具Nginx+PHP5.3+MySQL管理软件

    2.继续添加新的虚拟主机的域名? 不再添加选择“n”,没有更多的域名。请输入额外增加的虚拟主机域名,中间以一个“空格”分隔 例如: bbs.jimmyli.tk blog.jimmyli.tk 3.请输入新的虚拟主机的目录 默认目录(直接...

    DebianLNMP虚拟主机管理工具Nginx PHP5.3 MySQL管理软件

    2.继续添加新的虚拟主机的域名? 不再添加选择“n”,没有更多的域名。请输入额外增加的虚拟主机域名,中间以一个“空格”分隔 例如: bbs.jimmyli.tk blog.jimmyli.tk 3.请输入新的虚拟主机的目录 默认目录(直接...

    开源团免费虚拟主机管理系统 1.9.6(20110613).rar

     ④ 强大的虚拟主机管理功能,如:站点状态、FTP帐号状态、日志状态、FTP密码、默认文档、自定义错误页面、绑定域名、自定义脚本错误消息、IP访问限制、关闭/恢复站点执行权限、在线压缩、在线解压缩、。...

    为nginx设置默认虚拟主机(空主机头,默认主机头)

    后面的default参数表示这个是默认虚拟主机。 这个设置非常有用。 比如别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500. 目前国内很多机房都要求网站主关闭空主机头,防止...

    互联虚拟主机评测系统-用户可以评论虚拟主机

    信誉、质量、服务有保证 用户可以评论虚拟主机 用户可以自由添加虚拟主机 模块化的程序设计,使用参数调用更加便捷 开放源代码,所有文件代码可以自由修改,没有任何加密,没有任何DLL组件 没有空间域名及使用时间的...

    万信网络虚拟主机程序 v3.0

    在2.0的基础上美化了所有的程序。... 客户订单:里面有主机和基它的订单,域名订单也在里面查,不要找不到。 会员管理:代理申请批准和会员的管理,都在这。 综合服务:好重要,你客户的反馈等在这。

    虚拟主机域名备案信息检查系统

    功能说明:根据给出的列表...▲单个或多个空间/域名备案检查: http://www.xmyy.com/beian.php?dn=www.xmdoor.com,www.ok118.com,www.cncrack.com,www.eagleos.org ▲使用域名列表文件vhost01.txt进行批量备案检查: ...

    EasyHost虚拟主机管理 v2.0

    设置、查看主机绑定域名 设置、查看主机404错误页面 设置查看站点性能(2000系统下有效) 设置、查看站点日志状态、参数 修改FTP帐号密码、空间大小、状态 查看主机总空间、已使用及剩余空间大小 *)...

    宏杰网络虚拟主机实时开通系统 v2.2.500 特别版

    2、自动创建一个目录,只有管理员和创建的IUSR_XXX读取和写入(可以设置)访问,防FSO跨目录访问。 3、自动生成wwwroot,database,和logfiles三个文件夹。设置wwroot为网站目录,logfiles为日志目录,database为你存放...

    idcfree虚拟主机ASP评测系统

    用户可以自由添加虚拟主机 模块化的程序设计,使用参数调用更加便捷 开放源代码,所有文件代码可以自由修改,没有任何加密,没有任何DLL组件 没有空间域名及使用时间的任何限制 栏目设定简明便捷,采用无限级...

    站长俱乐部虚拟主机评测系统

    用户可以自由添加虚拟主机 模块化的程序设计,使用参数调用更加便捷 开放源代码,所有文件代码可以自由修改,没有任何加密,没有任何DLL组件 没有空间域名及使用时间的任何限制 栏目设定简明便捷,采用无限级分类 ...

    雨过星晴二级域名系统 v1.0

    只要将本系统放置于您的虚拟主机根目录下即可。采用数据库后台管理:随时修改,随时使用。无专业 DNS 软件需要等待刷新周期的烦恼。 功能强大。可以方便的添加主域名、二级域名。并且可以设置二级域名使用方式。如...

    站长俱乐部虚拟主机评测系统 V2.3

    用户可以自由添加虚拟主机 模块化的程序设计,使用参数调用更加便捷 开放源代码,所有文件代码可以自由修改,没有任何加密,没有任何DLL组件 没有空间域名及使用时间的任何限制 栏目设定简明便捷,采用无限级...

    EasyHost虚拟主机管理 v1.0 Build 0703

    *)主机模块 自主开通主机 删除到期站点 设置、查看站点状态 修改、查看站点IIS连接数 设置、查看站点默认文档 设置、查看主机CPU限制(2000系统下有效) 设置、查看站点带宽限制 设置、查看主机绑定域名 设置、查看...

Global site tag (gtag.js) - Google Analytics