zoukankan      html  css  js  c++  java
  • 一个WEB项目安装包,自动配置数据库,config文件和虚拟目录。。(转)

    最近一个web项目要打包,找了些资料,发现.NET自带的安装工程做web安装程序不是很好用,自己封装了一个,可以自动配置数据库和虚拟目录以及config文件,欢迎大家提出宝贵意见。
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.DirectoryServices;
    using System.Configuration.Install;
    using System.Data;
    using System.Data.SqlClient;
    using System.Windows.Forms;
    using System.Text;
    using System.IO;
    using System.Xml;

    namespace WebSetupConfig
    {
     /// <summary>
     /// 作者:LXH  发布:2004-10-29
     /// 该类用于.NET平台下的WEB应用部署,
     /// 包括数据库的发布,web.config文件配置
     /// 虚拟目录的创建.以及这些安装步骤的反安装过程.
     /// 以下是该安装过程的上下文参数。
     /// /DBNAME=[DBNAME] /COMPUTERNAME=[COMPUTERNAME] /USERNAME=[USERNAME] /PASSWORD=[PASSWORD] /targetdir="[TARGETDIR]\"
     /// </summary>
     [RunInstaller(true)]
     public class setupconfig : System.Configuration.Install.Installer
     {
      #region  变量申明
      static StringBuilder sqlTxt;
      private System.ComponentModel.Container components = null;

      #endregion
      public setupconfig()
      {
       InitializeComponent();
      }

      protected override void Dispose( bool disposing )
      {
       if( disposing )
       {
        if(components != null)
        {
         components.Dispose();
        }
       }
       base.Dispose( disposing );
      }


      #region 组件设计器生成的代码
      /// <summary>
      /// 设计器支持所需的方法 - 不要使用代码编辑器修改
      /// 此方法的内容。
      /// </summary>
      private void InitializeComponent()
      {
       components = new System.ComponentModel.Container();
       //添加数据库备份文件的旧数据库名称。
       this.Context.Parameters.Add("OLDDBNAME","ZTWJMIS1");
       
      }
      #endregion
      
      //得到数据库连接字符串
      private string GetConnection()
      {
       string connectionstring = String.Format("data source={0};user id={1};password={2};persist security info=false;packet size=4096",Context.Parameters["COMPUTERNAME"],Context.Parameters["USERNAME"],Context.Parameters["PASSWORD"]);
       return connectionstring;
      }

      //Sql代码执行方法
      private void SqlExec(string DataBaseName,string Sql)
      {
       SqlConnection conn = new SqlConnection("data source=localhost;database=master;persist security info=False;user id=sa;pwd=123; packet size=4096");
       SqlCommand com = new SqlCommand(Sql,conn);
       com.Connection.Open();
       com.Connection.ChangeDatabase(DataBaseName);
       try
       {
        com.ExecuteNonQuery();
       }
       catch(Exception e)
       {
        throw e;
       }
       finally
       {
        com.Connection.Close();
       }

      }

      
      /// <summary>
      /// 数据库部署
      /// </summary>
      /// <param name="DBFilePath">安装包中备份数据库文件路径</param>
      /// <param name="DBDeployName">部署到本地的数据库名称</param>
      private void DataBaseDeploy(string DBFilePath ,string DBDeployName)
      {
       try
       {
        string connection = GetConnection();
        string sqlText = String.Format("restore filelistonly from disk=' {0} 'restore database {1} from disk='{2} ' with move {3} to '{4}',move '{5}' to  '{6}'",
         this.Context.Parameters["targetdir"]+"data.bin",  //0
         this.Context.Parameters["DBNAME"],      //1
         this.Context.Parameters["targetdir"]+"data.bin",   //2
         this.Context.Parameters["OLDDBNAME"]+"_data",        //3
         this.Context.Parameters["DBNAME"]+".mdf",        //4
         this.Context.Parameters["OLDDBNAME"]+"_log",     //5
         this.Context.Parameters["DBNAME"]+".ldf");         //6
        SqlExec("master",sqlText);
       }
       catch(Exception ex)
       {
        MessageBox.Show("数据库安装异常,请检查数据库配置,并从新安装!"+ex.Message);
       }
      }


      /// <summary>
      /// webconfig设置连接字符串
      /// </summary>
      /// <param name="ConnectionString">将要写入webconfig中的连接字符串</param>
      private void WebconfigDeploy(string ConnectionString)
      {     
       bool Changed = false;
       try
       {
        FileInfo xmlfile = new FileInfo(this.Context.Parameters["targetdir"]+"\\web.config");
        if(!xmlfile.Exists)
        {
         throw new InstallException("没有找到配置文件,请检查重新安装程序!");
        }
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(xmlfile.FullName);
        foreach(System.Xml.XmlNode xmlNode in xmlDoc["configuration"]["appSettings"])
        {
         if(xmlNode.Name == "add")
         {
          if(xmlNode.Attributes.GetNamedItem("key").Value == "Connection")
          {
           //写入连接字符串
           xmlNode.Attributes.GetNamedItem("value").Value = ConnectionString;
           Changed = true;         
          } 
         }
        }
        if(!Changed)
         throw new InstallException("web.config 文件没有包含Connection连接字符串的设置");
        else
         xmlDoc.Save(xmlfile.FullName);

       }
       catch(Exception ex)
       {
        MessageBox.Show("没有发现webconfig文件,请重新安装程序"+ex.Message);
       }
      }


      /// <summary>
      /// 设置虚拟目录
      /// </summary>
      /// <param name="vdirName">虚拟目录名</param>
      /// <param name="vdirPath">虚拟目录物力路径</param>
      private void VirtualDirDeploy(string vdirName,string vdirPath)
      {
       IISManager iismanager = new IISManager();
       iismanager.Connect();
       VirtualDirectory newvdir = new VirtualDirectory(vdirName,vdirPath);
       VirtualDirectories vdics = iismanager.VirDirs;
       //穷举所有虚拟目录,
       //检测创建的虚拟目录是否与已有的目录重名
       foreach(VirtualDirectory vdir in vdics.Values)
       {
        //有重名目录存在,给出提示
        if(vdir.Name==virtualname)
        {
         //选择覆盖虚拟目录,
         //删除现有虚拟目录,
         //根据新的文件路径创建新的虚拟目录
         if( MessageBox.Show(this,
          "您指定的虚拟目录名已存在,您是否要覆盖现有的虚拟目录!",
          MessageBoxButtons.YesNo,
          MessageBoxIcon.Question,
          MessageBoxDefaultButton.Button2,
          MessageBoxOptions.DefaultDesktopOnly
          )==DialogResult.OK)
         {
          iismanager.Delete(vdir.Path);
          iismanager.Create(newvdir);
          break;
         }
               
        }
         //无重名,创建新虚拟目录
        else
        {
         iismanager.Create(newvdir);
        }
       }

      }


      //安装配置
      public override void Install(IDictionary stateSaver)
      {
       base.Install (stateSaver);
       //数据库
       DataBaseDeploy(@"d:\test.bak","testdb");
       //config文件配置连接字符串
       WebconfigDeploy(@"data source=localhost;database=ZTWJMIS1;user id=sa;pwd=123");
       //虚拟目录
       VirtualDirDeploy("VirtualTest",@"d:\vdir");
      }
     }

     #region       IIS管理类
     /// <summary>
     /// IISManager 管理类。
     /// </summary>
     public class IISManager 
     {
      //定义需要使用的
      private string _server,_website,_AnonymousUserPass,_AnonymousUserName;
      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>

      public void get_AnonymousUser()
      {
       _AnonymousUserPass="IUSR_DEVE-SERVER";
       _AnonymousUserName="IUSR_DEVE-SERVER";
       VirtualDirectory vDir;
       try
       {
        Hashtable myList = (Hashtable)_virdirs;
        IDictionaryEnumerator myEnumerator = myList.GetEnumerator();
        while ( myEnumerator.MoveNext() )
        {
         vDir = (VirtualDirectory)myEnumerator.Value;
         if (vDir.AnonymousUserName!="" && vDir.AnonymousUserPass != "")
         {
          _AnonymousUserName=vDir.AnonymousUserName;
          _AnonymousUserPass=vDir.AnonymousUserPass;
          break;
         }
        }
       }
       catch
       {
        _AnonymousUserPass="IUSR_DEVE-SERVER";
        _AnonymousUserName="IUSR_DEVE-SERVER";
       }
      }
      public string AnonymousUserName
      {
       get{ return _AnonymousUserName;}
       set{ _AnonymousUserName = value;}
      }
      public string AnonymousUserPass
      {
       get{ return _AnonymousUserPass;}
       set{ _AnonymousUserPass = value;}
      }
      //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 bool 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);
         return true;
        }
        catch(Exception ee)
        {
         //throw new Exception(ee.ToString());
         return false;
        }
       }
       else
       {
        return true;
        //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>

      public void Close()
      {
       _virdirs.Clear();
       _virdirs = null;
       rootfolder.Dispose();

      }
      //连接服务器
      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;
      }
      //更新东东
      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;
      }

     }

     #endregion
     #region 虚拟目录类
     /// <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 sVirDirName)
      {
       SetValue();
       _name = sVirDirName;
      }
      // sVirDirName:虚拟路径;
      // strPhyPath: 物理路径( physics Path)
      public VirtualDirectory(string sVirDirName,string strPhyPath,string[] AnonymousUser)
      {
       SetValue();
       _name = sVirDirName;
       _path = strPhyPath;
       _ausername = AnonymousUser[0];
       _auserpass = AnonymousUser[1];
      }
      private void SetValue()
      {
       _read = true;_execute = false;_script = true;_ssl= false;_write=false;_authbasic=false;
       _authntlm=true;_indexed = true;_endirbrow=false;_endefaultdoc = true;
       _flag = 1;
       _defaultdoc = "default.htm,default.aspx,default.asp,index.htm";
       _path = "C:\\";
       _ausername = "IUSR_DEVE-SERVER";_auserpass ="IUSR_DEVE-SERVER";_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;}
      }
     }

     #endregion
     #region 虚拟目录集合类
     /// <summary>
     /// 集合VirtualDirectories
     /// </summary>
     public class VirtualDirectories : System.Collections.Hashtable
     {
      public VirtualDirectories()
      {
      }
      //添加新的方法
      public VirtualDirectory Find(string strName)
      {
       return (VirtualDirectory)this[strName];
      }
     }
     #endregion
    }

  • 相关阅读:
    js实现对身份证校验
    zip解压缩
    zip压缩
    文件内容编解码
    文件的操作
    Mysql账号管理
    深度优先算法DFS
    Java常见知识问答
    Hibernate的单向OneToMany、单向ManyToOne
    Angularjs在线编辑器
  • 原文地址:https://www.cnblogs.com/zhuor/p/318339.html
Copyright © 2011-2022 走看看