我有一个用 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>
and<MergeRef>
标记,没有其他任何更改。
我究竟做错了什么?