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コンテキストから実行)から自分自身を再起動します。これは私の管理下にはなく、システムサービスのコンテキストからのアップグレードのためにMSIが呼び出される可能性があるため、Impersonate ='yes'は機能しません。つまり、Impersonate='yes'はアプリをローカルシステムとして実行することになります。
最近、VC9 CRTをMSMとしてこのMSIに含めることから、ブートストラッパーexeに含めることに移行しました。
これを行うと、myapptray.exe
カスタムアクションが正常に実行されなくなります。なりすましは失敗し、 .WTSQueryUserToken
を返しますERROR_PRIVILEGE_NOT_HELD
。これは、MSMを削除すると、MSIが実行されるユーザーコンテキストが実際に変更されたことを意味しているように見えますが、それはばかげているようです。wxsファイルから削除した行はMSMの<Merge>
and<MergeRef>
タグだけで、他に何も変更されていません。
私は何が間違っているのですか?