`
paulfzm
  • 浏览: 884280 次
  • 性别: 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的方法,那就更赞了。记得之前,我都是自己捣鼓出来的,所以我不知道这个方法是不是最佳的方案。

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

分享到:
评论

相关推荐

    httpd基于域名的虚拟Web主机配置.doc

    这意味着如果要管理多个站点,需要将所有站点的配置迁移到相应的虚拟主机配置文件中。 通过以上步骤,你可以成功地在httpd上配置基于域名的虚拟Web主机,实现一台服务器上托管多个独立的Web站点。记得在实际操作时...

    基于Linux下的Web服务器配置与基于域名的虚拟主机.pdf

    4. 虚拟主机的配置:在虚拟主机的配置中,使用了ServerName指令来指定虚拟主机的域名和端口号,使用了DocumentRoot指令来指定虚拟主机的文档根目录,使用了DirectoryIndex指令来指定虚拟主机的默认页面。 5. 主页的...

    本地机apache配置基于域名的虚拟主机

    在本教程中,我们将探讨如何在本地计算机上配置Apache以实现基于域名的虚拟主机,这对于开发多站点项目或者进行网站测试非常有用。 首先,我们需要了解什么是基于域名的虚拟主机。在一台物理服务器上,可以设置多个...

    tomcat配置虚拟目录,外加域名解析

    当我们谈论“Tomcat配置虚拟目录,外加域名解析”,这涉及到两个关键概念:一是如何在Tomcat服务器上设置虚拟主机(virtual hosts),使得一个Tomcat实例可以服务于多个不同的域名或网站;二是如何进行DNS域名解析,...

    tamcat绑定多个域名&配置虚拟目录

    ### Tomcat绑定多个域名及配置虚拟目录详解 ...通过修改默认端口、添加多个主机名并配置虚拟目录,可以轻松实现这些功能。这些操作不仅增强了Tomcat的灵活性,也使其更加适合复杂的应用场景需求。

    虚拟主机绑多个域名_域名主机工具程序.rar

    3. 添加域名:输入要绑定的域名,并指定每个域名对应的网站根目录。 4. 配置和保存:工具会自动进行DNS配置和Web服务器配置,完成后保存设置。 5. 验证绑定:通过访问各个域名来确认是否成功绑定到虚拟主机。 总结...

    php虚拟主机的配置

    这段代码用于配置虚拟主机的基本信息,如文档根目录、索引文件和目录权限。 3. 找到 C:\WINDOWS\system32\drivers\etc\hosts 文件添加一行代码,用于将域名解析到本地 IP 地址。127.0.0.1 localhost 127.0.0.1 ...

    虚拟主机和域名信息管理小工具

    在IT行业中,虚拟主机和域名信息管理是网络服务器管理和网站运营的重要组成部分。下面将详细讲解这两个概念以及相关的管理工具。 虚拟主机是指在一个物理服务器上通过技术手段划分出多个独立的服务器环境,每个环境...

    删除空主机头方法

    # default 代表默认虚拟主机 server_name _; return 500; # 返回500错误信息或者444 ``` 或者,可以将这些空主机头请求重定向到另一个网站: ``` server { listen 80 default; server_name _; rewrite ^(....

    Apache下域名虚拟主机在个人主页目录上实现过程

    在Apache下配置域名虚拟主机,可以使得一台服务器上同时托管多个网站,每个网站对应不同的域名,而无需为每个站点分配独立的IP地址,从而有效地利用网络资源。在这个场景中,Contoso公司将为xiaonuo公司和dreamfire...

    xampp 设置虚拟目录

    3. **添加虚拟主机配置**:用文本编辑器(如Notepad++)打开`httpd-vhosts.conf`,在文件末尾添加以下内容: ``` *:80&gt; ServerName my_project.dev DocumentRoot "C:/xampp/htdocs/my_project" AllowOverride...

    虚拟主机下实现多域名绑定不同的子目录的方法

    虚拟主机下实现多域名绑定不同的子目录的方法 虚拟主机域名绑定子目录asp php html 是一种非常常见的技术,特别是在大型网站或者企业级应用中。下面我们将详细介绍如何在虚拟主机下实现多域名绑定不同的子目录的...

    [主机域名]数据王域名虚拟主机管理系统 v1.0_shujuwanghost.rar

    数据王域名虚拟主机管理系统是一款专为管理域名和虚拟主机而设计的应用程序,旨在提供高效、便捷的解决方案,帮助网络管理员和网站所有者更好地管理和维护他们的在线资源。此系统的v1.0版本,即"[主机域名]数据王...

    快捷配置apache虚拟目录和HOSTS文件

    配置虚拟目录通常涉及修改Apache的配置文件httpd.conf或通过创建额外的vhost(虚拟主机)配置文件。 以下是配置Apache虚拟目录的基本步骤: 1. **打开配置文件**:找到Apache的配置文件,通常是`/etc/httpd/conf/...

    虚拟主机销售系统_域名主机工具程序.rar

    《虚拟主机销售系统与域名主机工具程序的深度解析》 在互联网时代,网站的搭建与运营离不开虚拟主机和域名管理。虚拟主机销售系统与域名主机工具程序是这两方面的重要支撑,它们为企业和个人提供了便捷的在线服务。...

    Nginx虚拟主机(HTML).

    通过本次实验文档,我们可以了解到Nginx作为Web服务器时,如何配置基于域名的虚拟主机,如何处理静态网页请求,并且了解了虚拟主机的一些基础知识。这对于希望学习和使用Nginx来搭建网站的用户是一个很好的入门教程...

    Nginx实现虚拟主机

    4. **虚拟主机支持**:Nginx支持基于域名、端口和IP地址的多虚拟主机设置,满足不同的业务需求。 #### 应用场景 1. **Web服务器**:Nginx作为高性能Web服务器,适用于处理大量的静态资源请求。 2. **反向代理**:在...

    apache三种虚拟主机的配置

    - 基于名称的虚拟主机配置简单,只需在配置文件中添加对应的虚拟主机即可。 - 主要应用于单个IP地址下需要部署多个网站的情况。 - 浏览器通过DNS解析域名后,再根据请求中的`Host`头部来识别不同的虚拟主机。 #### ...

    虚拟域名的配置和设置方法

    虚拟域名,也被称为虚拟主机,是指在一个实际的IP地址上绑定多个域名,每个域名对应一个独立的网站。这种技术使得服务器可以处理来自不同域名的请求,而无需为每个网站分配单独的物理服务器。 二、虚拟域名工作原理...

Global site tag (gtag.js) - Google Analytics