【发布时间】:2012-06-28 21:15:15
【问题描述】:
我有一个使用 WiX 构建的 MSI。它执行以下自定义操作:
<CustomAction Id='StartTray'
Directory='INSTALLDIR'
ExeCommand='[INSTALLDIR]\myapptray.exe'
Return='asyncNoWait'
Impersonate='no'
Execute='deferred' />
是这样安排的:
<Custom Action='StartTray' After='StartServices'>NOT Installed OR (TRAYWASRUNNING AND NOT REMOVE~="ALL")</Custom>
myapptray.exe 碰巧使用模拟从本地系统的启动上下文(从 MSI 上下文运行)重新启动自己,因为用户当前在桌面上处于活动状态。这不在我的控制范围内,并且 Impersonate='yes' 不起作用,因为可能会调用 MSI 以从系统服务的上下文进行升级,这意味着 Impersonate='yes' 最终仍将应用程序作为本地系统运行。
我最近从将 VC9 CRT 作为 MSM 包含在此 MSI 中,转为将其包含在引导程序 exe 中。
这样做会阻止myapptray.exe 自定义操作成功运行。 WTSQueryUserToken 中的模拟失败,返回 ERROR_PRIVILEGE_NOT_HELD。这似乎意味着删除 MSM 实际上改变了运行 MSI 的用户上下文,但这似乎很荒谬。我从 wxs 文件中删除的唯一行是 MSM 的 <Merge> 和 <MergeRef> 标签,其他没有任何变化。
我做错了什么?
【问题讨论】:
标签: wix windows-installer merge-module