2013-04-24 11 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インストーラが送信する一般的なメッセージです。ほとんどの場合、サービスは依存関係がないか、開始時に完全に構​​成されていないという問題があります。ルートの問題をデバッグするには、次のコマンドを実行してください。

  1. MSIパッケージをインストールしてください。
  2. サービスを開始できないというエラーダイアログが表示された場合* ダイアログを閉じません。
  3. services.mscを起動するか、コマンドラインからsc.exeを使用してサービスを開始してください。なぜ失敗したのかを深くデバッグできるように、Windowsインストーラは十分なサービスを設定している必要があります。
  4. 必要に応じてサービスの実行可能ファイルに直接デバッグして、起動できない理由を確認します。

これは、マネージコードで記述されたサービスである場合、それはないがGACに配置されているファイルに依存しないことを確認してください。インストールプロセスの非常に遅いまで、ファイルはGACにありません。 GACでファイルを使用する必要がある場合、組み込みのServiceControl要素を使用することはできず、InstallFinalizeの後に実行するカスタムアクションを作成する必要があります。 InstallFinalizeの後では、カスタムアクションが昇格されないため、サービスは非昇格ユーザーによって開始されるようにサポートする必要があります。再び、私はGACに依存しないことをお勧めします。

サービスをデバッグするのに幸運を祈る!

+1

こんにちはRob、質問はダミーと聞こえるかもしれませんが、実行ファイルがGACの一部のファイルに依存するかどうかはどのように分かりますか? – Pant

+0

これは私の仕事であり、ありがとう – jovenb

6

ServiceInstallアカウントはOPの例では難読化されていますが、1が完全にアカウントを修飾するのを忘れた場合は、このエラーのような、起こることができます。

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

あなただけのユーザー名を指定した場合、あなたのインストーラが失敗します(ワット/ NT AUTHORITY O)このように:

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

+0

この回答に関連する:[SERVICEACCOUNT]にローカルアカウントを使用する場合は、アカウント名だけでなくコンピュータの名前も含めてください。例えば。 MYSERVER \ UserXは動作し、UserXは機能しません。もちろん、ドメイン名を指定する必要があります。これはドメインアカウントです。 –

4

、 "サービスとしてログオン" [SERVICEACCOUNT]に権限を追加することを忘れないでください

ローカルコンピュータのアカウントに「サービスとしてログオン」権限を追加するには

1)ローカルセキュリティポリシーを開きます。

2)コンソールツリーで、ローカルポリシーをダブルクリックし、[ユーザー権利の割り当てをクリックします。

3)詳細ペインでをダブルクリックしてサービスにログオンします。

4)は、ユーザーまたはグループを追加し、がサービス権利としてログオン所有するアカウントのリストに、適切なアカウントを追加]をクリックします。

投稿者:http://technet.microsoft.com/en-us/library/cc739424%28v=ws.10%29.aspx

0

サービスの起動時の問題をデバッグするときは、インストールディレクトリに特定のファイルが存在するかどうかを確認する単純なif()文を使用します。サービスが失敗すると、コマンドプロンプトを開き(エラーを示すダイアログを閉じる前に)、 "echo> thatfile"を使ってif()で探しているファイルを作成します。 if()のオブジェクトはDebugger.Launch()の呼び出しです。

これで、ダイアログを閉じてインストーラを再実行し、今度はデバッガを起動して何が起こるかを確認できます。私は、デバッガを起動する瞬間として静的クラスinitを使用する傾向がありますが、 "OnStart()"で実行しようとすることはできますが、ロード/バインディングの問題がある場合は、 。静的クラスinitの間にそれを行うのは、ほとんどの場合、依存関係として扱う必要があることを伝えます。

0

サービスを開始する前にサービスに依存する必要があったため、今日このエラーが発生しました。結局のところ、依存関係はインストーラーによって最後にGACされています。ブートストラップ/マルチパートインストーラーを構築することなくこれを回避する良い方法はありません。

ただし、GACにアセンブリをデプロイし、サービスと同じディレクトリにインストールしてください。こうすることで、サービスはプログラムファイルディレクトリの先頭にあるDLLを見つけることができ、GACedされます(これは他の理由で必要となります)。

これを行うには、私は2つの別々のコンポーネントグループを作成する必要がありました、そして「ダミー」ディレクトリ:私は、2つのコンポーネントグループを作成

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

:exeファイルとすべてのライブラリを持っている1、第二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> 

そして今は動作します!