InstallUtil.exeを使用してインストールするWindowsサービスがあります。スタートアップメソッドを自動に設定していても、サービスがインストールされても起動しないため、手動でサービスを開いて開始をクリックする必要があります。コマンドライン経由で、またはサービスコード経由で起動する方法はありますか?インストール時にWindowsサービスを自動的に開始
答えて
を使用することができます。その後、イベントハンドラ内の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();
}
}
}
自動起動とは、Windowsの起動時にサービスが自動的に開始されることを意味します。他の人が触れたように、コンソールから起動するにはServiceControllerを使うべきです。
私はこれをしたくありません。私は、コマンドラインから、またはWindowsサービスクラス内から、これを行うことを検討しています。 – mickyjtwin
申し訳ありませんが、私の悪い、私はあなたが明示的にコントロールパネル上でそれを開始の可能性を除いた点を逃した。 –
次のコマンドはどうですか?
net start "<service name>"
net stop "<service name>"
あなたはサービスを開始するには、次のコマンドラインを使用することができます。
net start *servicename*
がコードから、あなたのサービスを開始するServiceControllerを使用してください。
更新:さらに、コマンドラインからサービスを開始するには、「net」ではなく「sc」(Service Controller)コマンドを使用します。
GetServices
メソッドをServiceController クラスにすると、すべてのサービスの配列を取得できます。次に、各サービスのServiceName
プロパティを確認してサービスを見つけます。サービスを見つけたら、Start
メソッドに電話をかけて開始してください。
また、Status
プロパティをチェックして、start(実行中、一時停止中、停止中など)を呼び出す前に、その状態を確認する必要があります。
プログラムによるオプション:
- ネイティブコードを使用することができ、"Starting a Service"。最小限の依存関係で最大限の制御が可能ですが、ほとんどの作業が可能です。
- WMI:Win32_Serviceは、
StartService
メソッドを持っています。これは、他の処理(たとえば、どのサービスを選択するか)を実行できる必要がある場合に適しています。 - PowerShell:
Start-Service
をRunspaceInvoke
で実行するか、独自のRunspace
を作成し、CreatePipeline
メソッドを実行して実行します。これは、WMIよりはるかに簡単なコーディングモデルで他の処理(たとえば、どのサービスを選択する)を行う必要があるが、インストールされるPSHに依存する場合に適しています。 - A .NETアプリケーションはAfterInstallイベントのハンドラを追加し、あなたのインストーラクラスで
ServiceController
は少しリファクタリングした後、これが自動起動して、完全なWindowsサービスのインストーラの一例です。インストーラコンポーネントを再追加します。それにはserviceInstallerとserviceProcessInstallerが必要です。起動方法が[自動]に設定されているserviceInstallerは、インストール時および再起動後に起動します。
このコードは私に次のエラーを返しました: インストールフェーズで例外が発生しました。 System.InvalidOperationException:System.ServiceProcess.ServiceInstallerのOnAfterInstallイベントハンドラで例外が発生しました。 内部例外System.InvalidOperationExceptionがスローされ、次のエラーメッセージが表示されます。コンピュータ '。'上のサービスserviceNameを開始できません.. 内部例外System.ComponentModel.Win32Exceptionがスローされ、次のエラーメッセージがスローされました:このサービスが実行可能なプログラム実行するように設定されている場合、サービスは実装されません。 – goamn
「InitializeComponent()」という行をコメントアウトするとエラーが発生しました。私は、ログがエラーの前に一緒に起こっている2つの同じことを示すように見えるので、この行は他のすべての行を複製していると考えています。 service serviceNameのインストール... service serviceNameが正常にインストールされました。 ログアプリケーションのEventLogソースserviceNameの作成... サービスserviceNameのインストール中... ログアプリケーションのEventLogソースserviceNameの作成... System.ServiceProcess.ServiceInstallerのOnAfterInstallイベントハンドラで例外が発生しました。 – goamn
あなたは本当に私の日を救った:この有益なコメントありがとう。私はInitializeComponent()呼び出しをコメントアウトした後、私のサービスも完全に開始しました – Konstantin
:
私はまだサービスを開始することができませんでした。インストールされたばかりのサービスは、インストールされていないため起動できないというエラーメッセージが表示されました。
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();
}
ちょうどノート:あなたは異なっ使ってサービスを設定している場合もあり、this.serviceInstaller.ServiceName
ではなく、文字通り...
を使用しているにもかかわらず、私は最終的に、コマンドラインを使用する代わりの解決策を見つけましたサービスインストーラとプロジェクトインストーラを追加するフォームインターフェイス。その場合は、serviceInstaller.ServiceNameが "name from designer" .ServiceNameと表示されている場所を置き換えます。
この場合、プライベートメンバーは必要ありません。
ありがとうございました。
- 1. ドッカーコンテナで自動的にサービスを開始
- 2. ActiveJob:サーバー起動時に自動的にジョブを開始する
- 3. Android - 起動時にサービスを開始
- 4. RHEL7システムは自動的にサービスを開始しますか?
- 5. Android:アクティビティ開始時にアプリケーションが自動的にフォアグラウンドになる
- 6. Windowsサービスを開始
- 7. 自己開発Windowsサービスのインストール
- 8. 毎日10時にwindowsフォームアプリケーションを自動的に開く
- 9. Ubuntuの起動時にサービスを自動的に開始するにはどうすればよいですか?
- 10. Windowsサービスの開始時にタスクを実行するには?
- 11. Asp.Netウェブサイトを自動的に起動するWindows起動時に自動的に
- 12. Androidのシステムアプリのサービスの自動開始
- 13. 起動時にWindowsでサービスが開始されたかどうかをチェック
- 14. 動的開始の自動入力列
- 15. 開始時にucrtbase.dllでWindows C++サービスのフォールトが発生する
- 16. Windowsサービスによる同時スレッドの開始と停止
- 17. 手作業でリモートデバッグを開始せずに自動的にリモートデバッグを開始
- 18. C#プログラムによるWindowsサービスの開始
- 19. Windows 7停止/開始サービス
- 20. Windowsサービスの自動展開 - ツール
- 21. リモートマシンのサービス開始タイプを遅延(自動)に変更する
- 22. ユーザープロファイル同期サービスが開始ステージでスタックして自動的に停止する
- 23. systemd:24時間後に自動的にサービスを再開しますか?
- 24. 再起動時にサービスが最初に開始されます
- 25. ブロードキャスト受信機によるサービスの自動開始
- 26. システム起動時にmongodサービスを開始する
- 27. デバイス起動時にサービスを開始します
- 28. 再起動時にgpsdサービスを開始する
- 29. シェフ:サービス開始時に何かする
- 30. Windows Server AMIにJava 8を自動的にインストールする
(提案された編集のコメント):serviceInstaller.ServiceNameを使用する方が良いでしょう。サービス名が変更されると、コード内で変更することなく正しい名前が使用されます。 –
usingステートメントで 'ServiceController'をラップすることも害ではありません。 – ChrisO
OnBeforeInstallにサービスインストーラのIDを指定する必要がありました。何かのようなserviceInstaller = serviceInstaller1;ここでserviceInstaller1はデザイナのIDです。 OnBeforeInstallでこれを行うと、上記の作業が完璧に私のためになりました。私は試していませんでしたが、あなたはServiceInstaller()コールでもそれを行うことができます。 –