WiX CustomAction ExeCommand не работает?

У меня есть командная строка, которую я хочу запустить во время установки модуля слияния (созданногоWiX) с кодом ниже.

<code><CustomAction
    Id='SetWebsiteProtocols'
    Execute='commit'
    Return='ignore'
    Impersonate="yes"
    FileKey='Web.config'
    ExeCommand='c:\windows\system32\inetsrv\appcmd.exe set app "Default Web Site/My Website" /enabledProtocols:http,net.tcp,net.pipe' />

<InstallExecuteSequence>
    <Custom Action="SetWebsiteProtocols" After="InstallFiles"/>
</InstallExecuteSequence>
</code>

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

Как мне решить эту проблему?

 Peter Mortensen17 июн. 2013 г., 15:46
Регистрируясь сProcess Monitor можно получить дополнительную информацию, например: & quot; 15: 06: 30,2599355 appcmd.exe 924 Выход из процесса SUCCESS Exit Status: -1073740756 & quot ;. -1073740756 (знаковый / десятичный), соответствующий 0xC000042C (без знака / шестнадцатеричный), являетсяSTATUS_ELEVATION_REQUIRED, Это может указывать на проблему с повышенными привилегиями.

Ответы на вопрос(1)

Решение Вопроса

Я вижу много проблем с вашим кодом.

You are scheduled for commit which will not be processed if rollback is disabled by policy.

You are impersonating the UAC which may fail in UAC/Elevated situations if your consuming MSI isn't bootstrapped by a setup.exe that is elevating the UI/Execute process.

You have hardcoded a path to the system32 folder which either might not exist because WINDOWS doesn't have to be called WINDOWS or might be the 32-bit or 64-bit system folder depending on OS platform.

You are ignoring the return code so if this fails your install will keep going. Plug and pray anyone?

You will have a big ugly flashing black console window during the install that just screams 'oh this guy didn't know what he was doing.'

You will get absolutely no logging out of the EXE.

You probably aren't aware of the problems that can occur directly calling an EXE custom action.

Вот некоторые материалы, которые помогут вам понять эти проблемы:

Installation Phases and In-Script Execution Options for Custom Actions in Windows Installer

Integration Hurdles for EXE Custom Actions

Теперь я бы также упомянул, что вы, возможно, изобретаете велосипед, но, похоже, встроенный WiXIIS Пользовательские действия не предоставляют нужную вам точку изменения. Это позор. Поэтому я бы посоветовал взглянуть на следующую функцию, чтобы исправить ваш вызов EXE:

Quiet Execution Custom Action

Я считаю, что это очень элегантный способ вызова вашего EXE без перепрошивкиDOS окно, правильный вход в ваш журнал MSI и исправление многих проблем Microsoft с EXE. Оттуда вам просто нужно исправить это, чтобы вы правильно разрешили правильный 32-битный или 64-битный appcmd. Мои установщики ориентированы только на Server 2008 R2, который является 64-разрядной платформой, поэтому мой код выглядит следующим образом:

(Этот код что-то усиливаетInstallShield не раскрывает ...)

<CustomAction Id="SetIISAuthCAD"
              Property="SetIISAuth"
              Value="&quot;[System64Folder]inetsrv\appcmd.exe&quot; set config &quot;Default Web Site/MyApplication&quot; /section:system.webServer/security/authentication/windowsAuthentication /useAppPoolCredentials:true /commit:MACHINE/WEBROOT/APPHOST " />
<CustomAction Id="SetIISAuth"
              BinaryKey="WixCA"
              DllEntry="CAQuietExec64"
              Execute="deferred"
              Return="ignore"
              Impersonate="no" />
<InstallExecuteSequence>
    <Custom Action="SetIISAuth"
            Before="InstallFinalize">Not Installed</Custom>
    <Custom Action="SetIISAuthCAD"
            Before="SetIISAuth">Not Installed</Custom>
</InstallExecuteSequence>
 Jon05 апр. 2012 г., 15:00
Спасибо за вашу помощь - я согласен, что пример кода не был хорош и просто заставить его работать. Спасибо за вашу помощь и комментарий, взятый на борт! :)
 08 апр. 2014 г., 21:57
Когда вы выполните такое настраиваемое действие Wix, вы получите следующую ошибку от компоновщика: ICE77: SetIISAuth - это настраиваемое действие в сценарии. Он должен быть расположен между действием InstallInitialize и действием InstallFinalize в таблице InstallExecuteSequence.
 18 мая 2016 г., 15:42
Идеальное решение для данной проблемы, а также хорошее объяснение проблем с примерами кода.
 08 апр. 2014 г., 22:11
В моем примере настраиваемые действия запланированы между InstallInitialize и InstallFinalize.

Ваш ответ на вопрос