InstallUtil.exeを使用してインストールするWindowsサービスがあります。[起動方法]を[自動]に設定しても、インストール時にサービスが開始されないため、サービスを手動で開いて[開始]をクリックする必要があります。コマンドラインから、またはサービスのコードから起動する方法はありますか?
InstallUtil.exeを使用してインストールするWindowsサービスがあります。[起動方法]を[自動]に設定しても、インストール時にサービスが開始されないため、サービスを手動で開いて[開始]をクリックする必要があります。コマンドラインから、またはサービスのコードから起動する方法はありますか?
回答:
インストーラークラスで、AfterInstallイベントのハンドラーを追加します。その後、イベントハンドラーでServiceControllerを呼び出して、サービスを開始できます。
using System.ServiceProcess;
public ServiceInstaller()
{
//... Installer code here
this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall);
}
void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
ServiceInstaller serviceInstaller = (ServiceInstaller)sender;
using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName))
{
sc.Start();
}
}
これで、InstallUtilをインストーラーで実行すると、サービスがインストールされ、自動的に起動します。
ServiceController
、usingステートメントでラップしても問題ありません。
ServiceInstaller
、クラスの変数であると想定されています。そのようなクラスが実装されSystem.Configuration.Install.Installer
ます。詳細については、このmsdnガイドを参照してください。
serviceInstaller
あるServiceInstaller
オブジェクトがで参照sender
正常にインスタンス化されたイベントハンドラにServiceInstaller()
コンストラクタ。したがってServiceInstaller serviceInstaller = (ServiceInstaller)sender;
、using
ステートメントの前に追加できます。
少しリファクタリングした後、これは自動起動を備えた完全な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();
}
}
}
次のコマンドはどうですか?
net start "<service name>"
net stop "<service name>"
サービスを制御するためのプログラムオプション:
StartService
メソッドがあります。これは、他の処理を実行する必要がある場合(たとえば、どのサービスを選択するか)に適しています。Start-Service
経由RunspaceInvoke
したり、独自に作成することによりRunspace
、その使用してCreatePipeline
実行する方法を。これは、WMIよりもはるかに簡単なコーディングモデルで他の処理を実行する必要がある(たとえば、どのサービスを選択する)必要がある場合に適していますが、インストールされているPSHに依存します。ServiceController
ServiceControllerを使用して、コードからサービスを開始します。
更新:コマンドラインからサービスを開始するより正確な方法は、「net」の代わりに「sc」(サービスコントローラー)コマンドを使用することです。
正確に受け入れられた答えを、以下のにもかかわらず、私はまだ私が代わりにそれが存在していなかったとしてだけでインストールされたサービスを使用しているにもかかわらず、起動できなかったことを示す、インストール中にエラーメッセージを与えられたstart--するサービスを取得できませんでした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();
}
自動起動とは、Windowsの起動時にサービスが自動的に起動されることを意味します。他の人が述べたように、コンソールから開始するには、ServiceControllerを使用する必要があります。
ServiceController
クラスのGetServices
メソッドを使用して、すべてのサービスの配列を取得できます。次に、各サービスのプロパティをチェックして、サービスを見つけます。サービスが見つかったら、メソッドを呼び出してサービスを開始します。ServiceName
Start
また、Status
startを呼び出す前に、プロパティをチェックして、どの状態にあるかを確認する必要があります(実行中、一時停止中、停止中など)。
注:フォームインターフェイスを使用して、サービスインストーラーとプロジェクトインストーラーを追加するために、サービスを別の方法で設定した可能性があります。その場合は、serviceInstaller.ServiceNameとある箇所を「デザイナーの名前」.ServiceNameに置き換えます。
この場合、プライベートメンバーも必要ありません。
助けてくれてありがとう。