WiX: сделать символическую ссылку с включенным UAC

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

<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 на отложенный, Impersonate на no или изменить 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>

person Crend King    schedule 31.08.2010    source источник


Ответы (4)


Работает ли он при запуске из командной строки администратора? Я так полагаю.

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

<?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, пользовательских действиях и UAC, но именно этим я и занялся.

person Mitch    schedule 07.09.2010

Планируете ли вы его между InstallInitialize и InstallFinalize, когда помечаете его как отложенный? Ваш «До» и «после» выглядит немного странно:

Установить

_cmdline перед InstallFinalize

_mkline_exec после _cmdline

Звучит немного недетерминированно. Вы можете обнаружить, что _cmdline появляется после InstallFinalize, и deferred там не работает.

Пытаться:

Установить

_exec перед InstallFinalize

_cmldline перед _exec

person Christopher Painter    schedule 31.08.2010
comment
Я попробовал ваше предложение и получил ту же ошибку. Я изменил следующее: 1) свойства cmdline actions становятся Id действий exec; 2) Добавить Execute = deferred и Impersonate = no ко всем действиям exec; 3) исправить последовательность выполнения. Я подтвердил последовательность с помощью Orca. Все до InstallFinalize. - person Crend King; 01.09.2010

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

person Larry Silverman    schedule 20.09.2011

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

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

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

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>
person demp    schedule 22.02.2012
comment
Ваша проблема - безличный атрибут. wix.sourceforge.net/manual-wix2/wix_xsd_customaction.htm - person jbreiding; 26.07.2012