2016-07-07 5 views
0

Я искал и искал множество «решений», в том числе несколько здесь, на SO, но ни один из них не работает.Невозможно проверить состояние WiX ТОЛЬКО на 'Install'

У нас есть служба Windows Topshelf, написанная на C#, для которой мне было поручено создать установщик в формате WiX .msi, который будет установлен через командную строку с учетной записью службы и паролем, переданным в качестве аргументов.

До сих пор я добавил следующие свойства:

<Property Id="SERVICEACCOUNT" Admin="yes" /> 
<Property Id="PASSWORD" Admin="yes" /> 

Затем они назначаются во время установки службы:

<ServiceInstall Id="ServiceInstaller" 
    Type="ownProcess" 
    Name="MyServiceName" 
    DisplayName="My Service Display Name" 
    Description="My Service Description" 
    Account="[SERVICEACCOUNT]" 
    Password="[PASSWORD]" 
    Start="auto" 
    ErrorControl="normal" /> 
<ServiceControl Id="ServiceController" 
    Name="MyServiceName" 
    Remove="both" 
    Stop="both" 
    Wait="yes" /> 

С Product.wxs в этом состоянии я могу успешно установить , обновить и удалить службу из командной строки:

msiexec.exe /i "C:\MyApplication.Installer.msi" SERVICEACCOUNT="domain\serviceaccount" PASSWORD="password" 

N Ot снабжая ServiceAccount или ПАРОЛЬ поля по умолчанию для установки службы по LocalAccount, которые мне нужно избегать, так что я написал условие, чтобы проверить, что параметры всегда поставляются по установке:

<Condition Message="SERVICEACCOUNT and PASSWORD must be supplied">(SERVICEACCOUNT AND PASSWORD) AND NOT Installed</Condition> 

Это работает - она ​​отображает окно сообщения и завершает установку, если параметры не указаны или если .msi запускается непосредственно из двойного щелчка.

Проблема возникает при обновлении и деинсталляции, несмотря на то, что условие указывает, что только при установке «НЕ установлен» при удалении или в середине обновления появляется окно сообщения (даже если вызывается .msi из командной строки с предоставленными параметрами).

Я пробовал различные перестановки состояния от других постов я обнаружил, что сообщают об успехах, таких как:

(SERVICEACCOUNT AND PASSWORD) AND NOT (WIX_UPGRADE_DETECTED OR UPGRADINGPRODUCTCODE) AND NOT (REMOVE="ALL") 

, и я также поливаю this Cheatsheet, но безрезультатно.

Может ли кто-нибудь увидеть, что я делаю неправильно или какие-либо рабочие примеры того, как получить условие для проверки ТОЛЬКО при выполнении установки? При всей логике условий ни одна из них не работает должным образом (или, по крайней мере, как я их ожидаю!)

Большое спасибо заранее.

ответ

1

Попробуйте

<Condition Message="SERVICEACCOUNT and PASSWORD must be supplied">(SERVICEACCOUNT AND PASSWORD) OR Installed</Condition> 

Это должно остановить свежее количество установок, которые не имеют (ServiceAccount и пароль), но не остановит модернизацию или удаляемые.

NOT Installed представляет текущий MSI не установлен. При обновлении, msi обнаруживает установленный продукт и запускает этот msi с установкой UPGRADINGPRODUCTCODE. Когда msi запускается с UPGRADINGPRODUCTCODE, он деинсталлируется сам, но имеет установленный набор, поэтому ваше состояние будет всегда в этом случае.

То же самое происходит при попытке удалить. Installed устанавливается во время запуска msi, поэтому ваше состояние не удастся.

Как правило, при любых условиях, которые вы хотите выполнить при установке, но не при удалении/удалении во время обновления, вы можете добавить «OR Installed» в свое состояние, чтобы оно всегда было правдой при удалении.

+0

Вы, сэр, легенда - смена «AND NOT Installed» на «OR Installed» работала отлично. Теперь я могу успешно установить и обновить из командной строки, а также удалить из командной строки или «Добавить/удалить программы». Благодаря!! – TheCodingLlama

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