分享
 
 
 

ASP.NET建站添加虚拟目录和主机头-ASP语言

王朝数码·作者佚名  2011-04-02
窄屏简体版  字體: |||超大  

前言

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

这玩意儿花了老子3天时间才搞定,用了几个小时写代码,而且当中还花了不少时间解决Win32: Access denied error的问题。当然我要指出的是,无论NETWORK SERVER帐户还是IUSR_帐户都不要设置过大的权限。对于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中添加下面一个配置:

使用了这个配置,IUSR_会使用客户端模拟的方式去访问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的方法,那就更赞了。记得之前,我都是自己捣鼓出来的,所以我不知道这个方法是不是最佳的方案。

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有