2009-06-24 11 views
103

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

答えて

180

を使用することができます。その後、イベントハンドラ内の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を実行すると、サービスがインストールされ、起動されます。あなたのデザイナーを破損し

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(); 
    } 
} 
} 
+39

(提案された編集のコメント):serviceInstaller.ServiceNameを使用する方が良いでしょう。サービス名が変更されると、コード内で変更することなく正しい名前が使用されます。 –

+1

usingステートメントで 'ServiceController'をラップすることも害ではありません。 – ChrisO

+0

OnBeforeInstallにサービスインストーラのIDを指定する必要がありました。何かのようなserviceInstaller = serviceInstaller1;ここでserviceInstaller1はデザイナのIDです。 OnBeforeInstallでこれを行うと、上記の作業が完璧に私のためになりました。私は試していませんでしたが、あなたはServiceInstaller()コールでもそれを行うことができます。 –

0

自動起動とは、Windowsの起動時にサービスが自動的に開始されることを意味します。他の人が触れたように、コンソールから起動するにはServiceControllerを使うべきです。

+0

私はこれをしたくありません。私は、コマンドラインから、またはWindowsサービスクラス内から、これを行うことを検討しています。 – mickyjtwin

+0

申し訳ありませんが、私の悪い、私はあなたが明示的にコントロールパネル上でそれを開始の可能性を除いた点を逃した。 –

5

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

net start "<service name>" 
net stop "<service name>" 
3

あなたはサービスを開始するには、次のコマンドラインを使用することができます。

net start *servicename* 
2

がコードから、あなたのサービスを開始するServiceControllerを使用してください。

更新:さらに、コマンドラインからサービスを開始するには、「net」ではなく「sc」(Service Controller)コマンドを使用します。

+6

なぜ「sc」は「正しい」方法ですか? "net start"(およびstart-service PSHコマンドレット)の何が問題になっていますか? – Richard

+1

scはリモートマシンから呼び出すことができるので、常に動作します。 – MacGyver

0

GetServicesメソッドをServiceController クラスにすると、すべてのサービスの配列を取得できます。次に、各サービスのServiceNameプロパティを確認してサービスを見つけます。サービスを見つけたら、Startメソッドに電話をかけて開始してください。

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

4
サービスを制御するための

プログラムによるオプション:

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

は少しリファクタリングした後、これが自動起動して、完全なWindowsサービスのインストーラの一例です。インストーラコンポーネントを再追加します。それにはserviceInstallerとserviceProcessInstallerが必要です。起動方法が[自動]に設定されているserviceInstallerは、インストール時および再起動後に起動します。

+1

このコードは私に次のエラーを返しました: インストールフェーズで例外が発生しました。 System.InvalidOperationException:System.ServiceProcess.ServiceInstallerのOnAfterInstallイベントハンドラで例外が発生しました。 内部例外System.InvalidOperationExceptionがスローされ、次のエラーメッセージが表示されます。コンピュータ '。'上のサービスserviceNameを開始できません.. 内部例外System.ComponentModel.Win32Exceptionがスローされ、次のエラーメッセージがスローされました:このサービスが実行可能なプログラム実行するように設定されている場合、サービスは実装されません。 – goamn

+1

「InitializeComponent()」という行をコメントアウトするとエラーが発生しました。私は、ログがエラーの前に一緒に起こっている2つの同じことを示すように見えるので、この行は他のすべての行を複製していると考えています。 service serviceNameのインストール... service serviceNameが正常にインストールされました。 ログアプリケーションのEventLogソースserviceNameの作成... サービスserviceNameのインストール中... ログアプリケーションのEventLogソースserviceNameの作成... System.ServiceProcess.ServiceInstallerのOnAfterInstallイベントハンドラで例外が発生しました。 – goamn

+0

あなたは本当に私の日を救った:この有益なコメントありがとう。私はInitializeComponent()呼び出しをコメントアウトした後、私のサービスも完全に開始しました – Konstantin

0

1

私はまだサービスを開始することができませんでした。インストールされたばかりのサービスは、インストールされていないため起動できないというエラーメッセージが表示されました。

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(); 
    } 
0

ちょうどノート:あなたは異なっ使ってサービスを設定している場合もあり、this.serviceInstaller.ServiceNameではなく、文字通り...

を使用しているにもかかわらず、私は最終的に、コマンドラインを使用する代わりの解決策を見つけましたサービスインストーラとプロジェクトインストーラを追加するフォームインターフェイス。その場合は、serviceInstaller.ServiceNameが "name from designer" .ServiceNameと表示されている場所を置き換えます。

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

ありがとうございました。

関連する問題