我在visual studio 2010中使用了一个用于c#outlook插件(Office 2010/2013)的安装项目和另一个独立工具。在安装过程中,我终止了所有outlook实例,之后我想重新启动outlook实例。
在我的addin项目中,我添加了一个installerclass并添加了一个InstallEventHandler(AfterInstallEventHandler),我执行
Process.Start("Outlook");
虽然相同的命令只是在其他已编译的类中打开Outlook,但在安装程序Outlook的上下文中将在概要文件创建助手中打开。
我还尝试在提交后将所述工作编译的exe作为用户定义的操作运行,但同样的问题也出现了。
任何解决方案或解释都将不胜感激。
答案 0 :(得分:5)
<强> SOLUTION:强>
安装在SYSTEM帐户中运行。因此,创建的进程也在所述帐户中运行,而不是当前登录的用户。
我创建了一个附加项目(InstallHelper),其中包含
Process.Start("Outlook");
我在安装项目的Commit中将InstallHelper添加为CustomAction,并在CustomAction的属性中将InstallerClass更改为False。然后我将WiRunSql.vbs复制到项目文件夹,并将PostBuildEvent添加到安装项目中:
@echo off
cscript //nologo "$(ProjectDir)WiRunSql.vbs" "$(BuiltOutputPath)" "UPDATE CustomAction SET Type=1554 WHERE Type=3602"
3602:
请参阅: msdn: Custom Action In-Script Execution Options
Type-change删除了msidbCustomActionTypeNoImpersonate(0x00000800)的位,因此InstallHelper和创建的进程作为登录用户运行,而不是作为SYSTEM运行。
或者通过在orca中打开msi可以实现这些更改(必须在每次构建后重复,因此我更喜欢脚本化更改)。
答案 1 :(得分:2)
除了之前的回答(我花了很多时间来理解这一点):
我的WiRunSql.vbs文本: (对你而言,它还将包含argument2-update脚本参数)
(对我来说PostBuildevent是
@echo off
cscript //nologo "$(ProjectDir)WiRunSql.vbs" "$(BuiltOuputPath)"
)
Dim filename, installer, database
filename = WScript.Arguments(0)
Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase(filename, 1)
sql = "UPDATE `CustomAction` SET `Type`= 1554 WHERE `Type`= 3602"
Set view = database.OpenView(sql)
view.Execute
view.Close
database.Commit
您可以在命令promt中测试脚本:
cscript "C:\Projects\YourProject\WiRunSql.vbs" "C:\Projects\YourProject\Debug\Setup.msi"
这需要在脚本中查看错误
要查看新的Type值,您可以使用orca https://support.microsoft.com/en-us/kb/255905
另外看: http://www.codeproject.com/Articles/383481/Editing-an-MSI-Database http://integr8consulting.blogspot.ru/2012/04/microsoft-installer-custom-actions-user.html https://github.com/facebookarchive/ie-toolbar/blob/master/Common/Install/msi/FBIE-MSI/scripts/msipostbuild.vbs