用Inno Setup制作WEB程序安装包

原文 用Inno Setup制作WEB程序安装包

最近做了一个WEB程序的安装包,我把制作的过程做个介绍,贴出源码给大家做个参考

看看inno 的脚本

   

[Setup]
AppCopyright=test
AppName=test
AppVerName=test v2.0
SolidCompression=true
OutputDir=Output\
OutputBaseFilename=test_setup
DefaultDirName={pf}\Lms
DefaultGroupName=Lms
;安装程序的基本信息
[_ISTool]
UseAbsolutePaths=false

[UninstallDelete]
Type: files; Name: {app}\init_test.log
Type: dirifempty; Name: {app}\database
;需要提示卸载程序额外删除的目录
[Run]
Filename: {tmp}\SetACL.EXE; Parameters: "-ot file -on ""{app}"" -actn ace -ace ""n:S-1-5-20;s:y;p:change,full"""; Flags: runhidden waituntilterminated skipifdoesntexist
Filename: {tmp}\SetACL.EXE; Parameters: "-ot file -on ""{app}"" -actn ace -ace ""n:S-1-5-32-545;s:y;p:change,full"""; Flags: runhidden waituntilterminated skipifdoesntexist
Filename: {tmp}\SetACL.EXE; Parameters: "-ot file -on ""{app}"" -actn ace -ace ""n:S-1-1-0;s:y;p:change,full"""; Flags: runhidden waituntilterminated skipifdoesntexist
Filename: {tmp}\SetACL.EXE; Parameters: "-ot file -on ""{app}\database"" -actn ace -ace ""n:S-1-1-0;s:y;p:change,full"""; Flags: runhidden waituntilterminated skipifdoesntexist
Filename: {tmp}\init_test.exe; Parameters: """{app}"" 2.0"; Description: Configure SQLServer; StatusMsg: Configuring Database; Flags: postinstall skipifdoesntexist
;uncomment this line to use for dotnet 1.1
;Filename: {tmp}\SetACL.exe; Parameters: "-ot file -on ""{win}\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files"" -actn ace -ace ""n:S-1-1-0;s:y;p:change,full"""; Flags: runhidden
Filename: {tmp}\SetACL.exe; Parameters: "-ot file -on ""{win}\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files"" -actn ace -ace ""n:S-1-1-0;s:y;p:change,full"""; Flags: runhidden
;安装过程需要运行的程序,SetACL.EXE是一个第三方组件使用方法大家可以google一下,init_test.exe为附加数据库和数据还有设置asp.net版本的程序

[Dirs]
Name: {app}\database
Name: {app}\course
;产生目录
[Types]
Name: Custom; Description: Custom installation; Flags: iscustom

[Files]
Source: 3rdParty\SetACL.exe; DestDir: {tmp}; flags: deleteafterinstall
Source: test\*; DestDir: {app}; Excludes:*.webinfo,*.vspscc, \obj,Thumbs.db,CVS,*.pdb,*.cs,*.scc,*.bak,*.csproj,*.log,*.Old,*.user,*.lic,*.sln,*.suo,8.rar; Flags: recursesubdirs
Source: test_table.sql; DestDir: {tmp}; Flags: deleteafterinstall
Source: test_Data.sql; DestDir: {tmp}; Flags: deleteafterinstall
Source: init_test.exe; DestDir: {tmp}; flags: deleteafterinstall
;需要随安装包一起打包的文件
[Code]
const
  VDirName = 'test';
  Vwebctrl = 'webctrl_client';
  IISServerNumber = '1';

function SafeCreateOleObject(ProgId:String;ExceptionMsg:String):Variant;
var
  retobj:Variant;
begin
  try
    retobj := CreateOleObject(ProgId);
  except
    RaiseException(ExceptionMsg+''#13#13'(Error ''' + GetExceptionMessage + ''' occurred)');
  end;
  Result:=retobj;
end;

{
   create virtual directory, pointing to installation directory
}

procedure SetupIIS;
var
  IIS, WebSite, WebServer, WebRoot, VDir: Variant;
begin
  { Create the main IIS COM Automation object }
  IIS:=SafeCreateOleObject('IISNamespace','Please install Microsoft IIS first.');
  { Connect to the IIS server }

  WebSite := IIS.GetObject('IIsWebService', GetComputerNameString() + '/w3svc');
  WebServer := WebSite.GetObject('IIsWebServer', IISServerNumber);
  WebRoot := WebServer.GetObject('IIsWebVirtualDir', 'Root');

  { (Re)create a virtual dir }

  try
    WebRoot.Delete('IIsWebVirtualDir', VDirName);
  except
  end;
  try
    WebRoot.Delete('IIsWebVirtualDir', Vwebctrl);
  except
  end;

  If DirExists(ExpandConstant('{app}')) then
  begin
  VDir := WebRoot.Create('IIsWebVirtualDir', VDirName);
  VDir.AccessRead := True;
  VDir.AccessFlags:=529;
  VDir.AppFriendlyName := 'LMS Website';
  VDir.Path := ExpandConstant('{app}\');
  VDir.EnableDirBrowsing:=False;
  VDir.EnableDefaultDoc:=True;
  VDir.DefaultDoc :='Default.aspx';
  VDir.AppCreate(True);
  VDir.SetInfo();
  end;

  If DirExists(ExpandConstant('{app}\IEWebControl\'+Vwebctrl)) then
  begin
  VDir := WebRoot.Create('IIsWebVirtualDir', Vwebctrl);
  VDir.AccessRead := True;
  VDir.AccessFlags:=529;
  VDir.AppFriendlyName := 'visual web ctral';
  VDir.Path := ExpandConstant('{app}\IEWebControl\'+Vwebctrl);
  VDir.EnableDirBrowsing:=False;
  VDir.EnableDefaultDoc:=True;
  VDir.DefaultDoc :='default.htm';
  VDir.AppCreate(True);
  VDir.SetInfo();
  end;
end;
procedure ControlIIS(bState:boolean);
var
  resultcode:integer;
  param:string;
begin
      if bState then
         param:='START'
      else param:='STOP';

      Exec('NET.EXE',param+' "IIS ADMIN"',
              ExpandConstant('{sys}'),SW_SHOW,ewWaitUntilTerminated,resultcode
          );
end;
;在IIS默认站点下添加虚拟目录
procedure CurStepChanged(CurStep: TSetupStep);
begin
    case CurStep of
      ssPostInstall:
        begin
          SetupIIS();
          //ControlIIS(true);
        end;
      ssInstall:
        //ControlIIS(false);
    else
       ;
    end;
end;

  

再来看一下init_lms.exe的主要方法:

  

 private void CreateDatabase()
        {
            string sql = " CREATE DATABASE "
                               + dbName;

            if (IsLocalInstall())
            {
                sql += " ON PRIMARY (NAME = " + dbDataName + ", "
                       + " FILENAME = '" + getDir("database\\" + dbDataName + ".mdf") + "', "
                               + " SIZE = 5MB,"
                               + " FILEGROWTH =1) "
                               + " LOG ON (NAME =" + dbLogName + ", "
                               + " FILENAME = '" + getDir("database\\" + dbLogName + ".ldf") + "', "
                               + " SIZE = 1MB, "
                               + " FILEGROWTH =1) ";
            }
            sql += " COLLATE Chinese_PRC_CI_AS";
            try
            {
                this.Cursor = Cursors.WaitCursor;
                frmProg.StepText("drop database");
                if (chkCreateDB.Checked)
                {
                    try
                    {
                        execSQL("master", "DROP DATABASE " + dbName);
                        writeLog("old database dropped");
                    }
                    catch (Exception)
                    {
                        writeLog("database not found or unable to be dropped");
                    }

                }
                frmProg.StepText("creating database");
                if (chkCreateDB.Checked)
                {
                    try
                    {
                        execSQL("master", sql);
                        writeLog("DB CREATED:" + sql);
                    }
                    catch (Exception e)
                    {
                        writeLog("DB CREATING ERROR:" + e.Message);
                    }
                }                

                frmProg.StepText("creating tables");

                if (chkTables.Checked)
                {
                    writeLog("exec lmsdb_table.sql");
                    dmoExecSQL(sqlb_t.ToString());//dbName, sqlb);
                }

                frmProg.StepText("initialize base data");

                if (chkDatas.Checked)
                {
                    //writeLog(sqlb.ToString());
                    writeLog("exec lmsbasedata.sql");
                    dmoExecSQL(sqlb_d.ToString());//execSQL(dbName, sqlb);
                }
                frmProg.StepText("database initialization is done");
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }

  

这个方法主要是创建数据库文件

  

private void setAspNetVersion(string m,string i)
         {
             string dotnetdir=addBackSlash(Environment.GetEnvironmentVariable("windir"))+"Microsoft.Net";
             string[] dirs = Directory.GetDirectories(dotnetdir+"\\Framework\\");
             foreach (string d in dirs)
             {
                 int p = d.LastIndexOf("\\v");
                 if (p >= 0)
                 {
                     string v = d.Substring(p + 2);
                     aspver = v;
                     string[] mi = v.Split(new char[] { '.' });
                     if (mi[0].CompareTo(m)==0 && mi[1].CompareTo(i)>=0)
                     {
                         //found the directory
                         string regiis = d + "\\aspnet_regiis.exe";
                         if (File.Exists(regiis)){
                             Process proc=new Process();
                             try{
                                 proc.StartInfo.FileName=regiis;
                                 proc.StartInfo.Arguments = "-s W3SVC/1/ROOT/Lms";
                                 proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                                 proc.StartInfo.CreateNoWindow=true;
                                 proc.Start();
                                 proc.WaitForExit(10000);
                             }catch (Win32Exception e){

                                  if(e.NativeErrorCode == ERROR_FILE_NOT_FOUND)
                                 {
                                 Console.WriteLine(e.Message + ". Check the path.");
                                  } else if (e.NativeErrorCode == ERROR_ACCESS_DENIED)
                                 {
                                      Console.WriteLine(e.Message +
                         ". You do not have permission to run.");
                                  }
                             }    //catch
                         }//if file.exists
                     }//if compare version
                 }//if pos>=0
             }//for each

         }

  

这个方法主要是利用aspnet_regiis.exe来修改ASP.NET的版本,这个文件在Microsoft.Net目录下

时间: 2024-10-04 17:19:43

用Inno Setup制作WEB程序安装包的相关文章

用inno Setup制作web项目安装包

原文:用inno Setup制作web项目安装包 用inno Setup制作安装包 新建一个文件夹exambody,放apache-tomcat-6.0.33.mysql-5.1.37-win32.java(注:jdk)和图标exambody.ico   1.       批处理安装mysql服务: 在mysql-5.1.37-win32\bin 的目录下: 新建一个文件:启动服务.bat 里面写: cd /d %~dp0                                     

关于使用installshield创建web程序安装包的问题,

问题描述 最近公司需要对做好的产品制作一个安装包,用户可以对我们提供的功能进行选择,web.config文件中的一些配置也由安装包来进行配置..刚开始我选择了VS2005中自带的安装部署项目来进行,一直不如所愿~后来使用了installshield来进行制作,基础的安装弄好了,但是还有选择功能和修改web.config文件一直不知道从何下手请教各位有做过类似的安装包吗.或者对installshield有使用过的朋友请给点意见!谢谢~ 解决方案 解决方案二:都木有人么...解决方案三:该回复于20

VS2010制作C#程序安装包问题……

问题描述 我按网上教程一步步去做了,也生成了setup.exe和Setup.msi,但是一安装就会出现错误,说是拒绝访问msi文件,而且我生成安装包的VS项目所添加的程序集有很多下面都加了一条红线,还有原本教程是说选择"从与我应用程序相同的位置下载系统必备组件",但一生成解决方案就会出现很多错误,说是不能选择此项,只能是"从组件供应商的网站上下载系统必备组件",然后我就改成了后面一项,我不知是哪里出了问题,求各位大神帮忙看看,我是新手,我分已经不多了,最近为做这个程

服务自动重启-使用inno setup制作安装包,如何实现该软件的服务崩溃后会自动重启

问题描述 使用inno setup制作安装包,如何实现该软件的服务崩溃后会自动重启 如同windows的服务-->属性-->恢复功能 解决方案 调用schttps://technet.microsoft.com/en-us/library/cc742019(v=ws.10).aspx actions= {"""" | {[run/] | [restart/] | [reboot/]}[/...]Specifies one or more failure

[程序安装包制作] Advanced Installer 备忘

原文:[程序安装包制作] Advanced Installer 备忘 Product Information - Product Details 这个重点是Product Version.讲这个之前,首先要知道Product Code和Upgrade Code这两个属性,同时大家不要被这两个英文词语的字面意思所以迷惑. 同一款产品,不同的版本的安装包,Product Code必须不同,但Upgrade Code必须相同. 例如,现在有一款软件叫"Hello World",已经制作了1.

winform应用 发布-winform 程序安装包制作

问题描述 winform 程序安装包制作 我有一个已经开发好的系统(winform),我现在要为它制作一个安装包,包含数据库还有.netframwork类库 还有一些乱七八糟的文件 我该怎么去做这个安装包?用哪个比较好,最好给一个有下载地址 和demo的.谢谢大神了!

基于DevExpress的Winform程序安装包的制作

在我们做系统开发的时候,都会面临一个安装包制作的问题,如何把我们做好的系统,通过安装包工具整合成一个安装包给客户进行安装.安装包的优势就是一步步安装就可以了,不用复制一大堆文件给客户,还怕缺少那个文件导致系统运行出错.本文主要介绍基于DevExpress的Winform程序安装包的制作内容,包括VS2010和VS2013/V2105的不同处理方式. 我们知道,VS2010是最后一个可以使用微软安装包制作工具的VS版本了,所以后面VS2012/2013/2015版本都需要使用第三方安装包制作工具,

制作iis自动安装包

原文:制作iis自动安装包 MS 一直没有提供可独立安装的 IIS 安装包,Windows 的缺省安装没有安装它,通常要到控制面板的"添加/删除 Windows 程序"中去选择安装.对于熟悉 Windows 安装的人来说这没有问题,但对于要独立发行的软件包却可能是一个问题,并非所有最终用户都熟悉如何去安装 IIS.各大网站都有不同版本的 iis 安装包可下载,可下载回来你仍然找不到其中有可以执行的安装程序.通过在网上查询,得出自己制作 IIS 一键安装的方法如下: 1. 根据使用的 W

IS2009制作Oracle 静默安装包(二) 感谢空白先生特许授权

原文:IS2009制作Oracle 静默安装包(二) 感谢空白先生特许授权 上一篇: IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权 本文经原作者特许授权于海洋女神发布,转载请务必注明出处与链接:原作者和海洋女神保留对该文的一切法律许可下的权益:需要发布在盈利性报刊.网站等请与原作者或海洋女神联系. 第三部分:使用IS2009向导设置1. 打开 InstallShield2009,新建一个Installscript MSI Project,建议选择此工程,因为该工程支持脚本编