Вопрос следующего содержания...
Использую Wix 3, очень нужно сделать так, что бы инсталлятор цеплял файл, который просто лежит рядом с msi, что бы в дальнейшем не меняя инсталятор можно было заменять этот файл на более новый. как?
Здравствуйте, Lexa-Lexa, Вы писали:
LL>Доброго времени суток всем.
LL>Вопрос следующего содержания... LL>Использую Wix 3, очень нужно сделать так, что бы инсталлятор цеплял файл, который просто лежит рядом с msi, что бы в дальнейшем не меняя инсталятор можно было заменять этот файл на более новый. как?
Люди добрые , ну помогите... тяжело с Wix разобраться с ходу то.
Суть в общем:
если рядом с msi лежит base.dat (база данных) при установке кинуть его в CommonAppData папочку (сзаменой существующего), если не лежит — установить прогу без него (предпологается что в этом случае base.dat уже есть у пользователя).
Думаю, можно ли организовать это чере CustomAction (на C# dll )и написать соответствующую код, реально ли?
Здравствуйте, Lexa-Lexa, Вы писали:
LL>Здравствуйте, Lexa-Lexa, Вы писали:
LL>>Доброго времени суток всем.
LL>>Вопрос следующего содержания... LL>>Использую Wix 3, очень нужно сделать так, что бы инсталлятор цеплял файл, который просто лежит рядом с msi, что бы в дальнейшем не меняя инсталятор можно было заменять этот файл на более новый. как?
LL>Люди добрые , ну помогите... тяжело с Wix разобраться с ходу то. LL>Суть в общем: LL>если рядом с msi лежит base.dat (база данных) при установке кинуть его в CommonAppData папочку (сзаменой существующего), если не лежит — установить прогу без него (предпологается что в этом случае base.dat уже есть у пользователя). LL>Думаю, можно ли организовать это чере CustomAction (на C# dll )и написать соответствующую код, реально ли?
Добавь атрибут Compressed="no" к элементу File, который описывает данный файл. Тогда он не будет включен в состав msi-пакета, а будет лежать с ним.
Здравствуйте, Lexa-Lexa, Вы писали:
LL>>Доброго времени суток всем.
LL>>Вопрос следующего содержания... LL>>Использую Wix 3, очень нужно сделать так, что бы инсталлятор цеплял файл, который просто лежит рядом с msi, что бы в дальнейшем не меняя инсталятор можно было заменять этот файл на более новый. как?
LL>Люди добрые , ну помогите... тяжело с Wix разобраться с ходу то. LL>Суть в общем: LL>если рядом с msi лежит base.dat (база данных) при установке кинуть его в CommonAppData папочку (сзаменой существующего), если не лежит — установить прогу без него (предпологается что в этом случае base.dat уже есть у пользователя). LL>Думаю, можно ли организовать это чере CustomAction (на C# dll )и написать соответствующую код, реально ли?
Вам конечно поможет такая конструкция
<Component Id="base.dat" Guid="{XXX}">
<CopyFile Id="CopyExternalFile" SourceName="base.dat" SourceProperty="SourceDir" DestinationName="base.dat" DestinationDirectory="CommonAppData"/>
</Component>
Здравствуйте, -af, Вы писали:
-af>Вам конечно поможет такая конструкция -af><Component Id="base.dat" Guid="{XXX}"> -af> <CopyFile Id="CopyExternalFile" SourceName="base.dat" SourceProperty="SourceDir" DestinationName="base.dat" DestinationDirectory="CommonAppData"/> -af></Component>
-af>но прежде чем вставить это подумайте как у Вас будет работать reinstall -af>(наверно при reinstall нужно будет требовать оригинальный msi, -af>тут вам пригодиться ResolveSource Action http://msdn.microsoft.com/en-us/library/aa371232(VS.85).aspx).
спасибо большое. Постараюсь покопать в эту сторону. Но мне нужен достаточно хитрый механизм работы с этим файлом и я уже начал писать custom action на C# который позволит выполнить все действия. Ну и понятное дело возникли вопросы :
1. Как можно в custom action определить место, где лежит дистрибутив?
2. Если например в custom action возникнет ошибка как сделать что бы установщик сказал? "не удается скопировать файл. Повторить/отмена"
3. Как можно в custom action определить суть процесса: install, reinstall, deinstallation
Здравствуйте, Lexa-Lexa, Вы писали:
LL>Здравствуйте, -af, Вы писали:
-af>>Вам конечно поможет такая конструкция -af>><Component Id="base.dat" Guid="{XXX}"> -af>> <CopyFile Id="CopyExternalFile" SourceName="base.dat" SourceProperty="SourceDir" DestinationName="base.dat" DestinationDirectory="CommonAppData"/> -af>></Component>
-af>>но прежде чем вставить это подумайте как у Вас будет работать reinstall -af>>(наверно при reinstall нужно будет требовать оригинальный msi, -af>>тут вам пригодиться ResolveSource Action http://msdn.microsoft.com/en-us/library/aa371232(VS.85).aspx).
LL>спасибо большое. Постараюсь покопать в эту сторону. Но мне нужен достаточно хитрый механизм работы с этим файлом и я уже начал писать custom action на C# который позволит выполнить все действия. Ну и понятное дело возникли вопросы : LL>1. Как можно в custom action определить место, где лежит дистрибутив? LL>2. Если например в custom action возникнет ошибка как сделать что бы установщик сказал? "не удается скопировать файл. Повторить/отмена" LL>3. Как можно в custom action определить суть процесса: install, reinstall, deinstallation
LL>вот такой я любознательный заранее спасибо
Ну зачем Вы пытаетесь усложнить себе жизнь, и по сути изобрести велосипед (не забудте, кстати, что Вам RollBack еще потдерживать, чтобы велосипед ездил . Managed кастом акция, в даном случае это не к селу ни к городу.
Да и если к указаному примеру кода добавить условия, в которых фигрирует BASE_SOURCE и BASE_DESTINATION, то у вас все 3 пункта выполнятся.
Ответы на Ваши вопросы зависят как вы пишите ManagedCA, используя Deployment Tools Foundation или System.Configuration.Install
Спасибо! буду копать!
-af>.... чтобы велосипед ездил
А велосипед я люблю, снег дотает и поеду
-af>ps, пишите хороший сетап, подумайте о людях, для кого Вы пишите.
Да... я уже призадумался, и сильно, после того как мой старый сетап уже 100 раз преподнес сюрпризов пользователям. Но он правда не был на wix , а был написан просто дефолтным студийным способом
В общем у меня ща есть в .wxs:
<Binary Id="CopyBase" SourceFile="..\CustomActions.CA.dll" />
<CustomAction Id="DoCopyBase" BinaryKey="CopyBase" DllEntry="CustomActionCopyBase" />
<InstallExecuteSequence>
...
<Custom Action="DoCopyBase" After="InstallFinalize"></Custom>
...
а в .cs :
namespace CustomActions
{
public class CustomActions
{
[CustomAction]
public static ActionResult CustomActionCopyBase(Session session)
{
у session нет и половины того, о чем пишут
и кроме того как я выяснил экшн вызывается тока при установке, при исправлении или удалении — нет, почему?
Здравствуйте, Lexa-Lexa, Вы писали:
LL>Извините конечно за навязчивость... LL>может дело и в том что я первый день работаю, а до этого болел неделю... но..
-af>>Ответы на Ваши вопросы зависят как вы пишите ManagedCA, используя Deployment Tools Foundation или System.Configuration.Install LL>в vs 2008 проект-новый-wix-C# custom action, как то так. И на чем я пишу? ))))
-af>>1 -> http://msdn.microsoft.com/en-us/library/aa371857(VS.85).aspx -af>>2 -> http://msdn.microsoft.com/en-us/library/aa371672(VS.85).aspx -af>>3 -> http://msdn.microsoft.com/en-us/library/aa371645(VS.85).aspx -af>>http://msdn.microsoft.com/en-us/library/aa371648(VS.85).aspx LL>Посмотрел, здорово, токо в упор не пойму как заюзать ComponentCurrentState, нет у объекта session такого ))))
LL>В общем у меня ща есть в .wxs: LL><Binary Id="CopyBase" SourceFile="..\CustomActions.CA.dll" /> LL><CustomAction Id="DoCopyBase" BinaryKey="CopyBase" DllEntry="CustomActionCopyBase" /> LL><InstallExecuteSequence> LL> ... LL> <Custom Action="DoCopyBase" After="InstallFinalize"></Custom> LL>...
LL>а в .cs : LL>namespace CustomActions LL>{ LL> public class CustomActions LL> { LL> [CustomAction] LL> public static ActionResult CustomActionCopyBase(Session session) LL> { LL>у session нет и половины того, о чем пишут
LL>и кроме того как я выяснил экшн вызывается тока при установке, при исправлении или удалении — нет, почему?
LL>в vs 2008 проект-новый-wix-C# custom action, как то так. И на чем я пишу? ))))
Вы используете Deployment Tools Foundation , он с wix поставляется.
Очень плохо делать что-то (изменяющее систему) после InstallFinalize, после него можно только редми показывать.
Правильно использовать Deffered или Commit кастом акцию http://msdn.microsoft.com/en-us/library/aa368268.aspx.
LL>Посмотрел, здорово, токо в упор не пойму как заюзать ComponentCurrentState, нет у объекта session такого ))))
в DTF есть такой класс ComponentInfo, он вам поможет.
Еще раз повторюсь, очень плохая архитектура у Вас.
ps.
Но для счастья своего не бери себе его:
Много, много непокоя принесет оно с собою
Спасибо... копаю...
-af>Еще раз повторюсь, очень плохая архитектура у Вас. -af>ps. -af> Но для счастья своего не бери себе его: -af> Много, много непокоя принесет оно с собою
может предложите правильную?
Постараюсь ясно описать суть всего.
Приложение работает с бд (base.dat).
Устанавливается с CD диска.
А обновлятся должно уметь:
1. через интернет (обновляется как ПО так и информация в БД) — это все отличненько работает
2. через MSI (тут начинаются запары)
2.1 у некоторых клиентов программу ставит сисадмин, соотв у пользователей нет прав на обновление ПО, они спокойненько обновляют только БД. Когда появляется обновление ПО сисадмин скачивает новый msi (без base.dat — он большой) и запускает процесс обновления через GPO.
Тут ес-но у пользователя должна остаться его base.dat нетронутая, а рядом с msi скорее всего файла base.dat и лежать не должно.
2.2 некоторым пользователям обновления программы приходят на новом CD (соотв. обновленный msi и новая base.dat) — здесь инсталятор должен заменить ПО + base.dat[/b] тоже!
3. при repear инсталяции соответственно base.dat вообще не должен трогаться...
Вроде так. Ну и простой вывод отсюда напрашивается: есть base.dat рядом с msi — скопируй и замени, нет — не трогай
Здравствуйте, Lexa-Lexa, Вы писали:
LL>может предложите правильную?
Ну Вы даете!!! Ведь все написал, и примеры привел. Что же еще нужно? Готовую реализацию?
Хорошо, не поленюсь скопировать из предыдущего + добавлю, пожалуй, удаление при uninstall.
Здравствуйте, -af, Вы писали:
-af>Здравствуйте, Lexa-Lexa, Вы писали:
LL>>может предложите правильную?
-af>Ну Вы даете!!! Ведь все написал, и примеры привел. Что же еще нужно? Готовую реализацию? -af>Хорошо, не поленюсь скопировать из предыдущего + добавлю, пожалуй, удаление при uninstall.
.....
Спасибо это все работает. Но кроме одного случая
Представим, что есть инсталятор с версией 1.0.0 и 1.1.0. Причем инсталятор 1.1.0 даем пользователю без базы данных.
В нем строки: <RemoveExistingProducts After="InstallInitialize" /> — т.е. удаляется версия 0.. а она за собой и базу подтирает, а новый уже не ставит...
Если написать <RemoveExistingProducts After="InstallFinalize" /> — база не удаляется уже, но так она не будет инсталятором 2 заменяться, если будет присутствовать...
Как вывод, конечно, можно не удалять файл базы инсталятором, но тут проблема снова. Если файл присутствует, то он не перезаписывается новым, а мне надо!
Здравствуйте, Lexa-Lexa, Вы писали:
LL>Спасибо это все работает. Но кроме одного случая LL>Представим, что есть инсталятор с версией 1.0.0 и 1.1.0. Причем инсталятор 1.1.0 даем пользователю без базы данных. LL>В нем строки: <RemoveExistingProducts After="InstallInitialize" /> — т.е. удаляется версия 0.. а она за собой и базу подтирает, а новый уже не ставит... LL>Если написать <RemoveExistingProducts After="InstallFinalize" /> — база не удаляется уже, но так она не будет инсталятором 2 заменяться, если будет присутствовать...
LL>Как вывод, конечно, можно не удалять файл базы инсталятором, но тут проблема снова. Если файл присутствует, то он не перезаписывается новым, а мне надо!
При <RemoveExistingProducts After="InstallInitialize" /> Вы можете не удалять при Upgrade (используйте UPGRADINGPRODUCTCODE)
При <RemoveExistingProducts After="InstallFinalize" /> Вы можете предварительно удалить (используйте BASE_DESTINATION AND BASE_SOURCE см. ответ 4, и тот же RemoveExternalFile)
Здравствуйте, -af, Вы писали:
-af>При <RemoveExistingProducts After="InstallInitialize" /> Вы можете не удалять при Upgrade (используйте UPGRADINGPRODUCTCODE) -af>При <RemoveExistingProducts After="InstallFinalize" /> Вы можете предварительно удалить (используйте BASE_DESTINATION AND BASE_SOURCE см. ответ 4, и тот же RemoveExternalFile)
Попробовал сделать так:
<Component Id="BaseOldRemove" Guid="{6BF1952F-A607-4eb6-9605-AFE720E56343}">
<Condition>(UPGRADINGPRODUCTCODE AND BASE_SOURCE) OR NOT UPGRADINGPRODUCTCODE</Condition>
<RemoveFile Id="RemoveExternalFile" Name="base.txt" On="uninstall"></RemoveFile>
</Component>
т.е. я понимаю так: удалить если обновляем и есть новый файл-база или удалить если не обновляем (т.е. видимо удаляем))))
это с <RemoveExistingProducts After="InstallInitialize" />
не работает удаляется файл в случае обновления и отсутствия нового файла — я уже на него похож
Здравствуйте, Lexa-Lexa, Вы писали:
LL>Здравствуйте, -af, Вы писали:
-af>>При <RemoveExistingProducts After="InstallInitialize" /> Вы можете не удалять при Upgrade (используйте UPGRADINGPRODUCTCODE) -af>>При <RemoveExistingProducts After="InstallFinalize" /> Вы можете предварительно удалить (используйте BASE_DESTINATION AND BASE_SOURCE см. ответ 4, и тот же RemoveExternalFile)
LL>Попробовал сделать так: LL><Component Id="BaseOldRemove" Guid="{6BF1952F-A607-4eb6-9605-AFE720E56343}"> LL> <Condition>(UPGRADINGPRODUCTCODE AND BASE_SOURCE) OR NOT UPGRADINGPRODUCTCODE</Condition> LL> <RemoveFile Id="RemoveExternalFile" Name="base.txt" On="uninstall"></RemoveFile> LL></Component>
LL>т.е. я понимаю так: удалить если обновляем и есть новый файл-база или удалить если не обновляем (т.е. видимо удаляем)))) LL>это с <RemoveExistingProducts After="InstallInitialize" />
LL>не работает удаляется файл в случае обновления и отсутствия нового файла — я уже на него похож
Вы написали следующее:
компонента BaseOldRemove устанавливается если выполнено условие (UPGRADINGPRODUCTCODE AND BASE_SOURCE) OR NOT UPGRADINGPRODUCTCODE,
файл удаляется всегда при удалении этой компоненты (если компонента не была установлена, файл не удалять).
предварительные тесты проказали что работает, причем именно так как мне надо....
За исключением 1-го если в инсталяторе выбрать пункт Исправить Установку, то файл бд удаляется )) происходжит это я так понимаю из-за того, что выделено жирным... что там правильно то писать? нужно условие — УДАЛЕНИЕ (не восстановление, не обновление а именно финальное удаление продукта)
LL>предварительные тесты проказали что работает, причем именно так как мне надо.... LL>За исключением 1-го если в инсталяторе выбрать пункт Исправить Установку, то файл бд удаляется )) происходжит это я так понимаю из-за того, что выделено жирным... что там правильно то писать? нужно условие — УДАЛЕНИЕ (не восстановление, не обновление а именно финальное удаление продукта)
да нужно заменить NOT UPGRADINGPRODUCTCODE на REMOVE=ALL AND NOT UPGRADINGPRODUCTCODE
хм... а при установке удаленной через политики GPO как себя данная конструкцуия будет вести? есть принципиальные отличия? почему то у меня файлик не скопировался... может быть я как то не так политику GPO назначил?
Здравствуйте, Lexa-Lexa, Вы писали: LL>хм... а при установке удаленной через политики GPO как себя данная конструкцуия будет вести? есть принципиальные отличия? почему то у меня файлик не скопировался... может быть я как то не так политику GPO назначил?
Мне не охота делать эксперименты, проверьте на своей инсталяшке, будет ли скопирован файл в таком варианте:
Здравствуйте, WPooh, Вы писали:
WP>Здравствуйте, Lexa-Lexa, Вы писали: LL>>хм... а при установке удаленной через политики GPO как себя данная конструкцуия будет вести? есть принципиальные отличия? почему то у меня файлик не скопировался... может быть я как то не так политику GPO назначил? WP>Мне не охота делать эксперименты, проверьте на своей инсталяшке, будет ли скопирован файл в таком варианте:
WP>msiexec /a installpackagename.msi /l*vx c:\Temp\MyPackage.install.log TARGETDIR=c:\Temp\MyPackage
WP>Проверьте в C:\Temp\MyPackage, есть ли где внутри ваш файлик. Подозреваю, что нету.
WP>Успехов!
Да, вы правы, мой файлик даже и не подумал копироваться... может быть дадите комментарии по всему этому, я слабо понимаю
Как же поступить? на всякий случай вот код:
Здравствуйте, Lexa-Lexa, Вы писали:
LL>хм... а при установке удаленной через политики GPO как себя данная конструкцуия будет вести? есть принципиальные отличия? почему то у меня файлик не скопировался... может быть я как то не так политику GPO назначил?
Принципиально ничего не меняется, но Вы должны обеспечить чтобы при установке нужный файл лежал (не лежал) рядом с msi.
Откуда производиться установка Вы легко узнаете из лога (смотрите на SOURCEDIR, BASE_SOURCEFileSearch, BASE_SOURCE).
По моему при установке через GPO указать командную строку нельзя, так что включить логирование Вы можете так http://support.microsoft.com/kb/223300
Здравствуйте, -af, Вы писали:
-af>Здравствуйте, Lexa-Lexa, Вы писали:
LL>>хм... а при установке удаленной через политики GPO как себя данная конструкцуия будет вести? есть принципиальные отличия? почему то у меня файлик не скопировался... может быть я как то не так политику GPO назначил?
-af>Принципиально ничего не меняется, но Вы должны обеспечить чтобы при установке нужный файл лежал (не лежал) рядом с msi. -af>Откуда производиться установка Вы легко узнаете из лога (смотрите на SOURCEDIR, BASE_SOURCEFileSearch, BASE_SOURCE). -af>По моему при установке через GPO указать командную строку нельзя, так что включить логирование Вы можете так -af>http://support.microsoft.com/kb/223300
Да, вы правы, командную строку указать там негде, но вот невзирая на то что файл ЛЕЖИТ рядом с msi он не копируется... буду разбираться
Спасибо за ссылочку...
Здравствуйте, -af, Вы писали:
-af>Принципиально ничего не меняется, но Вы должны обеспечить чтобы при установке нужный файл лежал (не лежал) рядом с msi. -af>Откуда производиться установка Вы легко узнаете из лога (смотрите на SOURCEDIR, BASE_SOURCEFileSearch, BASE_SOURCE). -af>По моему при установке через GPO указать командную строку нельзя, так что включить логирование Вы можете так -af>http://support.microsoft.com/kb/223300
Посмотрел и логи...
При установке через GPO: SOURCEDIR — PROPERTY CHANGE: Adding SourceDir property. Its value is '\\Server1\Share\RC5\'. — все верно BASE_SOURCEFileSearch — вообще ни одного упоминания, ну даже не пытается искать что ли? BASE_SOURCE — есть только это: SecureCustomProperties = BASE_SOURCE;NETFRAMEWORK20;NEWPRODUCTFOUND;UPGRADEFOUND — какой то бред...
т.е. все верно! ну и для др св-в нормально так же все...
А пути разные потому что в 1м случае это сетевой путь, а во втором у меня другая вирт машина и там уже у меня сетевой диск, дистрибутив же везде одинаковый лежит.
Здравствуйте, Lexa-Lexa, Вы писали:
LL>Посмотрел и логи... LL>При установке через GPO: LL>SOURCEDIR — PROPERTY CHANGE: Adding SourceDir property. Its value is '\\Server1\Share\RC5\'. — все верно LL>BASE_SOURCEFileSearch — вообще ни одного упоминания, ну даже не пытается искать что ли? LL>BASE_SOURCE — есть только это: SecureCustomProperties = BASE_SOURCE;NETFRAMEWORK20;NEWPRODUCTFOUND;UPGRADEFOUND — какой то бред...
Насколько мне помниться установка через GPO проходит в silence mode, то есть InstallUISequence не исполняется.
Подозреваю что у Вас не определено действие AppSearch в InstallExecuteSequence.
В любом случае протестировать такое поведение Вы можете задав опцию qn для msiexec http://msdn.microsoft.com/en-us/library/aa367988.aspx
Здравствуйте, -af, Вы писали:
-af>Здравствуйте, Lexa-Lexa, Вы писали:
LL>>Посмотрел и логи... LL>>При установке через GPO: LL>>SOURCEDIR — PROPERTY CHANGE: Adding SourceDir property. Its value is '\\Server1\Share\RC5\'. — все верно LL>>BASE_SOURCEFileSearch — вообще ни одного упоминания, ну даже не пытается искать что ли? LL>>BASE_SOURCE — есть только это: SecureCustomProperties = BASE_SOURCE;NETFRAMEWORK20;NEWPRODUCTFOUND;UPGRADEFOUND — какой то бред...
-af>Насколько мне помниться установка через GPO проходит в silence mode, то есть InstallUISequence не исполняется.
протестил, ну и конечно же вы правы, не работает ничего)))
-af>Подозреваю что у Вас не определено действие AppSearch в InstallExecuteSequence.
позвольте спросить, а почему именно AppSearch? я про него первый раз слышу сейчас инфу почитал, но не вижу в нем ничего, что позволило бы помочь мне...
у меня же цепочка вроде как:
<Feature ......>
<ComponentRef Id="TaskCopyBaseFile" />
.....
Здравствуйте, Lexa-Lexa, Вы писали:
LL>позвольте спросить, а почему именно AppSearch? я про него первый раз слышу сейчас инфу почитал, но не вижу в нем ничего, что позволило бы помочь мне...
Проверьте что AppSearch содержиться в таблице InstallExecuteSequence (используйте Orca для просмотра msi)
Если ее нет то добавьте
<InstallExecuteSequence>
<AppSearch/>
</InstallExecuteSequence>
Здравствуйте, -af, Вы писали:
-af>http://msdn.microsoft.com/en-us/library/aa367578(VS.85).aspx -af>The AppSearch action searches for file signatures using the CompLocator table first, the RegLocator table next, then the IniLocator table, and finally the DrLocator table.
-af>Проверьте что AppSearch содержиться в таблице InstallExecuteSequence (используйте Orca для просмотра msi) -af>Если ее нет то добавьте -af><InstallExecuteSequence> -af> <AppSearch/> -af></InstallExecuteSequence>
AppSearch имеется в табличке InstallExecuteSequence, Sequence=50...
Здравствуйте, Lexa-Lexa, Вы писали:
LL>Здравствуйте, -af, Вы писали:
-af>>http://msdn.microsoft.com/en-us/library/aa367578(VS.85).aspx -af>>The AppSearch action searches for file signatures using the CompLocator table first, the RegLocator table next, then the IniLocator table, and finally the DrLocator table.
-af>>Проверьте что AppSearch содержиться в таблице InstallExecuteSequence (используйте Orca для просмотра msi) -af>>Если ее нет то добавьте -af>><InstallExecuteSequence> -af>> <AppSearch/> -af>></InstallExecuteSequence>
LL>AppSearch имеется в табличке InstallExecuteSequence, Sequence=50...
Вам придется использовать OriginalDatabase и откусывать имя msi http://msdn.microsoft.com/en-us/library/aa370562(VS.85).aspx
(не забудте только что если Вы вызываете reinstall/repair, то OriginalDatabase будет указывать прикешированный msi в папке c:\Windows\installer)
Здравствуйте, -af, Вы писали:
-af>Вам придется использовать OriginalDatabase и откусывать имя msi -af>http://msdn.microsoft.com/en-us/library/aa370562(VS.85).aspx -af>(не забудте только что если Вы вызываете reinstall/repair, то OriginalDatabase будет указывать прикешированный msi в папке c:\Windows\installer)
В общем расскажу чем все закончилось
Для определения наличия базы зядом с инсталятором написал Custom Action на C#...
Использует для определения местоположения он у меня Session["OriginalDatabase"] и извлекает из пути к файлу каталог.
Если база есть устанавливает переменную BASE_SOURCE и дальше уже действует Wix.