2010-08-31 7 views
2

Я хочу выполнить пользовательское действие в установщике Windows (с помощью скрипта WiX), которое создает символические ссылки в конце установки. mklink требует прав администратора, поскольку установщик ограничивает. Это то, что я написал:WiX: сделать символическую ссылку с включенным UAC

<CustomAction Id="mklink_cmdline" Property="QtExecCmdLine" Value='"[SystemFolder]cmd.exe" /c mklink "[SystemFolder]my_app.dll" "[INSTALLDIR]my_app.dll"' /> 
<CustomAction Id="mklink_exec" BinaryKey="WixCA" DllEntry="CAQuietExec" Return="ignore" /> 

... 

<InstallExecuteSequence> 
    <Custom Action="mklink_cmdline" Before="InstallFinalize"> 
     ... 
    </Custom> 
    <Custom Action="mklink_exec" After="mklink_cmdline"> 
     ... 
    </Custom> 
    ... 
</InstallExecuteSequence> 

Это прекрасно работает, если UAC полностью отключен. Однако при включении UAC на любом уровне это пользовательское действие прекращается с

CAQuietExec: You do not have sufficient privilege to perform this operation. 

, даже если я позвонил в окне согласия. Я попытался сменить Execute на отложенный, выдавать себя за безлимитный или изменить настройки InstallPrivileges пакета для повышения, ни одна из них не работает.

Любые предложения, которые я могу обойти? Спасибо!

Редактировать: пересмотренный код с отложенными пользовательскими действиями

<CustomAction Id="mklink_cmdline" Property="mklink_exec" Value='"[SystemFolder]cmd.exe" /c mklink "[SystemFolder]my_app.dll" "[INSTALLDIR]my_app.dll"' /> 
<CustomAction Id="mklink_exec" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Impersonate="no" Return="ignore" /> 

... 

<InstallExecuteSequence> 
    <Custom Action="mklink_exec" Before="InstallFinalize"> 
     ... 
    </Custom> 
    <Custom Action="mklink_cmdline" Before="mklink_exec"> 
     ... 
    </Custom> 
    ... 
</InstallExecuteSequence> 

ответ

1

ли работа, когда бежал из командной строки администратора? Я предполагаю, что так оно и есть.

Из того, что я нашел, msi не может повысить уровень UAC, который вам нужен. Мне пришлось создать файл setup.exe, который завернул msi в качестве встроенного ресурса и выполнил его. Setup.exe включает app.manifest запроса администратора уровень выполнения, который повышает уровень контроля учетных записей соответственно:

<?xml version="1.0" encoding="utf-8"?> 
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <assemblyIdentity version="1.0.0.0" name="Setup.app"/> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
     <security> 
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
       <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 
      </requestedPrivileges> 
     </security> 
    </trustInfo> 
</asmv1:assembly> 

я могу просто не понимаю, WIX, пользовательские действия и контроль учетных записей достаточно, но это то, что я в конечном итоге делает.

0

Вы планировать его между InstallInitialize и InstallFinalize, когда вы отмечаете его для будущих периодов? Ваш До и после того, как выглядит немного странно:

InstallFinalize

_cmdline перед тем InstallFinalize

_mkline_exec после _cmdline

Звучит немного недетерминирован. Вы можете найти _cmdline, возникающую после InstallFinalize и отложенных не будет работать там.

Try:

InstallFinalize

_exec перед тем InstallFinalize

_cmldline перед тем _exec

+0

Я попробовал ваше предложение, и получить ту же ошибку. Ниже приводится то, что я изменил: 1) свойства действий cmdline становятся Идентификатором действий exec; 2) Добавить Execute = "offferred" и Impersonate = "no" ко всем действиям exec; 3) исправить последовательность выполнения. Я подтвердил последовательность с Оркой. Все это до InstallFinalize. –

0

Если это действительно mklink, требующий повышения, попробуйте вместо этого использовать SysInternals junction.exe.

0

Я закончил загрузку файла elevate.exe из wintellect, развернул его в какую-то временную папку и предоставил ему путь к сценарию командной строки, который создал все символические ссылки. Чем оно было вызвано с помощью пользовательского действия. Файл командной строки, в свою очередь, обладает некоторой добротой внутри, чтобы обнаружить соответствующую папку программных файлов. или получить его из командной строки, если это необходимо. Похоже, что хотя WiX правильно поднимает пользовательское действие, msi (или установщик Windows) сам по себе не предоставляет ему достаточных прав на правильное выполнение команды mklink.

Также обратите внимание, что Impersonate = "yes" в CA. Я считаю, что это позволит msi показать диалоговое окно Elevation при выполнении этого действия.

командной строки файла:

cd /D %~p0 

IF EXIST "%PROGRAMFILES(x86)%" SET PROGFILES=%PROGRAMFILES(x86)% 
IF "%PROGFILES%".=="". SET PROGFILES=%PROGRAMFILES% 

SET INSTALLPATH=%PROGFILES%\MyGreatProduct 
SET DATAPATH=%PROGRAMDATA%\MyGreatProduct 

IF NOT "%~1."=="." SET INSTALLPATH=%~1 
IF NOT "%~2."=="." SET DATAPATH=%~2 

IF EXIST "%INSTALLPATH%" mklink "%INSTALLPATH%\veryimportant.ini" "%DATAPATH%\veryimportant.ini" 

в файле WXS:

<Component Directory="TempFolder" Id='Comp_Temp_Makesymlinks' Guid='47a58219-1291-4321-4321-176987154921'> 
    <File Id='makesymlinks_cmd' Source='makesymlinks.cmd'> 
       <Permission User='Everyone' GenericAll='yes' /> 
    </File> 
    <File Id='elevate_exe' Source='elevate.exe'> 
       <Permission User='Everyone' GenericAll='yes' /> 
    </File> 
</Component> 

<SetProperty Id="CA_MakeSymLinksCmd" Before="CA_MakeSymLinksCmd" Sequence="execute" 
    Value="&quot;[TempFolder]\elevate.exe&quot; &quot;[TempFolder]\makesymlinks.cmd&quot;" /> 
<CustomAction Id="CA_MakeSymLinksCmd" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="ignore" Impersonate="yes" /> 

<InstallExecuteSequence> 
    <Custom Action="CA_MakeSymLinksCmd" Before="InstallFinalize"><![CDATA[NOT Installed AND VersionNT >= 600 ]]></Custom> 
</InstallExecuteSequence> 
+0

Ваша проблема - выдающийся атрибут. http://wix.sourceforge.net/manual-wix2/wix_xsd_customaction.htm – jbreiding

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