none
windowsサービスが起動できない C# RRS feed

  • 質問

  • C#でwindowsサービスを作成しました。visual studio 2017を使用しています。

    OSはwindows10 proです。

    いちよう以下のコードは入力した時点でエラーが出ていませんでした。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Linq;
    using System.ServiceProcess;
    using System.Text;
    using System.Threading;
    
    using System.Threading.Tasks;
    
    
    namespace addonblocker
    {
        public partial class Service1 : ServiceBase
        {
            public Service1()
            {
                InitializeComponent();
            }
    
            protected override void OnStart(string[] args)
            {
    
    
                new Service1().Addonkiller();
            }
    
            public void Addonkiller()
            {
               var timer = new Timer(new TimerCallback(Check_Process));
               Console.WriteLine("{0}タイマーを起動します",
               DateTime.Now.ToString("h:mm:ss.fff"));
               timer.Change(0, 1000);
               for (; ; ) { }; // これがないとプログラムが終了する。
            }
    
            public void Check_Process(object args)
            {
               foreach (var p in Process.GetProcesses())
                 if (p.MainWindowTitle == "アドオンマネージャー - Mozilla Firefox")
    ユーザーアカウントで作成し、インストールなど必要なところは管理者権限を実行して画面をすすめました。

    インストールも成功しました。

    いざ起動させようとすると

    ローカルコンピュータのservice1サービスを開始できません
    エラー1053 そのサービスは指定時間内に開始要求または制御要求に応答しませんでした

    このエラーが出た場合、以下のことを実行してくださいとこのページで紹介がありました。

    1つ目はf5で更新してみて、エラーが出るかどうかの確認でしたが、開始中となったまま起動できません。

    2つ目は

    システムのイベント ログのソース "Service Control Manager" のエラーイベントが発生していないかご確認下さい。

    これはイベントログのどこを参照にするのでしょうか。詳細に教えてください。

    また、プログラムのコードとして、間違えているところがあるのでしょうか。windowsサービスは何かに向いていないプログラムと聞いたのですが、

    windowsサービスでは動作しないようなコードがあるのでしょうか。

    回答お願いします。

    2017年10月3日 8:47

回答

  • そんな感じです。

    WinFormでの制作経験があれば、Loadイベントで無限ループしなくてもアプリケーションは終了しないし、むしろ無限ループするといつまで経っても起動しない、というのと同じと考えると分かりやすいかと思います。

    2017年10月3日 10:12
  • 本筋については Hongliang さんが指摘されているので別件を。

    OnStart はインスタンスメソッドであり、それが呼び出される時点で Service1 のインスタンスはすでに生成されています。
    よって、その中で new Service1() とする必然性はなく、単に Addonkiller() と呼んだ方がシンプルになるでしょう。

    次に、これが大きな問題となると思いますが、そのサービスはログオンしているデスクトップとは別のセッションとなるので、MainWindow あたりの情報は取得できないのでは?と予想します。
    そのあたりは下記スレッドが似たようなことをやろうとしてできない旨の説明がなされていますので参考にしてください。
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=63061&KLOG=106

    2017年10月3日 12:50
    モデレータ

すべての返信

  • Windowsサービスでは、OnStartからさっさと処理を返す必要があります。

    サービスとして起動した場合、AddonKiller最後の無限ループがなくても、サービスは終了しないはずです。

    2017年10月3日 9:38
  • 回答ありがとうございます。

    for (; ; ) { }; //

    上の無限ループがあるとすぐに処理を返すことができないのでしょうか。

    無限ループはwindowsサービスの仕様として存在しており、不必要でまた、onstartの処理を素早く返すことができないので、

    for (; ; ) { }; //

    は消去するということでしょうか。

    2017年10月3日 10:06
  • そんな感じです。

    WinFormでの制作経験があれば、Loadイベントで無限ループしなくてもアプリケーションは終了しないし、むしろ無限ループするといつまで経っても起動しない、というのと同じと考えると分かりやすいかと思います。

    2017年10月3日 10:12
  • 本筋については Hongliang さんが指摘されているので別件を。

    OnStart はインスタンスメソッドであり、それが呼び出される時点で Service1 のインスタンスはすでに生成されています。
    よって、その中で new Service1() とする必然性はなく、単に Addonkiller() と呼んだ方がシンプルになるでしょう。

    次に、これが大きな問題となると思いますが、そのサービスはログオンしているデスクトップとは別のセッションとなるので、MainWindow あたりの情報は取得できないのでは?と予想します。
    そのあたりは下記スレッドが似たようなことをやろうとしてできない旨の説明がなされていますので参考にしてください。
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=63061&KLOG=106

    2017年10月3日 12:50
    モデレータ
  • 回答ありがとうございます。

    サービスは起動しましたが、azuleanさんの指摘した通り、firefoxのアドオンマネージャーを開いても

    全く反応がありませんでした。(コンソールアプリにしたときはちゃんと動作していました)

    参照リンクをみたのですが、

    windows APIを使用すれば、サービスでもちゃんとウィンドウ名を指定して閉じるといった動作が可能という結論であっているでしょうか。

    Win32 APIのFindWindowを使用した方法

    これをベースにしてwindowsサービスのonstartに入れてやれば、実現可能でしょうか。

    2017年10月7日 4:18
  • FindWindow は複雑な手順の中の一つの関数でしかありませんし、参照されているページの内容は今回の本質の問題を回避するものではないのですが、その辺りを読み解けないなら自作は諦めるべきです。

    (同じテーマを1ヶ月かけて、まだこの状態なら完成に年単位かかる覚悟が必要でしょう)

    2017年10月7日 5:10
    モデレータ
  • 関連スレッドを読む限り、趣味以外の必達的な印象を抱くのですが、いつまでにできないとダメみたいなものはないのですか?

    そういうものがあるのなら、最低限、サービスで達成しないといけないことを考え直した方がよいでしょう。すべてをサービスで再実装することが最適解とは限りません。

    2017年10月7日 8:10
    モデレータ
  • いちおう、一時的に解決する方法が思い浮かんだので、アドオンマネージャーを非表示にするwindowsサービスを作成しなくてもよくなりました。(firefoxで強力な拡張機能がありましたので)

    最終的なものはwindowsサービスが必要になるので、windowsサービスやwindowsAPIを勉強していこうかと思います。

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

    2017年10月8日 2:35