iis批量添加主机头(二)、iis批量添加主机头(一)
iis批量添加主机头(二)
创建虚拟目录
DirectoryEntry是.Net给我们的一大礼物,他的名字我们就知道他的功能--目录入口。使用过ADSI的人都知道操作IIS,WinNT这些时,我们还需要提供他们的Path,操作IIS时,这个Path的格式为:
IIS://ComputerName/Service/Website/Directory
ComputerName:即操作的服务器的名字,可以是名字也可以是IP,经常用的就是localhost
Service:即操作的服务器,IIS中有Web,也有FTP,还有SMTP这些服务,我们主要是操作IIS的Web功能,因此此处就是"W3SVC",如果是FTP则应是"MSFTPSVC"
WebSite:一个IIS服务中可以包括很多的站点,这个就用于设置操作的站点。他的值是一个数字,默认是1,表示缺省站点,如果有其它,则从1开始依次类推。
Directory:不用说,即操作的目录名称,一个站点一般顶层目录为"ROOT",其它目录则是他的孩子(Child)。
首先我们获取一个站点的顶层目录(根目录):
DirectoryEntry rootfolder = new DirectoryEntry("IIS://localhost/W3SVC/1/ROOT");
如果我们创建这个对象是没有发生异常,则表示这个目录是真实存在的。
下面我们来添加新的虚拟目录,比如我们要加的是"Aspcn":
DirectoryEntry newVirDir = rootfolder.Children.Add("Aspcn","IIsWebVirtualDir");
newVirDir.Invoke("AppCreate",true);
newVirDir.CommitChanges();
rootfolder.CommitChanges();
创建目录的思路很简单,即在根目录的子集(rootfolder.Children)中再添加一条记录,这里使用的是DirectoryEntries类中的Add方法,它返回的是一个DirectoryEntry,表示新加入的目录,第一个参数是虚拟目录的名字,第二个则是Schema的类名以表明我们加入的目录类型。然后再使用DirectoryEntry的Invoke方法,调用ADSI中的"AppCreate"方法将目录真正创建(似乎不走这一步也可以创建目录成功,但是为了保险起见,大家还是用吧),最后便是依次调用新、根目录的CommitChanges方法,确认此次操作。
在创建新目录时,我们也可以同时给这个目录的属性赋值,但是我的实战经验告诉我,最好不要这样做,如果创建时就赋值,将有很多属性不能赋值成功,比如重要的表示真实目录的Path属性。因此飞刀建议大家最好是先创建目录,然后再赋值,即更新目录信息。
更新虚拟目录
相信大家对IIS都比较熟悉,了解IIS中一些重要的设置,如可读(AccessRead)、可写(AccessWrite)、可执行(AccessExecute)等。这些都可通过对DirectoryEntry的Properties属性集合的赋值来实现。赋值可以通过两种方式来完成:
第一种是调用Properties集合的Add方法,如:
dir.Properties["AccessRead"].Add(true);
第二种是对第一个索引值赋值:
dir.Properties["AccessRead"][0] = true;
这两种方法都是可行的。具体是要看你的喜好了。
在进行赋值之前我们还是要确定要要赋值的目标吧:)这里我们使用DirectoryEntries类的Find方法,如:
DirectoryEntry de = rootfolder.Children.Find("Aspcn","IIsVirtualDir");
找到了,我们就可以赋值了。赋值时一定要好好看看啊,虚拟目录的属性值可以超多,一查一大堆。。:(太多了,飞刀我也不重复了,大家去微软的站点上查:)
比较常用的有:AccessRead,AccessWrite,AccessExecute,AccessScript,DefaultDoc,EnableDefaultDoc,Path
删除虚拟目录
删除虚拟目录的方法也很简单,就是找到你要删除的虚拟目录,然后调用AppDelete方法。
DirectoryEntry de = rootfolder.Children.Find("Aspcn","IIsVirtualDir");
de.Invoke("AppDelete",true);
rootfolder.CommitChanges();
还有一种方法,就是调用Root目录的Delete方法。
object[] paras = new object[2];
paras[0] = "IIsWebVirtualDir"; //表示操作的是虚拟目录
paras[1] = "Aspcn";
rootfolder.Invoke("Delete",paras);
rootfolder.CommitChanges();
参照了Inetpub\AdminScripts\adsutil.vbs写的创建虚拟目录的脚本:
'////////////////////////// begin //////////////////////////////////////////
On Error Resume Next
strVirtualDirectoryName = InputBox("请输入虚拟目录名")
If strVirtualDirectoryName = "" Then
msgbox("输入错误,程序结束!")
WScript.Quit
End If
strVirtualDirectoryPath=InputBox("请输入网站文件所在的目录名(例如:e:\web)")
If strVirtualDirectoryPath = "" Then
msgbox("输入错误,程序结束!")
WScript.Quit
End If
strVirtualDirectoryPath = Replace(strVirtualDirectoryPath,"/","\")
Set MyFso = CreateObject("Scripting.FileSystemObject")
If MyFso.FolderExists(strVirtualDirectoryPath) = 0 then
msgbox("文件夹"&strVirtualDirectoryPath&"不存在!")
Else
Set objIIS = GetObject("IIS://localhost/W3SVC/1/Root")
Set objVirtualDirectory = objIIS.Create("IISWebVirtualDir",strVirtualDirectoryName)
If (Err.Number <> 0) Then '如果虚拟目录已存在或有其他错误时则为真
Err.Clear
Set myDir = objIIS.GetObject("IIsWebVirtualDir",strVirtualDirectoryName) '创建虚拟目录对象
If (Err.Number <> 0) Then '虚拟目录不存在时则为真,说明是其他未知错误,否则为虚拟目录已存在
msgbox("对不起,发生未知错误,操作失败!")
WScript.Quit (Err.Number)
end if
m=msgbox ("虚拟目录"&strVirtualDirectoryName&"已存在,是否删除?",1+32,"删除确认")
if m<>1 then
WScript.Quit
end if
objIIS.Delete "IIsObject", strVirtualDirectoryName
If (Err.Number <> 0) Then
msgbox("删除虚拟目录"&strVirtualDirectoryName&"失败")
WScript.Quit (Err.Number)
end if
Set objVirtualDirectory = objIIS.Create("IISWebVirtualDir",strVirtualDirectoryName)
objVirtualDirectory.AccessScript = true
objVirtualDirectory.Path = strVirtualDirectoryPath
objVirtualDirectory.EnableDefaultDoc=True
objVirtualDirectory.DefaultDoc="index.htm"
objVirtualDirectory.AppFriendlyName=strVirtualDirectoryName
objVirtualDirectory.SetInfo
objVirtualDirectory.AppCreate true 'bolInProcessApplication
msgbox("操作成功!虚拟目录"&strVirtualDirectoryName&"建立成功,"&vbCrLf&"请在浏览器地址栏中输入http://localhost/"&strVirtualDirectoryName&"/查看效果")
else
objVirtualDirectory.AccessScript = true
objVirtualDirectory.Path = strVirtualDirectoryPath
objVirtualDirectory.EnableDefaultDoc=True
objVirtualDirectory.DefaultDoc="index.htm"
objVirtualDirectory.AppFriendlyName=strVirtualDirectoryName
objVirtualDirectory.SetInfo
objVirtualDirectory.AppCreate true 'bolInProcessApplication
msgbox("操作成功!虚拟目录"&strVirtualDirectoryName&"建立成功,"&vbCrLf&"请在浏览器地址栏中输入http://localhost/"&strVirtualDirectoryName&"/查看效果")
end if
End If
Set MyFso = nothing
'////////////////////////// end //////////////////////////////////////////
在做安装的asp程序时可以参照上面的脚本。
以上的程序也可以改写为asp的脚本,只是在运行该asp页面时要注意一点,该asp页面所在的虚拟目录的匿名登陆用户必须要为administrator,否则浏览器会提示权限不够的提示!
使用同样的方式也可以来创建web站点,具体可以参照inetpub\AdminScripts\adsutil.vbs。
看了一醉解千愁的修改IIS目录的Asp.Net版本之后,想到以前想过要通过代码给IIS增加主机头,却一直没去研究,今天趁着兴趣,决定把这个问题解决了。
对于Blog网站,假如需要为用户提供二级域名支持,而Web程式不是运行默认站点中,就需要在用户注册时通过代码给IIS增加相应的主机头。
这个问题是通过Google搜索到Append a host header by code in IIS解决的,经过测试,确认方法可行并对代码进行了一些改进后,考虑到这个内容会给一些朋友带来帮助,于是就写了这篇文章。
代码如下:
static void Main(string[] args)
{
AddHostHeader(1, null, 80, "test.cnblogs.com");
}
static void AddHostHeader(int siteid,string ip, int port, string domain)
{
DirectoryEntry site = new DirectoryEntry("IIS://localhost/W3SVC/"+siteid);
PropertyValueCollection serverBindings = site.Properties["ServerBindings"];
string headerStr = string.Format("{0}:{1}:{2}",ip,port,domain);
if (!serverBindings.Contains(headerStr))
{
serverBindings.Add(headerStr);
}
site.CommitChanges();
}
在找到Append a host header by code in IIS之前,我通过下面的代码没找到"ServerBindings"属性,走了一些弯路。
DirectoryEntry site = new DirectoryEntry("IIS://localhost/W3SVC/1/root");
代码很简单,需要说明的是siteid,默认站点是1,对于非默认站点,通过查看站点日志文档名就能够知道。
我在一个.cs文件中用到了
using System;
using System.DirectoryServices;
可是我一编译就会出现这样的错误:
error CS0234: The type or namespace name 'DirectoryServices' does not exist in the class or namespace 'System
---------------------------------------------------------------
感谢您使用微软产品。
如果你是用Visual Studio .Net 集成环境, 你可以从Project menu->Add Reference…来添加.
例如你要用System.DirectoryServices, 你需要添加System.Directoryservices.dll.
本贴子仅供CSDN的用户作为参考信息使用。其内容不具备任何法律保障。您需要考虑到并承担使用此信息可能带来的风险。具体事项可参见使用条款 (http://www.csdn.net/microsoft/terms.shtm)。
iis批量添加主机头(一)
1.基础知识.
上面是建立站点的代码,这里是查找一个站点的方法
public bool ExistsSite( string siteName )
{
if ( directoryEntry == null || siteName == String.Empty )
{
return false ;
}
bool bExists = false;
try
{
foreach (
DirectoryEntry child in directoryEntry.Children )
{
if( child.SchemaClassName == "IIsWebServer " )
{
if( child.Properties[ "ServerComment "].Value != null )
{
if ( child.Properties[ "ServerComment "].Value.ToString() == siteName )
{
bExists = true;
break;
}
}
}
}
}
catch
{
throw;
}
return bExists;
}
我遇到了另外一个关于ADSI的问题
在本地所有工作都能完成,但传到服务器上以后就出错误,提示拒绝访问
directoryEntry
找了一些资料说没有权限,我把ASPNET加到ADMINISTRATORS组里也不行,请问如何解决?
解决这问题可以这样做:
在 <authentication mode= "Windows " /> 节点下添加以下内容
<identity impersonate= "true " userName= "administrator " password= "sanlng "/>
"administrator "与 "sanlng "分别是管理员帐户与密码.