Выполнение пользовательского действия, требующего повышения прав после установки - PullRequest
6 голосов
/ 24 февраля 2010

У меня есть следующий фрагмент WiX:

<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1" />
<CustomAction Id="StartAppOnExit" 
              FileKey="Configurator.exe" 
              ExeCommand="" 
              Execute="immediate" 
              Impersonate="yes" 
              Return="asyncNoWait" />
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" 
          Value="Configure initial settings" />
<UI>
  <Publish Dialog="ExitDialog" 
           Control="Finish" 
           Order="1" 
           Event="DoAction" 
           Value="StartAppOnExit"
  >WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
</UI>

В основном в диалоговом окне выхода я отображаю окно с надписью: Запустить приложение. Примечание: это приложение требует повышения. Это все работает отлично, за исключением загвоздки. Если UAC включен, кажется, что MSI перебирает токен пользователя и удаляет его группы, поэтому, когда он пытается запустить приложение, требующее повышения прав, это больше не вариант.

Как мне связать это вместе для работы?

Я пытался бросить Impersonate = "no", но в этот момент уже слишком поздно, чтобы это сработало.

Ответы [ 2 ]

12 голосов
/ 24 февраля 2010

Последовательность пользовательского интерфейса работает как пользователь с ограниченными правами и запускает приложения с вызовом CreateProcess. Если вместо этого вы используете что-то вроде WixShellExec с [WixShellExecTarget], оно будет действовать как проводник и отображать приглашение UAC, если для цели требуется повышение прав. Или вы можете изменить файл Configurator.exe, чтобы он запускался без повышенных привилегий, обнаруживать этот случай и перезапускать себя с повышенными привилегиями.

Например, это должно работать:

<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1" />
<CustomAction Id="StartAppOnExit" BinaryKey="WixCA" DllEntry="WixShellExec" Execute="immediate" Return="check" Impersonate="yes"/>
<Property Id="WixShellExecTarget" Value="[#Configurator.exe]"/>
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Configure initial settings" />
<UI>
  <Publish Dialog="ExitDialog" Control="Finish" Order="1" Event="DoAction" Value="StartAppOnExit">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
</UI>
0 голосов
/ 24 февраля 2010

FYI, немедленные пользовательские действия ВСЕГДА олицетворяются (то есть они всегда выполняются как пользователь, выполняющий MSI).

Мне нравится идея Майкла Урмана о том, как заставить ваш Configurator.exe справляться с проблемой повышения прав.

Интересно, не могли бы вы также просто включить манифест в свой EXE-файл, чтобы ОС знала, что повышение всегда требуется.

...