我正在 Visual Studio 2010 中使用 C# Outlook 加载项 (Office 2010/2013) 和其他独立工具的安装项目。在安装过程中,我杀死了 Outlook 的所有实例,然后我想重新启动 Outlook 的一个实例。
在我的插件项目中,我添加了一个安装程序类并添加了一个 InstallEventHandler(AfterInstallEventHandler) 在其中执行
Process.Start("Outlook");
虽然相同的命令只是在其他编译类中打开 Outlook,但在安装程序的上下文中,Outlook 在配置文件创建助手中打开。
我还尝试在提交后将工作编译的 exe 作为用户定义的操作运行,但出现了同样的问题。
任何解决方案或解释将不胜感激。
解决方案:
安装在 SYSTEM 帐户中运行。因此,创建的进程也在所述帐户中运行,而不是作为当前登录的用户运行。
我创建了一个附加项目(InstallHelper),其中包括
Process.Start("Outlook");
我在安装项目中将 InstallHelper 添加为 Commit 上的 CustomAction,并在 CustomAction 的属性中将 InstallerClass 更改为 False。然后我将 WiRunSql.vbs 复制到项目文件夹中,并将 PostBuildEvent 添加到安装项目中:
@echo off
cscript //nologo "$(ProjectDir)WiRunSql.vbs" "$(BuiltOutputPath)" "UPDATE CustomAction SET Type=1554 WHERE Type=3602"
3602:
1554:
类型更改删除了 msidbCustomActionTypeNoImpersonate (0x00000800) 位,因此 InstallHelper 和创建的进程以登录用户身份运行,而不是以 SYSTEM 身份运行。
或者,可以通过在 orca 中打开 msi 来进行这些更改(每次构建后都必须重复,所以我更喜欢脚本化更改)。
除了之前的答案(我花了很多时间来理解这一点):
我的 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
您可以在命令提示符中测试您的脚本:
cscript "C:\Projects\YourProject\WiRunSql.vbs" "C:\Projects\YourProject\Debug\Setup.msi"
这需要在脚本中查找错误
要查看新的类型值,您可以使用 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