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

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

<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>

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

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


person Jon    schedule 05.04.2012    source источник
comment
Регистрируясь с помощью Process Monitor, можно получить дополнительную информацию, например: 15: 06: 30,2599355 appcmd.exe 924 Выход из процесса УСПЕХ Статус выхода: -1073740756. -1073740756 (знаковый / десятичный), соответствующий 0xC000042C (беззнаковый / шестнадцатеричный), равен STATUS_ELEVATION_REQUIRED. Это может указывать на проблему с повышенными привилегиями.   -  person Peter Mortensen    schedule 17.06.2013


Ответы (1)


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

  1. У вас запланирована фиксация, которая не будет обработана, если откат отключен политикой.

  2. Вы выдаете себя за UAC, который может дать сбой в ситуациях UAC / Elevated, если ваш MSI-файл не загружается. setup.exe, который поднимает процесс UI / Execute.

  3. Вы жестко указали путь к папке system32, которая может не существовать, потому что WINDOWS не обязательно должна называться WINDOWS, или может быть 32-битной или 64-битной системной папкой в ​​зависимости от платформы ОС.

  4. Вы игнорируете код возврата, поэтому, если это не удастся, ваша установка продолжится. Подключи и помолись кому-нибудь?

  5. Во время установки у вас будет большое уродливое мигающее черное окно консоли, которое просто кричит: «О, этот парень не знал, что делал».

  6. Вы не получите абсолютно никакого выхода из EXE.

  7. Вы, вероятно, не знаете о проблемах, которые могут возникнуть при прямом вызове настраиваемого действия EXE.

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

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

Я считаю, что это очень элегантный способ вызова вашего 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>
person Christopher Painter    schedule 05.04.2012
comment
Спасибо за вашу помощь - я согласен, что пример кода был плохим и просто для того, чтобы заставить его работать. Спасибо за вашу помощь и за принятые комментарии! :) - person Jon; 05.04.2012
comment
Когда вы выполняете подобное настраиваемое действие Wix, вы получите следующую ошибку от компоновщика: ICE77: SetIISAuth - это настраиваемое действие в скрипте. Он должен быть упорядочен между действием InstallInitialize и действием InstallFinalize в таблице InstallExecuteSequence. - person Ostati; 08.04.2014
comment
В моем примере настраиваемые действия планируются между InstallInitialize и InstallFinalize. - person Christopher Painter; 09.04.2014
comment
Отличное решение данной проблемы, а также хорошее объяснение проблем с образцом кода. - person Rakesh Guranani; 18.05.2016