2010-02-09 3 views
13

저는 여러 Windows 서비스를 설치해야하는 설치 프로그램을 만들고 있습니다. 새로운 .msi 파일을 사용하여 새 빌드를 만드는 경우가 자주 발생하며 이전 설치에서 설치하기 쉽도록 주요 업그레이드를 사용합니다.Wix Major 업그레이드 : Windows 서비스 재설치를 방지하려면 어떻게해야합니까?

문제는 서비스 구성 (예 : 계정 사용자 이름과 암호)을 덮어 쓰지 않고 서비스 파일을 업데이트해야한다는 것입니다.

exe 파일을 보유하는 구성 요소 안에 ServiceInstallServiceControl을 사용하고 있습니다. ServiceInstall의 실행을 조건 (REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE과 같은 조건 사용)으로 설정하여 업그레이드 할 때 서비스가 제거되지 않도록 할 수 있습니까? (단지 중단되어 파일을 업그레이드 할 수 있습니까?)

한 가지 해결책은 맞춤 동작을 사용하는 것이지만 더 좋은 방법이 있을까요?

감사합니다.

답변

11

내가 틀린 장소를 찾고있는 것 같습니다. 내 문제에 대한 해결책은 DeleteServices 표준 작업에 NOT UPGRADINGPRODUCTCODE을 추가하는 것입니다.

내 문제가 해결되었습니다. 이 방법의주의 사항은 현재 msi 파일에 의해 설치된 모든 서비스가 삭제된다는 것입니다. 따라서 서비스 업그레이드를 선택적으로 삭제/보관할 수는 없습니다. 그러나 나에게 문제가되지 않습니다. 업그레이드를 통해 서비스 로그온 정보 (실제 서비스 코드는 아님)를 유지해야한다는 요구 사항이 충족됩니다.

업데이트 : DeleteServices의 조건은 InstallExecuteSequence 요소의 WiX에서 액세스 할 수 있습니다.

+0

나는 이것을 생각하지 않았다는 것을 믿을 수 없다. 이 정보를 공유해 주셔서 감사합니다. – Adkins

+0

Miron, 예를 게시 할 수 있습니까? 업그레이드 사이에 서비스 계정을 저장하려고합니다. –

+0

@MuriloLima 죄송합니다. 몇 년 전이었습니다. 이 질문은 이전 생활에서 온 것입니다. :) 그리고 나는 그 소스 트리에 더 이상 접근 할 수 없습니다. –

0

WiX는 버전이 최신 인 경우에만 구성 요소를 업데이트합니다. 하나의 필드 (어셈블리 버전의 파일 버전, 기억이 안남) 만 검사하므로 현재 버전 정보를 유지하고 다른 버전을 정적으로 유지할 수 있습니다. 이것은 당신을 위해 작동하는 해킹일지도 ...

+1

음, 문제는 파일을 교체해야하지만 구성은 교체하지 않아야한다는 것입니다. 구성 저장 방법을 제어 할 수 있다면 NeverOverwrite 및 Permanent를 해당 파일에 사용합니다. 하지만 여기서 문제는 암호가 LSA에 저장된다는 것입니다. 따라서 ServiceInstall을 조건부로 만들 필요가 있습니다. –

0

하나의 조건으로 각각 동일한 exe에 대해 2 개의 구성 요소를 만들었습니다. 하나는 WIX_UPGRADE_DETECTED이고 다른 하나는 NOT WIX_UPGRADE_DETECTED입니다. WIX_UPGRADE_DETECTED에는 serviceinstall 요소가 포함되지 않으며 NOT WIX_UPGRADE_DETECTED에는 serviceinstall 요소가 포함됩니다.

<DeleteServices><![CDATA[NOT UPGRADINGPRODUCTCODE]]></DeleteServices> 

가 InstallExecuteSequence에서 태그에서이 추가 :

1

이 솔루션이 보일 것입니다 방법이다.

참고 : 원래 첫 번째 버전 인 MSI에이 태그가 있는지 확인하십시오. 그렇지 않으면 완전히 제거하고 설치해야하며이 구성 만 업그레이드에 적용됩니다.

주 2 : 표준 행동이 과거 하나 개의 서비스를 확장하지 않습니다 서비스에 조건을 사용하여

<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices> 
+0

"이전 및 새 msi는이 블록을 가져야합니다"라는 힌트는 업그레이드 도중 이전 버전이 제거되고 이전 msi에서이 블록이 평가되므로 중요합니다. – MHolzmayr

0

: 당신이이 같이 볼 수 있습니다 CDATA 태그를 사용할 필요가 없습니다.

이 방법은 InstallFinalize 전에 RemoveExistingProducts를 예약하는 것입니다. 그런 다음 최신 빌드에 대체되는 것과 동일한 버전의 서비스 EXE가 있는지 확인하십시오. 이렇게하면 Windows Installer는 해당 구성 요소를 제거하거나 다시 설치하지 않습니다.

마지막으로 구성 데이터를 설치 한 다른 구성 요소에 넣고 서비스 구성을 변경하여 데이터가 변경되었음을 알리고 필요한 경우 다시로드하십시오.

개인적으로 나는 이것을하지 않습니다. 멈추고, 재설치하고, 끔찍한 결과없이 항상 서비스를 시작하십시오. 그러면 설치가 몇 초 더 오래 걸립니다.

관련 문제