12

サービスをインストールするための次の WiX プロジェクトがあります。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="GUID" Name="SetupWinService" Language="1049"
           Version="1.0.0.0" Manufacturer="SetupWinService"
           UpgradeCode="GUID">
    <Package InstallerVersion="200" Compressed="yes"
             Languages="1049" SummaryCodepage="1251"
             InstallPrivileges="elevated"/>

    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="WinService" Name="My Windows Service">
        </Directory>
      </Directory>
    </Directory>

    <DirectoryRef Id="WinService">
      <Component Id="WinServiceInstallation" Guid="GUID">
        <File Id="ClientService.exe"
              Name="ClientService.exe"
              Source="...\ClientService.exe"
              Vital="yes" KeyPath="yes" DiskId="1"/>
        <File Id="App.config"
              Name="App.config"
              Source="...\App.config"
              Vital="yes" KeyPath="no" DiskId="1"/>

            <!--And some DLLs here-->

        <ServiceInstall Id="ServiceInstaller"
                        Type="ownProcess"
                        Vital="yes"
                        Name="WcfServiceHost"
                        DisplayName="WcfServiceHost"
                        Description="Hosts Wcf Service"
                        Start="auto"
                        Account="LocalSystem"
                        ErrorControl="ignore"
                        Interactive="no">
        </ServiceInstall>
        <ServiceControl Id="StartService" Name="WcfServiceHost"
                        Start="install" Stop="uninstall" Remove="uninstall"
                        Wait="yes" />
      </Component>
    </DirectoryRef>

    <Feature Id="Complete" Title="SetupWinService" Level="1">
      <ComponentRef Id="WinServiceInstallation" />
      <ComponentGroupRef Id="Product.Generated" />
    </Feature>
  </Product>
</Wix>

サービスをインストールできますが、インストール後に開始できません。それは伝えます:

サービスを開始できませんでした。システム サービスを開始するための十分な権限があることを確認します。

ただし、インストーラーを管理者 (Windows 7 Professional) として実行し、UACも無効にします。さらに、コマンドプロンプトからinstalutil.exeを使用してサービスをインストールおよび実行できます(私のサービスプロジェクトにはInstallerクラスの実現が含まれており、一般的にこの記事に従ってマークアップされています)、その場合、すべてがサービスで正常に動作します.

ServiceControl 要素の Wait="yes" を "no" に置き換えると、サービスはエラーなしでインストールされますが、開始されません。その場合、サービスを手動で開始することもできません。これは、サービスが開始されてすぐに停止し、「ローカル コンピューターのサービスが開始され、その後停止されました。実行する作業がない場合、一部のサービスは自動的に停止します」というメッセージが表示されるためです。

この問題についてインターネットで検索しましたが、解決策が見つかりませんでした。

どうすれば修正できますか?

それは私のInstallerクラスのコードです:

[RunInstaller(true)]
public class ProjectInstaller : Installer
{
    private ServiceProcessInstaller serviceProcessInstaller;
    private ServiceInstaller serviceInstaller;

    public ProjectInstaller()
    {
        this.serviceProcessInstaller = new ServiceProcessInstaller();
        this.serviceProcessInstaller.Account = ServiceAccount.LocalSystem;
        this.serviceProcessInstaller.Username = null;
        this.serviceProcessInstaller.Password = null;
        this.serviceInstaller = new ServiceInstaller();
        this.serviceInstaller.ServiceName = "ClientServicesHost";
        this.serviceInstaller.StartType = ServiceStartMode.Automatic;
        this.Installers.Add(serviceProcessInstaller);
        this.Installers.Add(serviceInstaller);
        this.AfterInstall +=
                new InstallEventHandler(ProjectInstaller_AfterInstall);
    }

    void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
    {
        ServiceController sc = new ServiceController("ClientServicesHost");
        sc.Start();
    }
}

そして私のWindowsサービス:

class WindowsClientService : ServiceBase
{
    public ServiceHost serviceHost = null;

    public WindowsClientService()
    {
        this.ServiceName = "WcfServiceHost";
    }

    public static void Main()
    {
        ServiceBase.Run(new WindowsClientService());
    }

    protected override void OnStart(string[] args)
    {
        if (serviceHost != null)
        {
            serviceHost.Close();
        }

        // Create a ServiceHost for WcfClientService type
        // and provide the base address.
        serviceHost = new ServiceHost(typeof(WcfClientService));

        // Open the ServiceHost to create listeners
        // and start listening for messages.
        serviceHost.Open();
    }

    protected override void OnStop()
    {
        if (serviceHost != null)
        {
            serviceHost.Close();
            serviceHost = null;
        }
    }
}

サービスが自動的に停止する理由が指摘されました。開始後は何もしません。それはできますか?私のサービスはリスナーを作成し、リッスンを開始します - それは「何もしない」のですか?

4

7 に答える 7

8

WiX 3.7.821.0 と私のサービスを使用して同じ問題が発生しました。しばらくインストールすると、同じ迷惑な「サービスを開始できませんでした。システムサービスを開始するのに十分な権限があることを確認してください」が表示されました。

いろいろ試しましたが、最終的には、<ServiceControl>すべてを 1 つのセクションに詰め込むのではなく、2 つのセクションを使用することになりました。1 つは開始用、もう 1 つは停止用です。これで、サービスが正常に開始されます。

これは動作しません:

<ServiceControl Id="StartService" 
                Start="install" 
                Stop="both" 
                Remove="uninstall" 
                Name="MyService" 
                Wait="yes" />

これは機能します:

<ServiceControl Id="ServiceControl_Start"
                Name="MyService"
                Start="install"
                Wait="no" />
<ServiceControl Id="ServiceControl_Stop"
                Name="MyService"
                Stop="both"
                Remove="uninstall"
                Wait="yes" />
于 2014-04-22T10:18:06.667 に答える
6

しばらく答えを探していましたが、ついに解決しました!

ServiceInstall 名と同じ ServiceControl 名を保持します。

結果:

<?xml version="1.0" encoding="utf-8"?>
<?define ProductVersion = "1.0.0"?>
<?define ProductUpgradeCode = "{E8DFD614-41F6-4592-AD7A-27EA8A49C82E}"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <Product Id="*" UpgradeCode="$(var.ProductUpgradeCode)"
           Name="Eyes Relax"
           Version="$(var.ProductVersion)"
           Manufacturer="Ourdark"
           Language="1033">
    <Package Manufacturer="Ourdark" InstallerVersion="100" Languages="1033" Compressed="yes" />

    <Media Id="1" Cabinet="WHSDiskManagement.1.1.0.0.cab" EmbedCab="yes" />

    <Property Id="WHSLogo">1</Property>

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder" Name="PFiles">
        <Directory Id="WHS" Name="Eyes Relax">
          <Component Id="EyesRelax" Guid="{78534F5E-FC72-49E6-AF11-4F2068EA7571}">

            <File Id="RelaxEyes.exe.config"
                  Name="RelaxEyes.exe.config"
                  Source="RelaxEyes\bin\Debug\RelaxEyes.exe.config"
                  Vital="yes"
                  KeyPath="no"
                  DiskId="1"/>

            <File Id="RelaxEyes.exe"
                  Name="RelaxEyes.exe"
                  Source="RelaxEyes\bin\Debug\RelaxEyes.exe"
                  Vital="yes"
                  KeyPath="yes"
                  DiskId="1"/>

            <ServiceInstall
              Id="ServiceInstaller"
              Type="ownProcess"
              Vital="yes"
              Name="Eyes Relax"
              DisplayName="Eyes Relax"
              Description="Eyes Relax"
              Start="auto"
              Account="NT AUTHORITY\LocalService"
              ErrorControl="ignore"
              Interactive="no">
            </ServiceInstall>
            <ServiceControl Id="StartService"
                            Start="install"
                            Stop="both"
                            Remove="uninstall"
                            Name="Eyes Relax"
                            Wait="yes" />
          </Component>
        </Directory>
      </Directory>
    </Directory>

    <Feature Id="ProductFeature" Title="WHSDiskManagement" Level="1">
      <ComponentRef Id="EyesRelax" />
    </Feature>
  </Product>
</Wix>
于 2015-09-15T06:48:36.647 に答える
2

のユーザー名はServiceInstall完全修飾されている必要があります。

NT AUTHORITY\NetworkService

NT AUTHORITY\LocalService

NT AUTHORITY\SYSTEM

于 2013-10-24T06:43:55.270 に答える
2

さて、約1年半ぶりにこの作品に戻ってきました。そして、それを再コンパイルして、このサービスを再度開始しようとしています。そしてそれはうまくいきます!

変更したのは、サービスに clientaccesspolicy.xml を追加し、サービスと共に (WebServiceHost 型の) policyServiceHost を実行したことだけです。しかし、サービスの開始ではなく、アプリケーションの内部に関連しているため、重要ではないと思います。

そこで、次のような多くのバリエーションを試しました。

1) this.serviceProcessInstaller.Username = null;

また

this.serviceProcessInstaller.Username = @"NT AUTHORITY\SYSTEM";

2) 2 つまたは 1 つの ServiceControl セクション。

3) 停止="両方"

また

停止="アンインストール"

すべて正常に動作します!!!

何が起こっているのかわかりません。ある種のバグやシステムの奇妙な構成、または以前にサービスを自動的に開始できないその他のものに任せるだけです。しかし、今ではすべて正常に動作します。

つまり、サービスが自動的に開始されない理由がわかりませんでした。「十分な特権」についてでしたが(最初の投稿を参照)、今でも十分に明確ではありません。

一言だけ。サービスのアンインストール中に 2 つの ServiceControl セクションを使用すると、警告ウィンドウが表示され (Windows 7)、アプリケーション (サービス) を自動的に閉じるように提案されます。したがって、私は受け入れるだけで、サービスのアンインストールはうまくいきます。しかし、最初の投稿の例のように ServiceControl セクションを 1 つだけ使用すると、警告ウィンドウは表示されません。また、1)と3)のポイントの組み合わせには関係ありません。

于 2014-04-23T10:01:37.837 に答える
1

このスニペットを .wxs-file に使用します

<?xml version="1.0" encoding="UTF-8"?>
<?define ProductVersion="1.0.0.0" ?>
<?define UpgradeCode="{YOURGUID}" ?>
<?define Manufacturer="SetupWinService" ?>
<?define ProductName="WcfServiceHost" ?>
<?define SkuName="WcfServiceHost" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*"
             Name="$(var.ProductName)"
             Language="1049"
             Version="$(var.ProductVersion)"
             Manufacturer="$(var.Manufacturer)"
             UpgradeCode="$(var.UpgradeCode)">
        <!-- do you really need 200? i'd try at least 301 -->
        <Package InstallerVersion="301"
                 Compressed="yes"
                 Languages="1049"
                 InstallPrivileges="elevated"
                 SummaryCodepage="1251"
                 Platform="x86" />
        <Media Id="1"
               Cabinet="$(var.SkuName).cab"
               EmbedCab="yes" />
        <Directory Id="TARGETDIR"
                   Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="ProductDirectory"
                           Name="$(var.ProductName)" />
            </Directory>
        </Directory>
        <ComponentGroup Id="MainComponentGroup">
            <Component Directory="ProductDirectory">
                <File Name="$(var.**Project**.TargetFileName)"
                      Source="$(var.**Project**.TargetPath)"
                      KeyPath="yes"
                      Vital="yes" />
                <ServiceInstall Id="SeviceInstall"
                                Name="$(var.ProductName)"
                                DisplayName="$(var.ProductName)"
                                Type="ownProcess"
                                Interactive="no"
                                Start="auto"
                                Vital="yes"
                                ErrorControl="normal"
                                Account="LOCALSYSTEM">
                </ServiceInstall>
                <ServiceControl Id="ServiceControl_Start"
                                Name="$(var.ProductName)"
                                Start="install"
                                Wait="no" />
                <ServiceControl Id="ServiceControl_Stop"
                                Name="$(var.ProductName)"
                                Stop="both"
                                Remove="uninstall"
                                Wait="yes" />
            </Component>
            <Component Directory="ProductDirectory">
                <File Name="App.config"
                      Source="$(var.**Project**.TargetDir)\app.config"
                      Vital="yes" />
            </Component>
        </ComponentGroup>
        <Feature Id="MainFeature"
                 Level="1">
            <ComponentGroupRef Id="MainComponentGroup" />
        </Feature>
        <!-- added automatic upgrading -->
        <Upgrade Id="$(var.UpgradeCode)">
            <UpgradeVersion Property="UPGRADEFOUND"
                            Minimum="0.0.0.1" IncludeMinimum="yes"
                            Maximum="$(var.ProductVersion)" IncludeMaximum="yes"
                            OnlyDetect="no"
                            IgnoreRemoveFailure="yes"
                            MigrateFeatures="yes"/>
        </Upgrade>
        <InstallExecuteSequence>
            <InstallExecute Before="RemoveExistingProducts" />
            <RemoveExistingProducts Before="InstallFinalize" />
        </InstallExecuteSequence>
    </Product>
</Wix>

この基本的なSystem.ServiceProcess.ServiceBase実装で(実際にはあなたのものと違いはありません)

public partial class Service : ServiceBase
{
    public Service()
    {
        this.InitializeComponent();
    }

    public static void Main()
    {
        Run(new Service());
    }

    #region Service Commands

    protected override void OnStart(string[] args)
    {
    }

    protected override void OnStop()
    {
    }

    protected override void OnPause()
    {
        this.OnStop();
    }

    #endregion
}

このスニペットを使用して、デモプロジェクトを機能させました...

完全に機能するデモ プロジェクトが利用可能です- それでも問題が解決しない場合は、問題を再現できるようにコードを変更してください。

于 2012-09-19T11:58:18.613 に答える
0

一部のコンピューターでこのエラーが発生しました。同じ実行可能ファイルが一部で機能し、他のものでこのエラーが発生します。

これらのコンピューターで .NET 1.1/2.0/3.0 を更新すると役立ちます (Windows XP、7、および 8.1 で動作しました)。

于 2014-11-21T12:13:56.653 に答える