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, но гугълът не връща нищо интересно.

Как да поправя този проблем?


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.

Ето малко четиво, което да ви помогне да разберете тези опасения:

Сега също бих споменал, че вие ​​вероятно преоткривате колелото, но изглежда, че вграденият 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