>
最近做了一个WEB程序的安装包,我把制作的过程做个介绍,贴出源码给大家做个参考
看看inno 的脚本
1
[Setup]
2 AppCopyright = test
3 AppName = test
4 AppVerName = test v2. 0
5 SolidCompression = true
6 OutputDir = Output\
7 OutputBaseFilename = test_setup
8 DefaultDirName = {pf} \Lms
9 DefaultGroupName = Lms
10 ;安装程序的基本信息
11 [_ISTool]
12 UseAbsolutePaths = false
13
14 [UninstallDelete]
15 Type: files; Name: {app} \init_test.log
16 Type: dirifempty; Name: {app} \database
17 ;需要提示卸载程序额外删除的目录
18 [Run]
19 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
20 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
21 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
22 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
23 Filename: {tmp} \init_test.exe; Parameters: """ {app} "" 2.0 " ; Description: Configure SQLServer; StatusMsg: Configuring Database; Flags: postinstall skipifdoesntexist
24 ;uncomment this line to use for dotnet 1.1
25 ;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
26 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
27 ;安装过程需要运行的程序,SetACL.EXE是一个第三方组件使用方法大家可以google一下,init_test.exe为附加数据库和数据还有设置asp.net版本的程序
28
29 [Dirs]
30 Name: {app} \database
31 Name: {app} \course
32 ;产生目录
33 [Types]
34 Name: Custom; Description: Custom installation; Flags: iscustom
35
36 [Files]
37 Source: 3rdParty\SetACL.exe; DestDir: {tmp} ; flags: deleteafterinstall
38 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
39 Source: test_table.sql; DestDir: {tmp} ; Flags: deleteafterinstall
40 Source: test_Data.sql; DestDir: {tmp} ; Flags: deleteafterinstall
41 Source: init_test.exe; DestDir: {tmp} ; flags: deleteafterinstall
42 ;需要随安装包一起打包的文件
43 [Code]
44 const
45 VDirName = ' test ' ;
46 Vwebctrl = ' webctrl_client ' ;
47 IISServerNumber = ' 1 ' ;
48
49 function SafeCreateOleObject(ProgId:String;ExceptionMsg:String):Variant;
50 var
51 retobj:Variant;
52 begin
53 try
54 retobj : = CreateOleObject(ProgId);
55 except
56 RaiseException(ExceptionMsg + '' # 13 # 13 ' (Error ''' + GetExceptionMessage + ''' occurred) ' );
57 end;
58 Result: = retobj;
59 end;
60
61 {
62 create virtual directory, pointing to installation directory
63}
64
65 procedure SetupIIS;
66 var
67 IIS, WebSite, WebServer, WebRoot, VDir: Variant;
68 begin
69 { Create the main IIS COM Automation object }
70 IIS: = SafeCreateOleObject( ' IISNamespace ' , ' Please install Microsoft IIS first. ' );
71 { Connect to the IIS server }
72
73 WebSite : = IIS.GetObject( ' IIsWebService ' , GetComputerNameString() + ' /w3svc ' );
74 WebServer : = WebSite.GetObject( ' IIsWebServer ' , IISServerNumber);
75 WebRoot : = WebServer.GetObject( ' IIsWebVirtualDir ' , ' Root ' );
76
77 { (Re)create a virtual dir }
78
79 try
80 WebRoot.Delete( ' IIsWebVirtualDir ' , VDirName);
81 except
82 end;
83 try
84 WebRoot.Delete( ' IIsWebVirtualDir ' , Vwebctrl);
85 except
86 end;
87
88 If DirExists(ExpandConstant( ' {app} ' )) then
89 begin
90 VDir : = WebRoot.Create( ' IIsWebVirtualDir ' , VDirName);
91 VDir.AccessRead : = True;
92 VDir.AccessFlags: = 529 ;
93 VDir.AppFriendlyName : = ' LMS Website ' ;
94 VDir.Path : = ExpandConstant( ' {app}\ ' );
95 VDir.EnableDirBrowsing: = False;
96 VDir.EnableDefaultDoc: = True;
97 VDir.DefaultDoc : = ' Default.aspx ' ;
98 VDir.AppCreate(True);
99 VDir.SetInfo();
100 end;
101
102 If DirExists(ExpandConstant( ' {app}\IEWebControl\ ' + Vwebctrl)) then
103 begin
104 VDir : = WebRoot.Create( ' IIsWebVirtualDir ' , Vwebctrl);
105 VDir.AccessRead : = True;
106 VDir.AccessFlags: = 529 ;
107 VDir.AppFriendlyName : = ' visual web ctral ' ;
108 VDir.Path : = ExpandConstant( ' {app}\IEWebControl\ ' + Vwebctrl);
109 VDir.EnableDirBrowsing: = False;
110 VDir.EnableDefaultDoc: = True;
111 VDir.DefaultDoc : = ' default.htm ' ;
112 VDir.AppCreate(True);
113 VDir.SetInfo();
114 end;
115 end;
116 procedure ControlIIS(bState:boolean);
117 var
118 resultcode:integer;
119 param: string ;
120 begin
121 if bState then
122 param: = ' START '
123 else param: = ' STOP ' ;
124
125 Exec( ' NET.EXE ' ,param + ' "IIS ADMIN" ' ,
126 ExpandConstant( ' {sys} ' ),SW_SHOW,ewWaitUntilTerminated,resultcode
127 );
128 end;
129 ;在IIS默认站点下添加虚拟目录
130 procedure CurStepChanged(CurStep: TSetupStep);
131 begin
132 case CurStep of
133 ssPostInstall:
134 begin
135 SetupIIS();
136 // ControlIIS(true);
137 end;
138 ssInstall:
139 // ControlIIS(false);
140 else
141 ;
142 end;
143 end;
2 AppCopyright = test
3 AppName = test
4 AppVerName = test v2. 0
5 SolidCompression = true
6 OutputDir = Output\
7 OutputBaseFilename = test_setup
8 DefaultDirName = {pf} \Lms
9 DefaultGroupName = Lms
10 ;安装程序的基本信息
11 [_ISTool]
12 UseAbsolutePaths = false
13
14 [UninstallDelete]
15 Type: files; Name: {app} \init_test.log
16 Type: dirifempty; Name: {app} \database
17 ;需要提示卸载程序额外删除的目录
18 [Run]
19 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
20 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
21 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
22 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
23 Filename: {tmp} \init_test.exe; Parameters: """ {app} "" 2.0 " ; Description: Configure SQLServer; StatusMsg: Configuring Database; Flags: postinstall skipifdoesntexist
24 ;uncomment this line to use for dotnet 1.1
25 ;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
26 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
27 ;安装过程需要运行的程序,SetACL.EXE是一个第三方组件使用方法大家可以google一下,init_test.exe为附加数据库和数据还有设置asp.net版本的程序
28
29 [Dirs]
30 Name: {app} \database
31 Name: {app} \course
32 ;产生目录
33 [Types]
34 Name: Custom; Description: Custom installation; Flags: iscustom
35
36 [Files]
37 Source: 3rdParty\SetACL.exe; DestDir: {tmp} ; flags: deleteafterinstall
38 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
39 Source: test_table.sql; DestDir: {tmp} ; Flags: deleteafterinstall
40 Source: test_Data.sql; DestDir: {tmp} ; Flags: deleteafterinstall
41 Source: init_test.exe; DestDir: {tmp} ; flags: deleteafterinstall
42 ;需要随安装包一起打包的文件
43 [Code]
44 const
45 VDirName = ' test ' ;
46 Vwebctrl = ' webctrl_client ' ;
47 IISServerNumber = ' 1 ' ;
48
49 function SafeCreateOleObject(ProgId:String;ExceptionMsg:String):Variant;
50 var
51 retobj:Variant;
52 begin
53 try
54 retobj : = CreateOleObject(ProgId);
55 except
56 RaiseException(ExceptionMsg + '' # 13 # 13 ' (Error ''' + GetExceptionMessage + ''' occurred) ' );
57 end;
58 Result: = retobj;
59 end;
60
61 {
62 create virtual directory, pointing to installation directory
63}
64
65 procedure SetupIIS;
66 var
67 IIS, WebSite, WebServer, WebRoot, VDir: Variant;
68 begin
69 { Create the main IIS COM Automation object }
70 IIS: = SafeCreateOleObject( ' IISNamespace ' , ' Please install Microsoft IIS first. ' );
71 { Connect to the IIS server }
72
73 WebSite : = IIS.GetObject( ' IIsWebService ' , GetComputerNameString() + ' /w3svc ' );
74 WebServer : = WebSite.GetObject( ' IIsWebServer ' , IISServerNumber);
75 WebRoot : = WebServer.GetObject( ' IIsWebVirtualDir ' , ' Root ' );
76
77 { (Re)create a virtual dir }
78
79 try
80 WebRoot.Delete( ' IIsWebVirtualDir ' , VDirName);
81 except
82 end;
83 try
84 WebRoot.Delete( ' IIsWebVirtualDir ' , Vwebctrl);
85 except
86 end;
87
88 If DirExists(ExpandConstant( ' {app} ' )) then
89 begin
90 VDir : = WebRoot.Create( ' IIsWebVirtualDir ' , VDirName);
91 VDir.AccessRead : = True;
92 VDir.AccessFlags: = 529 ;
93 VDir.AppFriendlyName : = ' LMS Website ' ;
94 VDir.Path : = ExpandConstant( ' {app}\ ' );
95 VDir.EnableDirBrowsing: = False;
96 VDir.EnableDefaultDoc: = True;
97 VDir.DefaultDoc : = ' Default.aspx ' ;
98 VDir.AppCreate(True);
99 VDir.SetInfo();
100 end;
101
102 If DirExists(ExpandConstant( ' {app}\IEWebControl\ ' + Vwebctrl)) then
103 begin
104 VDir : = WebRoot.Create( ' IIsWebVirtualDir ' , Vwebctrl);
105 VDir.AccessRead : = True;
106 VDir.AccessFlags: = 529 ;
107 VDir.AppFriendlyName : = ' visual web ctral ' ;
108 VDir.Path : = ExpandConstant( ' {app}\IEWebControl\ ' + Vwebctrl);
109 VDir.EnableDirBrowsing: = False;
110 VDir.EnableDefaultDoc: = True;
111 VDir.DefaultDoc : = ' default.htm ' ;
112 VDir.AppCreate(True);
113 VDir.SetInfo();
114 end;
115 end;
116 procedure ControlIIS(bState:boolean);
117 var
118 resultcode:integer;
119 param: string ;
120 begin
121 if bState then
122 param: = ' START '
123 else param: = ' STOP ' ;
124
125 Exec( ' NET.EXE ' ,param + ' "IIS ADMIN" ' ,
126 ExpandConstant( ' {sys} ' ),SW_SHOW,ewWaitUntilTerminated,resultcode
127 );
128 end;
129 ;在IIS默认站点下添加虚拟目录
130 procedure CurStepChanged(CurStep: TSetupStep);
131 begin
132 case CurStep of
133 ssPostInstall:
134 begin
135 SetupIIS();
136 // ControlIIS(true);
137 end;
138 ssInstall:
139 // ControlIIS(false);
140 else
141 ;
142 end;
143 end;
再来看一下init_lms.exe的主要方法:
1
private
void
CreateDatabase()
2 {
3 string sql = " CREATE DATABASE "
4 + dbName;
5
6 if (IsLocalInstall())
7 {
8 sql += " ON PRIMARY (NAME = " + dbDataName + ", "
9 + " FILENAME = '" + getDir("database\\" + dbDataName + ".mdf") + "', "
10 + " SIZE = 5MB,"
11 + " FILEGROWTH =1) "
12 + " LOG ON (NAME =" + dbLogName + ", "
13 + " FILENAME = '" + getDir("database\\" + dbLogName + ".ldf") + "', "
14 + " SIZE = 1MB, "
15 + " FILEGROWTH =1) ";
16 }
17 sql += " COLLATE Chinese_PRC_CI_AS";
18 try
19 {
20 this.Cursor = Cursors.WaitCursor;
21 frmProg.StepText("drop database");
22 if (chkCreateDB.Checked)
23 {
24 try
25 {
26 execSQL("master", "DROP DATABASE " + dbName);
27 writeLog("old database dropped");
28 }
29 catch (Exception)
30 {
31 writeLog("database not found or unable to be dropped");
32 }
33
34 }
35 frmProg.StepText("creating database");
36 if (chkCreateDB.Checked)
37 {
38 try
39 {
40 execSQL("master", sql);
41 writeLog("DB CREATED:" + sql);
42 }
43 catch (Exception e)
44 {
45 writeLog("DB CREATING ERROR:" + e.Message);
46 }
47 }
48
49 frmProg.StepText("creating tables");
50
51 if (chkTables.Checked)
52 {
53 writeLog("exec lmsdb_table.sql");
54 dmoExecSQL(sqlb_t.ToString());//dbName, sqlb);
55 }
56
57 frmProg.StepText("initialize base data");
58
59 if (chkDatas.Checked)
60 {
61 //writeLog(sqlb.ToString());
62 writeLog("exec lmsbasedata.sql");
63 dmoExecSQL(sqlb_d.ToString());//execSQL(dbName, sqlb);
64 }
65 frmProg.StepText("database initialization is done");
66 }
67 finally
68 {
69 this.Cursor = Cursors.Default;
70 }
71 }
2 {
3 string sql = " CREATE DATABASE "
4 + dbName;
5
6 if (IsLocalInstall())
7 {
8 sql += " ON PRIMARY (NAME = " + dbDataName + ", "
9 + " FILENAME = '" + getDir("database\\" + dbDataName + ".mdf") + "', "
10 + " SIZE = 5MB,"
11 + " FILEGROWTH =1) "
12 + " LOG ON (NAME =" + dbLogName + ", "
13 + " FILENAME = '" + getDir("database\\" + dbLogName + ".ldf") + "', "
14 + " SIZE = 1MB, "
15 + " FILEGROWTH =1) ";
16 }
17 sql += " COLLATE Chinese_PRC_CI_AS";
18 try
19 {
20 this.Cursor = Cursors.WaitCursor;
21 frmProg.StepText("drop database");
22 if (chkCreateDB.Checked)
23 {
24 try
25 {
26 execSQL("master", "DROP DATABASE " + dbName);
27 writeLog("old database dropped");
28 }
29 catch (Exception)
30 {
31 writeLog("database not found or unable to be dropped");
32 }
33
34 }
35 frmProg.StepText("creating database");
36 if (chkCreateDB.Checked)
37 {
38 try
39 {
40 execSQL("master", sql);
41 writeLog("DB CREATED:" + sql);
42 }
43 catch (Exception e)
44 {
45 writeLog("DB CREATING ERROR:" + e.Message);
46 }
47 }
48
49 frmProg.StepText("creating tables");
50
51 if (chkTables.Checked)
52 {
53 writeLog("exec lmsdb_table.sql");
54 dmoExecSQL(sqlb_t.ToString());//dbName, sqlb);
55 }
56
57 frmProg.StepText("initialize base data");
58
59 if (chkDatas.Checked)
60 {
61 //writeLog(sqlb.ToString());
62 writeLog("exec lmsbasedata.sql");
63 dmoExecSQL(sqlb_d.ToString());//execSQL(dbName, sqlb);
64 }
65 frmProg.StepText("database initialization is done");
66 }
67 finally
68 {
69 this.Cursor = Cursors.Default;
70 }
71 }
这个方法主要是创建数据库文件
1
private
void
setAspNetVersion(
string
m,
string
i)
2 {
3 string dotnetdir=addBackSlash(Environment.GetEnvironmentVariable("windir"))+"Microsoft.Net";
4 string[] dirs = Directory.GetDirectories(dotnetdir+"\\Framework\\");
5 foreach (string d in dirs)
6 {
7 int p = d.LastIndexOf("\\v");
8 if (p >= 0)
9 {
10 string v = d.Substring(p + 2);
11 aspver = v;
12 string[] mi = v.Split(new char[] { '.' });
13 if (mi[0].CompareTo(m)==0 && mi[1].CompareTo(i)>=0)
14 {
15 //found the directory
16 string regiis = d + "\\aspnet_regiis.exe";
17 if (File.Exists(regiis)){
18 Process proc=new Process();
19 try{
20 proc.StartInfo.FileName=regiis;
21 proc.StartInfo.Arguments = "-s W3SVC/1/ROOT/Lms";
22 proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
23 proc.StartInfo.CreateNoWindow=true;
24 proc.Start();
25 proc.WaitForExit(10000);
26 }catch (Win32Exception e){
27
28 if(e.NativeErrorCode == ERROR_FILE_NOT_FOUND)
29 {
30 Console.WriteLine(e.Message + ". Check the path.");
31 } else if (e.NativeErrorCode == ERROR_ACCESS_DENIED)
32 {
33 Console.WriteLine(e.Message +
34 ". You do not have permission to run.");
35 }
36 } //catch
37 }//if file.exists
38 }//if compare version
39 }//if pos>=0
40 }//for each
41
42 }
2 {
3 string dotnetdir=addBackSlash(Environment.GetEnvironmentVariable("windir"))+"Microsoft.Net";
4 string[] dirs = Directory.GetDirectories(dotnetdir+"\\Framework\\");
5 foreach (string d in dirs)
6 {
7 int p = d.LastIndexOf("\\v");
8 if (p >= 0)
9 {
10 string v = d.Substring(p + 2);
11 aspver = v;
12 string[] mi = v.Split(new char[] { '.' });
13 if (mi[0].CompareTo(m)==0 && mi[1].CompareTo(i)>=0)
14 {
15 //found the directory
16 string regiis = d + "\\aspnet_regiis.exe";
17 if (File.Exists(regiis)){
18 Process proc=new Process();
19 try{
20 proc.StartInfo.FileName=regiis;
21 proc.StartInfo.Arguments = "-s W3SVC/1/ROOT/Lms";
22 proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
23 proc.StartInfo.CreateNoWindow=true;
24 proc.Start();
25 proc.WaitForExit(10000);
26 }catch (Win32Exception e){
27
28 if(e.NativeErrorCode == ERROR_FILE_NOT_FOUND)
29 {
30 Console.WriteLine(e.Message + ". Check the path.");
31 } else if (e.NativeErrorCode == ERROR_ACCESS_DENIED)
32 {
33 Console.WriteLine(e.Message +
34 ". You do not have permission to run.");
35 }
36 } //catch
37 }//if file.exists
38 }//if compare version
39 }//if pos>=0
40 }//for each
41
42 }
这个方法主要是利用aspnet_regiis.exe来修改ASP.NET的版本,这个文件在Microsoft.Net目录下