1.建立站点和虚拟目录(多个)
2.读取站点和虚拟目录的设置信息(根和虚拟目录的实际地址)
3.修改站点的设置信息

解决方案 »

  1.   

    http://www.01wt.com/showwz.asp?newsid=228
      

  2.   

    /******************************************************************
     *  Copyright Sukey(R),2005
     *  
     *  FileName  :  IISAdminLib.cs
     *  Author   :  Sukey
     *  Create   :  2004年11月20日 18:04:50
     *  LastChange  :  2004年12月1日 13:04:55
     *  History   : 1) 
     *         2004年12月5日 15:06:00()
     *  Description  :  用来实现管理IIS的基本操作,并集成常用属性(最大IP,脚本支持等等)
     *        
     *      Bug             :       IIS安全问题
     * 
     * *****************************************************************/ using System;
    using System.DirectoryServices;
    using System.Collections;
    using System.Text.RegularExpressions;
    using System.Text; namespace LogicLayer{  public class IISAdminLib {  
      #region UserName,Password,HostName的定义  public static string HostName
      {
       get
       {
        return hostName;
       }
       set
       {
        hostName = value;
       }
      }
      public static string UserName
      {
       get
       {
        return userName;
       }
       set
       {
        userName = value;
       }
      }
      public static string Password
      {
       get
       {
        return password;
       }
       set
       {
        if(UserName.Length <= 1)
        {
         throw new ArgumentException('还没有指定好用户名。请先指定用户名');
        }
        password = value;
       }
      }  public static void RemoteConfig(string hostName, string userName, string password)
      {
       HostName = hostName;
       UserName = userName;
       Password = password;
      }
      private static string hostName = 'localhost';
      private static string userName ;
      private static string password;  #endregion   #region 根据路径构造Entry的方法
      /// <summary>
      ///  根据是否有用户名来判断是否是远程服务器。
      ///  然后再构造出不同的DirectoryEntry出来
      /// </summary>
      /// <param name='entPath'>DirectoryEntry的路径</param>
      /// <returns>返回的是DirectoryEntry实例</returns>  public static DirectoryEntry GetDirectoryEntry(string entPath)
      {
       DirectoryEntry ent;
       if(UserName == null)
       {
        ent = new DirectoryEntry(entPath);
       }
       else
       {    //    ent = new DirectoryEntry(entPath, HostName+'\\'+UserName, Password, AuthenticationTypes.Secure);
        ent = new DirectoryEntry(entPath, UserName, Password, AuthenticationTypes.Secure);
       }
       return ent;
      }
      #endregion
      #region 添加,取得,修改网站的方法  /// <summary>
      ///  创建一个新的网站。根据传过来的信息进行配置
      /// </summary>
      /// <param name='siteInfo'>存储的是新网站的信息</param>
      public static bool  CreateNewWebSite(NewWebSiteInfoAll siteInfo)
      {
       if(! EnsureNewSiteEnavaible(siteInfo.BindString))
       {
        return false;
        //throw new DuplicatedWebSiteException('已经有了这样的网站了。' + Environment.NewLine + siteInfo.BindString);
       }
       else
       {
     
        string entPath = String.Format('IIS://{0}/w3svc', HostName);
        DirectoryEntry rootEntry = GetDirectoryEntry(entPath);
        //取得网站ID
        string newSiteNum = GetNewWebSiteID();
        DirectoryEntry newSiteEntry = rootEntry.Children.Add(newSiteNum, 'IIsWebServer');
        newSiteEntry.CommitChanges();
        //设置IIs属性
        newSiteEntry.Properties['ServerBindings'].Value = siteInfo.alhost.ToArray();
        newSiteEntry.Properties['ServerComment'].Value = siteInfo.CommentOfWebSite;
        //ip最大连接数,设置脚本
        newSiteEntry.Properties['MaxConnections'][0] = siteInfo.MaxConnections; 
        newSiteEntry.Properties['ScriptMaps'].Value = siteInfo.arraylist.ToArray();    //日志文件路径
        /*
         *
         private string _LogFileDirectory = '';
         private bool _LogFileLocaltimeRollover;
         private int _LogFilePeriod;
         private int _LogFileTruncateSize;
          */
        newSiteEntry.Properties['LogFileDirectory'].Value = siteInfo.LogFileDirectory;
        newSiteEntry.Properties['LogFileLocaltimeRollover'].Value = siteInfo.LogFileLocaltimeRollover;
        newSiteEntry.Properties['LogFilePeriod'][0] = siteInfo.LogFilePeriod;
        newSiteEntry.Properties['LogFileTruncateSize'][0] = siteInfo.LogFileTruncateSize;    newSiteEntry.CommitChanges();    DirectoryEntry vdEntry = newSiteEntry.Children.Add('root', 'IIsWebVirtualDir');
        //必须加载AppRoot属性
        vdEntry.Properties['AppRoot'][0] = '/LM/W3SVC/'+newSiteNum+'/Root';
        vdEntry.Properties['AccessFlags'][0] = 513;
        vdEntry.CommitChanges();;
        //更新其他属性
        UpdateDirInfo(vdEntry,siteInfo);    
        return true;
       }
      }
      

  3.   

    代码创建虚拟目录:using System;
    using System.Data;
    using System.DirectoryServices;
    using System.Collections;
    using System.Threading;
    namespace Aspcn.Management
    {
    /// <summary>
    /// IISManager 的摘要说明。
    /// </summary>
    public class IISManager
    {
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    IISManager test = new IISManager();
    test.Connect();
    VirtualDirectory vd = new VirtualDirectory();
    vd.Path = @"c:\Inetpub\wwwroot\BKDEIP\WEBUI\MobileFolder";
    vd.Name = "BKDEIP/WEBUI/Mobile";// if(test.Exists(vd.Name))    
    // {
    // test.Delete(vd.Name);
    // }
    // else
    // {
    // test.Create(vd);
    // }
    test.Create(vd);
    } //定义需要使用的
    private string _server,_website;
    private VirtualDirectories _virdirs;
    protected System.DirectoryServices.DirectoryEntry rootfolder;
    private bool _batchflag;
    public IISManager()
    {
    //默认情况下使用localhost,即访问本地机
    _server = "localhost";
    _website = "1";
    _batchflag = false;
    }
    public IISManager(string strServer)
    {
    _server = strServer;
    _website = "1"; 
    _batchflag = false;
    }
    /// <summary>
    /// 定义公共属性
    /// </summary> //Server属性定义访问机器的名字,可以是IP与计算名
    public string Server
    {
    get{ return _server;}
    set{ _server = value;}
    }
    //WebSite属性定义,为一数字,为方便,使用string 
    //一般来说第一台主机为1,第二台主机为2,依次类推
    public string WebSite
    {
    get{ return _website; }
    set{ _website = value; }
    } //虚拟目录的名字
    public VirtualDirectories VirDirs
    {
    get{ return _virdirs; }
    set{ _virdirs = value;}
    }
    ///<summary>
    ///定义公共方法
    ///</summary> //连接服务器
    public void Connect()
    {
    ConnectToServer();
    }
    //为方便重载
    public void Connect(string strServer)
    {
    _server = strServer;
    ConnectToServer();
    }
    //为方便重载
    public void Connect(string strServer,string strWebSite)
    {
    _server = strServer;
    _website = strWebSite;
    ConnectToServer();
    }
    //判断是否存这个虚拟目录
    public bool Exists(string strVirdir)
    {
    return _virdirs.Contains(strVirdir);
    }
    //添加一个虚拟目录
    public void Create(VirtualDirectory newdir)
    {
    string strPath = "IIS://" + _server + "/W3SVC/" + _website + "/ROOT/" + newdir.Name;            
    if(!_virdirs.Contains(newdir.Name) || _batchflag )
    {
    try
    {
    //加入到ROOT的Children集合中去
    DirectoryEntry newVirDir = rootfolder.Children.Add(newdir.Name,"IIsWebVirtualDir");
    newVirDir.Invoke("AppCreate",true);
    newVirDir.CommitChanges();
    rootfolder.CommitChanges();
    //然后更新数据
    UpdateDirInfo(newVirDir,newdir);
    }
    catch(Exception ee)
    {
    throw new Exception(ee.ToString());
    }
    }
    else
    {
    throw new Exception("This virtual directory is already exist.");
    }
    }
    //得到一个虚拟目录
    public VirtualDirectory GetVirDir(string strVirdir)
    {
    VirtualDirectory tmp = null;
    if(_virdirs.Contains(strVirdir))
    {
    tmp = _virdirs.Find(strVirdir);
    ((VirtualDirectory)_virdirs[strVirdir]).flag = 2;
    }
    else
    {
    throw new Exception("This virtual directory is not exists");
    }
    return tmp;
    } //更新一个虚拟目录
    public void Update(VirtualDirectory dir)
    {
    //判断需要更改的虚拟目录是否存在
    if(_virdirs.Contains(dir.Name))
    {
    DirectoryEntry ode = rootfolder.Children.Find(dir.Name,"IIsWebVirtualDir");
    UpdateDirInfo(ode,dir);
    }
    else
    {
    throw new Exception("This virtual directory is not exists.");
    }
    }
      
    //删除一个虚拟目录
    public void Delete(string strVirdir)
    {
    if(_virdirs.Contains(strVirdir))
    {
    object[] paras = new object[2];
    paras[0] = "IIsWebVirtualDir"; //表示操作的是虚拟目录
    paras[1] = strVirdir;
    rootfolder.Invoke("Delete",paras);
    rootfolder.CommitChanges();
    }
    else
    {
    throw new Exception("Can't delete " + strVirdir + ",because it isn't exists.");
    }
    }
    //批量更新
    public void UpdateBatch()
    {
    BatchUpdate(_virdirs);
    }
    //重载一个:-)
    public void UpdateBatch(VirtualDirectories vds)
    {
    BatchUpdate(vds);
    }
     
    ///<summary>
    ///私有方法
    ///</summary> //连接服务器
    private void ConnectToServer()
    {
    string strPath = "IIS://" + _server + "/W3SVC/" + _website +"/ROOT";
    try
    {
    this.rootfolder = new DirectoryEntry(strPath);
    _virdirs = GetVirDirs(this.rootfolder.Children);

    catch(Exception e)
    {
    throw new Exception("Can't connect to the server ["+ _server +"] ...",e);
    }
    }
    //执行批量更新
    private void BatchUpdate(VirtualDirectories vds)
    {
    _batchflag = true;
    foreach(object item in vds.Values)
    {
    VirtualDirectory vd = (VirtualDirectory)item;
    switch(vd.flag)
    {
    case 0:
    break;
    case 1:
    Create(vd);
    break;
    case 2:
    Update(vd);
    break;
    }
    }
    _batchflag = false;
    }

      

  4.   

    //更新东东
    private void UpdateDirInfo(DirectoryEntry de,VirtualDirectory vd)
    {
    de.Properties["AnonymousUserName"][0] = vd.AnonymousUserName;
    de.Properties["AnonymousUserPass"][0] = vd.AnonymousUserPass;
    de.Properties["AccessRead"][0] = vd.AccessRead;
    de.Properties["AccessExecute"][0] = vd.AccessExecute;
    de.Properties["AccessWrite"][0] = vd.AccessWrite;
    de.Properties["AuthBasic"][0] = vd.AuthBasic;
    de.Properties["AuthNTLM"][0] = vd.AuthNTLM;
    de.Properties["ContentIndexed"][0] = vd.ContentIndexed;
    de.Properties["EnableDefaultDoc"][0] = vd.EnableDefaultDoc;
    de.Properties["EnableDirBrowsing"][0] = vd.EnableDirBrowsing;
    de.Properties["AccessSSL"][0] = vd.AccessSSL;
    de.Properties["Accessscript"][0] = vd.Accessscript;
    de.Properties["DefaultDoc"][0] = vd.DefaultDoc;
    de.Properties["Path"][0] = vd.Path;
    de.CommitChanges();
    } //获取虚拟目录集合
    private VirtualDirectories GetVirDirs(DirectoryEntries des)
    {
    VirtualDirectories tmpdirs = new VirtualDirectories();
    foreach(DirectoryEntry de in des)
    {
    if(de.SchemaClassName == "IIsWebVirtualDir")
    {
    VirtualDirectory vd = new VirtualDirectory();
    vd.Name = de.Name;
    vd.AccessRead = (bool)de.Properties["AccessRead"][0];
    vd.AccessExecute = (bool)de.Properties["AccessExecute"][0];
    vd.AccessWrite = (bool)de.Properties["AccessWrite"][0];
    vd.AnonymousUserName = (string)de.Properties["AnonymousUserName"][0];
    vd.AnonymousUserPass = (string)de.Properties["AnonymousUserName"][0];
    vd.AuthBasic = (bool)de.Properties["AuthBasic"][0];
    vd.AuthNTLM = (bool)de.Properties["AuthNTLM"][0];
    vd.ContentIndexed = (bool)de.Properties["ContentIndexed"][0];
    vd.EnableDefaultDoc = (bool)de.Properties["EnableDefaultDoc"][0];
    vd.EnableDirBrowsing = (bool)de.Properties["EnableDirBrowsing"][0];
    vd.AccessSSL = (bool)de.Properties["AccessSSL"][0];
    vd.Accessscript = (bool)de.Properties["Accessscript"][0];
    vd.Path = (string)de.Properties["Path"][0];
    vd.flag = 0;
    vd.DefaultDoc = (string)de.Properties["DefaultDoc"][0];
    tmpdirs.Add(vd.Name,vd);
    }
    }
    return tmpdirs;
    } }
    /// <summary>
    /// VirtualDirectory类
    /// </summary>
    public class VirtualDirectory
    {
    private bool _read,_execute,_script,_ssl,_write,_authbasic,_authntlm,_indexed,_endirbrow,_endefaultdoc;
    private string _ausername,_auserpass,_name,_path;
    private int _flag;
    private string _defaultdoc;
    /// <summary>
    /// 构造函数
    /// </summary>
    public VirtualDirectory()
    {
    SetValue();
    }
    public VirtualDirectory(string strVirDirName)
    {
    _name = strVirDirName;
    SetValue();
    }
    private void SetValue()
    {
    _read = true;_execute = false;_script = false;_ssl= false;_write=false;_authbasic=false;_authntlm=false;
    _indexed = false;_endirbrow=false;_endefaultdoc = false;
    _flag = 1;
    _defaultdoc = "default.htm,default.aspx,default.asp,index.htm";
    _path = "C:\\";
    _ausername = "";_auserpass ="";_name="";
    }
    ///<summary>
    ///定义属性,IISVirtualDir太多属性了
    ///我只搞了比较重要的一些,其它的大伙需要的自个加吧。
    ///</summary> public int flag
    {
    get{ return _flag;}
    set{ _flag = value;}
    }
    public bool AccessRead
    {
    get{ return _read;}
    set{ _read = value;}
    }
    public bool AccessWrite
    {
    get{ return _write;}
    set{ _write = value;}
    }
    public bool AccessExecute
    {
    get{ return _execute;}
    set{ _execute = value;}
    }
    public bool AccessSSL
    {
    get{ return _ssl;}
    set{ _ssl = value;}
    }
    public bool Accessscript
    {
    get{ return _script;}
    set{ _script = value;}
    }
    public bool AuthBasic
    {
    get{ return _authbasic;}
    set{ _authbasic = value;}
    }
    public bool AuthNTLM
    {
    get{ return _authntlm;}
    set{ _authntlm = value;}
    }
    public bool ContentIndexed
    {
    get{ return _indexed;}
    set{ _indexed = value;}
    }
    public bool EnableDirBrowsing
    {
    get{ return _endirbrow;}
    set{ _endirbrow = value;}
    }
    public bool EnableDefaultDoc
    {
    get{ return _endefaultdoc;}
    set{ _endefaultdoc = value;}
    }
    public string Name
    {
    get{ return _name;}
    set{ _name = value;}
    }
    public string Path
    {
    get{ return _path;}
    set{ _path = value;}
    }
    public string DefaultDoc
    {
    get{ return _defaultdoc;}
    set{ _defaultdoc = value;}
    }
    public string AnonymousUserName
    {
    get{ return _ausername;}
    set{ _ausername = value;}
    }
    public string AnonymousUserPass
    {
    get{ return _auserpass;}
    set{ _auserpass = value;}
    }
    }
    /// <summary>
    /// 集合VirtualDirectories
    /// </summary> public class VirtualDirectories : System.Collections.Hashtable
    {
    public VirtualDirectories()
    {
    }
    //添加新的方法 
    public VirtualDirectory Find(string strName)
    {
    return (VirtualDirectory)this[strName];
    }
    }
    }