InstallUtil.exeを使用してインストールするWindowsサービスがあります。 [スタートアップ方法]を[自動]に設定していても、インストール時にサービスが開始されないため、サービスを手動で開いて[開始]をクリックする必要があります。コマンドラインまたはサービスのコードのいずれかで起動する方法はありますか?
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を実行すると、サービスがインストールされて起動します。
少しリファクタリングした後、これは自動起動を備えた完全な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
を使用できます次のコマンドラインを使用して、サービスを開始できます。
net start *servicename*
ServiceController を使用して、コードからサービスを開始します。
Update:そして、コマンドラインからサービスを開始するより適切な方法は、代わりに「sc」( Service Controller )コマンドを使用することです「ネット」の。
受け入れられた答えに正確に従ったにもかかわらず、サービスを開始できませんでした-代わりに、インストール中にインストールされたサービスが存在しなかったため開始できなかったことを示す失敗メッセージが表示されました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();
}
ServiceController クラスのGetServices
メソッドを使用して、すべてのサービスの配列を取得できます。次に、各サービスのServiceName
プロパティを確認して、サービスを見つけます。サービスが見つかったら、Start
メソッドを呼び出してサービスを開始します。
また、Status
プロパティをチェックして、startを呼び出す前に、どの状態になっているかを確認する必要があります(実行中、一時停止、停止など)。
ちょっとですが、cmdのscツールを利用できます。
sc start ServiceName
管理者モードである必要があることに注意してください。
自動起動とは、Windowsの起動時にサービスが自動的に起動されることを意味します。他の人が述べたように、コンソールから起動するには、ServiceControllerを使用する必要があります。
デザイナーが破損しました。インストーラーコンポーネントを再追加します。 serviceInstallerとserviceProcessInstallerが必要です。プロパティStartup MethodがAutomaticに設定されたserviceInstallerは、インストール時および各再起動後に起動します。
ご注意:フォームインターフェースを使用してサービスインストーラーとプロジェクトインストーラーを追加すると、サービスの設定が異なる場合があります。その場合は、serviceInstaller.ServiceNameの場所を「name from designer」.ServiceNameに置き換えます。
この場合、プライベートメンバーも必要ありません。
助けてくれてありがとう。