感谢您的回复Baldy。这正是我所想和做的小测试。我有一个带有一个标签的简单的ASP .NET Web应用程序,一个具有覆盖方法的类库项目Install(创建一个批处理文件并执行它),一个实际安装的WebSetup项目,在安装过程中它将执行Install方法类图书馆项目。下面的代码 -
1)ClassLibrary项目 - MyCustomAction
<RunInstaller(True)> _
Public Class SetupAction
Inherits Installer
Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
MyBase.Install(stateSaver)
Try
My.Computer.FileSystem.WriteAllText("E:\SetupTest.txt", Environment.NewLine + "File created from MyCustomAction project", True)
'Shell("SQLCMD -S Dev1 -d Prac -i ""E:\Copy of CreateTable1.sql""", AppWinStyle.MinimizedFocus, True, 5000)
File.WriteAllText("E:\Test.bat", "SQLCMD -S Dev1 -d Prac -i ""E:\CreateTable1.sql""")
Process.Start("E:\Test.bat")
Catch ex As Exception
My.Computer.FileSystem.WriteAllText("E:\ErrorLog.txt", Environment.NewLine + "Exception: " + ex.Message, True)
Finally
End Try
End Sub
End Class
2)ASP .NET项目 - 所有MyApplication
Partial Public Class _Default
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Label1.Text = "Current Time: " + Now.ToString
End Sub
End Class
3)WebSetup项目 - MyApplicationSetup
- 我有将上述项目的项目输出添加到它
- 我添加了一个新的“Tnstall”CustomAction引用它到MyCustomAction类库项目的输出
- 当我构建msi安装程序并安装Web安装应用程序时,它会安装(复制输出文件),并创建SetupTest.txt ,Test.bat文件,但它既不成功执行Shell命令行语句也不执行Process.Start()。
- 一旦bat文件被创建,如果我手动双击它执行sql脚本文件。
作为一个方面说明,如果我在一个单独的Windows应用程序中运行CustomAction代码,它会非常好地执行。所以,看起来像安装时,它不能执行命令行命令(虽然我确实在任务管理器中看到了cmd.exe/SQLCMD.exe)。我不确定这是否是一个权限问题,但我在管理员组中并拥有必要的权限。
将这些注释写入“我的答案”部分可能不合适,但想详细说明情况。我真的坚持这一点,如果任何人都可以抛出提高/替代方法的指针,将是非常有益的。在此先感谢,并非常感谢帮助。
我想我得到了解决方案,它似乎工作。安装程序能够安装输出文件,并执行Shell()命令来创建表。 原来是NT Authority \ System登录的Sql Server权限问题。我必须将此登录名映射到数据库,授予创建表权限以及datareader和datawriter。希望这可以帮助某人。谢谢! – Vishal 2010-01-07 20:56:34