首页 >> 编程知识

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 "分别是管理员帐户与密码.

iis批量添加主机头(二)、iis批量添加主机头(一)(本文完毕)
下一篇:Adsutil.vbs基本用法及深入了解
上一篇:200多个常用js代码