2013-04-24 1 views
13

WiX v3.8을 사용하여 Windows 서비스를 설치하고 시작하기위한 MSI 패키지를 만들고 있습니다. 로그에 다음 오류와 함께 실패WiX 설치 프로그램에서 Windows 서비스를 설치하고 시작하지 못했습니다.

<Component Id="INSTALLAPSSERVICE" Guid="991D5F82-0E77-4FE3-B1D8-4C941B84C7CD" Win64="yes"> 
    <File Id="ApsService.exe" 
     Name="ApsService.exe" 
     Source="Resource\ApsService.exe" 
     KeyPath="yes" 
     Vital="yes" 
     DiskId="1"></File> 
    <ServiceInstall Id="ApsServiceInstaller" 
        Name="ApsService" 
        DisplayName="ApsService" 
        Type="ownProcess" 
        Start="auto" 
        ErrorControl="normal" 
        Description="A monitor service for windows application." 
        Account="[SERVICEACCOUNT]" 
        Password="[SERVICEPASSWORD]" 
        Vital="yes" 
        Interactive="no"></ServiceInstall> 
    <ServiceControl Id="StartService" 
        Start="install" 
        Stop="both" 
        Remove="uninstall" 
        Name="ApsService" 
        Wait="yes"/> 
</Component> 

를하지만 설치 :

Executing op: ServiceControl(,Name=ApsService,Action=1,Wait=1,) 
StartServices: Service: ApsService 
Error 1920. Service 'ApsService' (ApsService) failed to start. Verify that you have  sufficient privileges to start system services. 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 3676 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 1888 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 1764 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 3504 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 2100 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 2752 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 3672 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 3876 could not be cancelled. Error: 1168 
MSI (s) (F0:D0) [15:57:28:630]: I/O on thread 1400 could not be cancelled. Error: 1168 
MSI (s) (F0:C0) [15:57:28:630]: Product: WinApsSetup64 -- Error 1920. Service 'ApsService' (ApsService) failed to start. Verify that you have sufficient privileges to start system services. 

가 어떻게 오류를 수정 할 수있는 코드는 다음과 같이?

답변

12

설치 중에 서비스를 시작하지 못할 때 Windows Installer가 보내는 일반 메시지가 표시됩니다. 거의 항상 문제는 서비스 시작시 종속성이 누락되었거나 그렇지 않으면 완전히 구성되지 않았기 때문입니다. 루트 문제를 디버그하려면 다음을 시도하십시오.

  1. MSI 패키지를 설치하십시오.
  2. 서비스를 시작하지 못했다는 오류 대화 상자가 표시되면 * 대화 상자를 닫지 마십시오.
  3. services.msc를 시작하거나 명령 줄에서 sc.exe를 사용하여 서비스를 시작하십시오. Windows Installer는 실패한 이유를 자세히 디버깅 할 수 있도록 서비스를 충분히 구성해야합니다.
  4. 필요한 경우 서비스 실행 파일을 디버그하여 직접 시작할 수없는 이유를 확인하십시오. 이 관리 코드로 작성된 서비스가 경우

, 그것은 하지 파일이 GAC에 배치되는에 의존한다는 것을 확인합니다. 설치 과정 중 매우 늦어지기 전까지는 파일이 GAC에 없습니다. GAC에서 파일을 사용해야하는 경우 기본 제공 ServiceControl 요소를 사용할 수 없으며 InstallFinalize 이후에 실행되도록 사용자 지정 작업을 작성해야합니다. InstallFinalize 이후 사용자 지정 작업이 수행되지 않으므로 서비스가 승격되지 않은 사용자가 시작할 수 있도록 지원해야합니다. 다시 말하지만, GAC에 의존하지 않는 것이 좋습니다.

서비스를 디버깅하는 행운을 비네!

+1

안녕하세요. 질문이 거짓 일 수 있지만 실행 파일이 GAC의 일부 파일에 의존하는지 어떻게 알 수 있습니까? – Pant

+0

이 작품은 나와 함께 작동합니다. 감사합니다. – jovenb

6

ServiceInstall 계정은 영업 이익의 예에서 난독 화되어 있지만, 하나의 완전히 계정 자격을 잊어 버린 경우이 오류가 같은 발생할 수 있습니다 : 당신은 사용자 이름을 지정하는 경우

<ServiceInstall ... Account="NT AUTHORITY\LocalService" />

귀하의 설치가 실패합니다 (/ 신약 당국 오 w)이 같은 :

<ServiceInstall ... Account="LocalService" />

+0

이 답변과 관련된 답변 : [SERVICEACCOUNT]에 로컬 계정을 사용하는 경우 계정 이름뿐 아니라 컴퓨터 이름도 포함해야합니다. 예 : MYSERVER \ UserX는 작동하지만 UserX는 작동하지 않습니다. 물론 도메인 이름을 지정해야합니다. 도메인 계정입니다. –

4

에서, [SERVICEACCOUNT]에 대한 권리를 추가 "서비스로 로그온"하는 것을 잊지 마십시오

로컬 컴퓨터의 계정에 "서비스로 로그온"권한을 추가하려면

1) 로컬 보안 정책을 엽니 다.

2) 콘솔 트리에서 로컬 정책을 두 번 클릭 한 다음 사용자 권한 할당을 클릭합니다.

세부 정보 창에서 을 두 번 클릭하여 서비스로 로그온하십시오..

4) 는 사용자 또는 그룹을 추가 한 다음 서비스를 잘로 로그에 소유 계정 목록에 해당 계정을 추가 클릭합니다.

올린 사람 : http://technet.microsoft.com/en-us/library/cc739424%28v=ws.10%29.aspx.

0

서비스 시작 문제를 디버깅 할 때 필자는 설치 디렉토리에 특정 파일이 있는지 확인하는 간단한 if() 문을 사용합니다. 서비스가 실패하면 명령 프롬프트를 열고 (오류를 나타내는 대화 상자를 닫기 전에) "echo> thatfile"을 사용하여 if()에서 찾고있는 파일을 만듭니다. if()의 오브젝트는 Debugger.Launch() 호출입니다.

이제 대화 상자를 닫고 설치 프로그램을 다시 실행하면 디버거가 시작되고 어떤 일이 발생하는지 볼 수 있습니다. 나는 정적 클래스 init을 디버거를 시작하는 순간으로 사용하는 경향이 있지만 "OnStart()"에서 시도해 볼 수는 있지만로드/바인딩 문제가있는 경우에는 죽기 전에 그 지점에 도달하지 못할 수도 있습니다 . 정적 클래스 초기화 중에이 작업을 수행하는 것이 거의 항상 종속성으로 해결해야 할 사항을 알려줍니다.

0

서비스를 시작하기 전에 서비스에 GACed가 필요한 종속성이 있으므로 오늘 오류가 발생했습니다. 결국, 의존성은 설치자에 의해 마지막으로 GAC되어지고, 일종의 부트 스트래퍼/멀티 파트 설치 프로그램을 만들지 않고는이 문제를 해결할 수있는 좋은 방법이 없습니다.

그러나 다음과 같은 해결 방법을 발견했습니다. 어셈블리를 GAC에 모두 배포하고 서비스와 동일한 디렉터리에 설치합니다. 이렇게하면 서비스가 프로그램 파일 디렉토리의 시작에서 DLL을 찾을 수있게되며 GACed가됩니다 (다른 이유로 인해 필요했습니다).

이렇게하려면, 나는 두 개의 별도의 구성 요소 그룹을 만들했고, "더미"디렉터리 : 다음 두 가지 구성 요소 그룹을 만들

<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="ProgramFilesFolder"> 
    <Directory Id="INSTALLDIR" Name="NameOfProgram" /> 
    <Directory Id="GacDlls" Name="libs" /> 
    </Directory> 
</Directory> 

: EXE 파일과 모든 라이브러리를 가지고 하나, 그리고 두 번째 Assembly 속성이 ".net"으로 설정된 동일한 라이브러리가 있습니다.

<ComponentGroup Id="ServiceLibs" Directory="GACDlls"> 
    <Component Id="log4netGAC" 
        Guid="a23099ac-5880-4b6e-af3f-fa7cef113226"> 
     <File Id="log4net.dllGAC" 
       Name="log4net.dll" 
       Source="..\ProjectDir\bin\$(var.Configuration)\log4net.dll" 
       KeyPath="yes" 
       Vital="yes" 
       DiskId="1" 
       Assembly=".net" 
      /> 
    </Component> 
</ComponentGroup> 

<ComponentGroup Id="ProductComponents" Directory="INSTALLDIR"> 
    <Component Id="log4net" 
       Guid="463e05db-e248-44d7-bbde-467358b7310f"> 
     <!-- normally we'd want to GAC this (Assembly=".net"), but that would prevent us from starting the service up during install so we'll just drop it in the program folder --> 
     <File Id="log4net.dll" 
       Name="log4net.dll" 
       Source="..\ProjectName\bin\$(var.Configuration)\log4net.dll" 
       KeyPath="yes" 
       Vital="yes" 
       DiskId="1"      
      />    
    </Component> 
    ... other components ... 
</ComponentGroup> 

이제는 작동합니다!

관련 문제