2017-03-22 1 views
0

설치 프로그램은 현재 Windows 서비스 exe를 "설치"합니다. 즉, 파일을 사용자 PC에 복사하지만 시작하지는 않습니다.Wix 사용자 지정 작업 - 실행중인 Windows 서비스를 중지했다가 시작합니다.

우리 앱이 실행되면 InstallUtil을 사용하여 여러 번 서비스를 "설치"할 것이고 각 서비스 인스턴스는 다른 서비스 이름을 갖게됩니다.

우리의 앱을 업그레이드 할 때 실행중인 서비스의 수와 호출 된 서비스는 알 수 없지만 서비스 이름이 "ABCService_"로 시작한다는 것을 알고 있습니다.

그래서 저는 "stopServices"와 "startServices"라는 두 가지 VB.NET 사용자 지정 작업을 만들었습니다. 첫 번째 사용자의 PC에서 "ABCService_"로 시작하는 Windows 서비스를 검색하고 서비스가 실행 중인지 여부를 나타내는 속성과 함께 temp 폴더의 XML 파일에 이름을 저장합니다. 그러면 실행중인 각 서비스가 중지됩니다.

그런 다음 정상적인 설치가 계속 - 윈도우 서비스 exe는 반대를 할 것 등

에게 두 번째 사용자 지정 작업을 업그레이드 할 것 - 그것은 XML 파일을 읽고 원래 실행중인 모든 서비스를 시작합니다.

이제 이론상 (내 마음 속에서) 이것은 잘 작동 할 것입니다.하지만 제가 가진 문제는 wix msi 코드 내에 이러한 커스텀 액션을 어디에 둘 것인지입니다. 사용자 정의 액션은 PC의 상태를 변경

<InstallExecuteSequence> 
     <Custom Action="CA_StopWindowsServices" 
       After="InstallInitialize" /> 

     <Custom Action="CA_StartWindowsServices" 
       Before="InstallServices"> 
     <![CDATA[NOT Installed]]> 
     </Custom> 
    </InstallExecuteSequence> 

때문에, 그들은 InstallExecuteSequence에서에 배치 할 필요가 및 Visual Studio가 정지 조치가 InstallInitialize 난 후이어야한다라고 나에게 이야기 : 나는 현재로있어 InstallServices 전에 시작 하나 생각하는 것이 좋은 장소일지도 몰라!

그러나 이것은 msi를 실행할 때 내 문제입니다. Windows는 업그레이드해야 할 파일 중 하나 (Windows 서비스 exe)가 실행중인 서비스의 인스턴스 수에 따라 사용 중입니다. 문제는 무엇인지 알 수 있으며 따라서 사용자 지정 작업을 작성한 이유는 무엇입니까? 그러나 창문이 사용되기 전에 불평을하기 전에 그들을 막을 수있는 사람을 부를 수없는 것 같습니다!

그냥 나는 사용자 지정 작업을 정의하는 방법을 알고와 관계있는 될 수 있다고 생각 :

<CustomAction 
     Id="CA_StopWindowsServices" 
     BinaryKey="CustomActionDLL" 
     DllEntry="CustomActionStopServices" 
     Execute="deferred" 
     Return="check" /> 

    <CustomAction 
     Id="CA_StartWindowsServices" 
     BinaryKey="CustomActionDLL" 
     DllEntry="CustomActionStartServices" 
     Execute="commit" 
     Return="check" /> 

지금이 모든 말 - 창문이 개 서비스 인스턴스가 필요한 파일을 사용하고 불평 할 때 난 그냥 내 MSI &를 실행 대체 할 창 - 나는 창을 닫고 창을 닫을 수있는 첫 번째 옵션을 선택했다. 기본적으로 내가하려는 일이다. 그래서 또 다른 질문이있다. 창을 통해 자동으로이 작업을 수행 할 수 있습니다. 도움이된다면, msi는 실제로 화상 부츠러기에서 실행됩니다.

미리 감사드립니다.

건배,

빅 크리스.

답변

2

Windows Installer는 InstallExecute 시퀀스 이전에 발생하는 InstallValidate 중에 교체 될 파일이 사용 중인지 확인합니다.

문제는 InstallValidate (일반적으로) 전에 사용자 지정 작업을 예약 할 때 권한이없는 서비스를 중지해야하는 것입니다.

그러나 부트 스트 래퍼에서는 설치를 클릭 할 때 시작되는 상승 된 부트 스트 래퍼 프로세스에서 MSI가 항상 상승되어 실행되기 때문에 InstallValidate 전에 서비스를 중지하도록 작업을 예약 할 수 있습니다.

MSI의 서비스에 대해 <ServiceControl>을 추가하면 "StopServices"표준 작업 중에 서비스가 자동으로 중지되고 InstallValidate의 FilesInUse 대화 상자가 표시되지 않을 수도 있습니다. 부트 스트 래퍼와 함께 작동하는 솔루션을 이미 가지고 있기 때문에 이것을 테스트 해 보지는 못했습니다.

그래서 사용자 지정 작업 솔루션을 시도하지만 InstallValidate 전에 서비스를 중지하도록 사용자 지정 작업을 예약하십시오.

+0

대단히 감사드립니다. InstallValidate 전에 설치했는데 setup.exe에서 msi가 상승 된 권한으로 실행된다고 말한 것처럼 트릭을 만들었습니다 !! –

관련 문제