2014-11-27 2 views
1

У меня есть установщик с InstallPrivileges="elevated". Я включаю в таблице файлов в App.exeПовышенный установщик с повышенным пользовательским действием не поднимает исполняемый файл

<Component Id="myapp" Guid="*"> 
    <File Id="myapp" Source="myapp.exe"/> 
    </Component> 

используя эти CA, чтобы запустить его в elevcated состоянии:

<CustomAction Id="SetProp" Property="Launch" Value ="&quot;[INSTALLDIR]myapp.exe&quot;"/> 
<CustomAction Id="Launch" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="ignore" Impersonate="no"/> 

запланирован так:

<Custom Action="SetProp" Before="Launch">NOT Installed</Custom> 
    <Custom Action="Launch" Before="InstallFinalize">NOT Installed</Custom> 

но согласно Uachelper class (C#) и отсутствующий результат, этот процесс не повышен, но подробный журнал и журнал myapp.exe не показывают ошибок.

Я также попытался использовать пользовательское действие типа 2 (binarykey и т. Д.), Пользовательское действие типа 18 (файл и т. Д.) И включить app.manifest в myapp.exe с обязательным администратором.

Ничего не работало, чтобы поднять myapp.exe .. во время установки.

Обходной путь, который я нашел, заключается в том, чтобы запустить myapp.exe вручную после завершения установки (перейдите к [INSTALLDIR] и doubleclick myapp.exe, предложите uac и т. Д.), Но я хочу этого избежать. Я также думал о попытке использовать runas, но не уверен, что это сработает или это возможно.

Все это основано на http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.html, https://stackoverflow.com/a/10028939/4096653 и еще много вопросов здесь, на SO.

Что мне не хватает или что еще я могу попробовать?

ответ

2

По умолчанию настраиваемое действие будет повышено, только если оно отложено, не выдается за персонаж и не секвенируется между InstallInitialize и InstallFinalize, и если оно установлено на машину, а затем оно будет работать с учетной записью системы. Будет ли это действительно работать или нет, зависит от того, готов ли код к пониманию того, что он не работает как интерактивный пользователь с доступом к HKCU, элементы пользовательского профиля, такие как PersonalFolder, и код знает, где находятся его данные. Когда пользовательский исполняемый файл запускается, он запускается через вызов типа CreateProcess() (НЕ запускает вызов оболочки), и поэтому не происходит проверки проверки/отображения UAC. Поэтому ваш WiX-код выглядит корректно, если вы отложили и до InstallFinalize. Я понятия не имею, что думает класс UACHelper, если он работает как система и повышен. ProcessMonitor/Explorer может рассказать вам, что такое ваши права/токены.

Он должен работать, если вы создадите персонализированное действие персонализированного запуска, которое выполняет явное выполнение оболочки Exe вашего exe, потому что это ведет себя как запуск из Explorer интерактивным пользователем. Он запустит приложение, которое будет запрашивать повышение до тех пор, пока пользователь, выполняющий установку, будет администратором. В коде это что-то вроде ProcessStartInfo.UseShellExecute = true, ShellExecute() Win32.

Если вам требуется выданный СА, который должен быть повышен, MSI должен быть запущен как администратор или запущен из программы с манифестом возвышения, который затем запускает MSI.

Вы увидите много советов (я надеюсь), что вы должны организовать автоматическое его автоматическое при первом запуске приложения, просто запустите его и запомните, был ли он запущен. Выполнение как повышенного пользователя из MSI слишком сложно, если у вас нет загрузочного старшего загрузчика.

+0

Чтобы уточнить: у меня есть все требования для повышенного центра сертификации, и мой MSI также запускается как администратор. Но даже при этом тип 2, тип 18 CA и quiet exec не работают, чтобы поднять myapp.exe. Чтобы он был повышен как текущий пользователь (а не системная учетная запись), я должен создать еще один CA с высоким разрешением, который будет вызывать приложение Launcher. Это приложение для запуска будет вызывать myapp.exe, используя shellexecute, запрашивая текущего пользователя с окнами UAC. Правильно ли я это понял? – sceiler

+0

Это звучит правильно - это должно быть довольно легко сделать проверку работоспособности, и вам нужно будет решить, должна ли продолжаться вся установка, когда ваша пусковая установка завершена, или если запускающий ЦС должен ждать. – PhilDW

0

Я предполагаю, что вы хотите, чтобы это запустить в Execute последовательности и запланировали свои собственные действия в InstallExecuteSequence

Это может быть так, что ваше приложение не может работать как локальный пользователь системы, поэтому постарайтесь переключить IMPERSONATE на да Impersonate="Yes"

Смежные вопросы