web-dev-qa-db-ja.com

インストール時にWindowsサービスを自動的に開始する

InstallUtil.exeを使用してインストールするWindowsサービスがあります。 [スタートアップ方法]を[自動]に設定していても、インストール時にサービスが開始されないため、サービスを手動で開いて[開始]をクリックする必要があります。コマンドラインまたはサービスのコードのいずれかで起動する方法はありますか?

115
mickyjtwin

Installerクラスで、AfterInstallイベントのハンドラーを追加します。その後、イベントハンドラーでServiceControllerを呼び出して、サービスを開始できます。

using System.ServiceProcess;

public ServiceInstaller()
{
    //... Installer code here
    this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall);
}

void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
    using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName))
    {
         sc.Start();
    }
}

インストーラーでInstallUtilを実行すると、サービスがインストールされて起動します。

210
codemonkey

少しリファクタリングした後、これは自動起動を備えた完全なWindowsサービスインストーラーの例です。

using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;

namespace Example.of.name.space
{
[RunInstaller(true)]
public partial class ServiceInstaller : Installer
{
    private readonly ServiceProcessInstaller processInstaller;
    private readonly System.ServiceProcess.ServiceInstaller serviceInstaller;

    public ServiceInstaller()
    {
        InitializeComponent();
        processInstaller = new ServiceProcessInstaller();
        serviceInstaller = new System.ServiceProcess.ServiceInstaller();

        // Service will run under system account
        processInstaller.Account = ServiceAccount.LocalSystem;

        // Service will have Start Type of Manual
        serviceInstaller.StartType = ServiceStartMode.Automatic;

        serviceInstaller.ServiceName = "Windows Automatic Start Service";

        Installers.Add(serviceInstaller);
        Installers.Add(processInstaller);
        serviceInstaller.AfterInstall += ServiceInstaller_AfterInstall;            
    }
    private void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
    {
        ServiceController sc = new ServiceController("Windows Automatic Start Service");
        sc.Start();
    }
}
}
27
Pedro Pereira

次のコマンドはどうですか?

net start "<service name>"
net stop "<service name>"
6
Hemant

サービスを制御するためのプログラムオプション:

  • ネイティブコードを使用できます "サービスの開始" 。最小限の依存関係で最大の制御を行いますが、ほとんどの作業が行われます。
  • WMI: Win32_Service にはStartServiceメソッドがあります。これは、他の処理を実行できるようにする必要がある場合に適しています(例:どのサービスを選択するか)。
  • PowerShell:Start-ServiceRunspaceInvoke 経由で実行するか、独自のRunspaceを作成し、その CreatePipeline メソッドを使用します実行する。これは、WMIよりもはるかに簡単なコーディングモデルで他の処理(たとえば、どのサービスを選択する)を実行できる必要がある場合に適していますが、インストールされているPSHに依存します。
  • .NETアプリケーションは ServiceController を使用できます
4
Richard

次のコマンドラインを使用して、サービスを開始できます。

net start *servicename*
4
AlexDrenea

ServiceController を使用して、コードからサービスを開始します。

Update:そして、コマンドラインからサービスを開始するより適切な方法は、代わりに「sc」( Service Controller )コマンドを使用することです「ネット」の。

2
arbiter

受け入れられた答えに正確に従ったにもかかわらず、サービスを開始できませんでした-代わりに、インストール中にインストールされたサービスが存在しなかったため開始できなかったことを示す失敗メッセージが表示されましたthis.serviceInstaller.ServiceNameリテラルではなく...

最終的に、コマンドラインを使用する代替ソリューションを見つけました。

private void serviceInstaller_AfterInstall(object sender, InstallEventArgs e) {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.FileName = "cmd.exe";
        startInfo.Arguments = "/C sc start " + this.serviceInstaller.ServiceName;

        Process process = new Process();
        process.StartInfo = startInfo;
        process.Start();
    }
1
Matsu Q.

ServiceController クラスのGetServicesメソッドを使用して、すべてのサービスの配列を取得できます。次に、各サービスのServiceNameプロパティを確認して、サービスを見つけます。サービスが見つかったら、Startメソッドを呼び出してサービスを開始します。

また、Statusプロパティをチェックして、startを呼び出す前に、どの状態になっているかを確認する必要があります(実行中、一時停止、停止など)。

0
adrianbanks

ちょっとですが、cmdのscツールを利用できます。

sc start ServiceName

管理者モードである必要があることに注意してください。

0
Ben Kay

自動起動とは、Windowsの起動時にサービスが自動的に起動されることを意味します。他の人が述べたように、コンソールから起動するには、ServiceControllerを使用する必要があります。

0
Michael Klement

デザイナーが破損しました。インストーラーコンポーネントを再追加します。 serviceInstallerとserviceProcessInstallerが必要です。プロパティStartup MethodがAutomaticに設定されたserviceInstallerは、インストール時および各再起動後に起動します。

0

ご注意:フォームインターフェースを使用してサービスインストーラーとプロジェクトインストーラーを追加すると、サービスの設定が異なる場合があります。その場合は、serviceInstaller.ServiceNameの場所を「name from designer」.ServiceNameに置き換えます。

この場合、プライベートメンバーも必要ありません。

助けてくれてありがとう。

0
IanUniacke